2. PyTorch框架
学习目标1.掌握张量创建方法2.知道线性和随机张量的创建方法3.知道0-1张量的创建方法:4.知道张量元素类型的转换方法1. PyTorch的特点① 类似 NumPy 的张量计算PyTorch 提供了与 NumPy 类似的张量操作接口便于进行高效的数值计算。② 自动微分Autograd自动微分机制能够自动计算张量的梯度无需手动推导导数公式。它通常与反向传播Back Propagation, BP算法结合使用用于优化模型参数在前向传播中计算预测结果和损失值然后通过反向传播计算损失函数对各参数的梯度并利用梯度下降等优化算法更新权重。经过多次迭代训练模型的拟合能力会逐步提升。③ 动态计算图Dynamic Computational GraphPyTorch 采用动态图机制计算图在代码执行过程中动态构建可以更灵活地调整模型结构这与 TensorFlow 早期静态图模式先定义后执行形成对比。2. 张量2.1 什么是张量标量是一个值的、向量可理解为一个列表、矢量是多维的[3, 4, 5]表示3个4行5列的三维矩阵[3, 32, 32]表示3个32行32列的三维矩阵这就是图片的表示方法前面说的 HWC [32, 32, 3]但是在处理的时候叫 CHW [3, 32, 32]交换维度三维可以累积成四维所以在整个 PyTorch中已经没有 0维、1维、2维的概念取而代之的是 张量张量中有一个标量张量指的是只有一个值的张量称之为标量张量2.2 张量的创建方式2.2.1 创建张量tensor中t小写和大写创建张量的区别小写是基于指定数据来创建大写则根据形状创建张量小写能做的大写都能做大写还多了个根据形状创建张量第3中创建指定类型张量 案例 演示张量的基本创建方式。 张量: PyTorch框架属于 最常用的深度学习框架无论是后续要学的ANN(人工神经网络)还是CNN(卷积神经网络)RNN(循环神经网络) 底层在处理数据时都是使用 张量 来处理的 张量 --》存储同一类型元素的容器且元素值必须是数值才可以 张量的基本创建方式 torch.tensor 根据指定数据创建张量. torch.Tensor 根据形状创建张量其也可用来创建指定数据的张量 torch.IntTensor. torch.FloatTensor. torch.DoubleTensor 创建指定类型的张量 # 细节Tensor 相比 tensor可直接基于形状创建张量 # 导包importtorchimportnumpyasnp;# 1.定义函数演示torch.tensor 根据指定数据创建张量.defdemo01():# 场景1标量 张量t1torch.tensor(10)# 类型获取t1.type()/ type(t1)print(ft1{t1}, type:{t1.type()})# t110, type:torch.LongTensor# 场景2二维列表 --》 张量data[[1,2,3],[4,5,6]]# 2行3列的值t2torch.tensor(data)print(ft2{t2}, type:{type(t2)})# t2tensor([[1, 2, 3], [4, 5, 6]]), type:class torch.Tensor# 场景3numpy中的nd数组 --》张量# data np.array([[1, 2, 3], [4, 5, 6]])datanp.random.randint(0,10,size(2,3))# 2行3列的值t3torch.tensor(data)# dtypetorch.int32 int类型print(ft3{t3}, type:{type(t3)})# t3tensor([[6, 3, 9], [0, 5, 0]], dtypetorch.int32), type:class torch.Tensor# torch.tensor 可指定类型创建t3torch.tensor(data,dtypetorch.float)# dtypetorch.float float类型print(ft3{t3}, type:{type(t3)})# t3tensor([[6., 3., 9.], [0., 5., 0.]]), type:class torch.Tensor# 场景4尝试直接创建 指定维度(如2行3列)的张量# t4 torch.tensor(2, 3) # 报错# print(ft4{t4}, type:{type(t4)})# 2.定义函数演示torch.Tensor 根据形状创建张量其也可用来创建指定数据的张量defdemo02():# 场景1标量 张量t1torch.Tensor(10)# 类型获取t1.type()/ type(t1)print(ft1{t1}, type:{t1.type()})# t110, type:torch.LongTensor# 场景2二维列表 --》 张量data[[1,2,3],[4,5,6]]# 2行3列的值t2torch.Tensor(data)print(ft2{t2}, type:{type(t2)})# t2tensor([[1, 2, 3], [4, 5, 6]]), type:class torch.Tensor# 场景3numpy中的nd数组 --》张量# data np.array([[1, 2, 3], [4, 5, 6]])datanp.random.randint(0,10,size(2,3))# 2行3列的值t3torch.Tensor(data)# dtypetorch.int32 int类型print(ft3{t3}, type:{type(t3)})# t3tensor([[6, 3, 9], [0, 5, 0]], dtypetorch.int32), type:class torch.Tensor# 场景4尝试直接创建 指定维度(如2行3列)的张量t4torch.Tensor(2,3)print(ft4{t4}, type:{type(t4)})# 3.定义函数演示torch.IntTensor. torch.FloatTensor. torch.DoubleTensor 创建指定类型的张量defdemo03():# 场景1标量 张量t1torch.IntTensor(10)# 类型获取t1.type()/ type(t1)print(ft1{t1}, type:{t1.type()})# t110, type:torch.LongTensor# 场景2二维列表 --》 张量data[[1,2,3],[4,5,6]]# 2行3列的值t2torch.IntTensor(data)print(ft2{t2}, type:{type(t2)})# t2tensor([[1, 2, 3], [4, 5, 6]]), type:class torch.Tensor# 场景3numpy中的nd数组 --》张量# data np.array([[1, 2, 3], [4, 5, 6]])datanp.random.randint(0,10,size(2,3))# 2行3列的值# torch.tensor 可指定类型创建t3torch.IntTensor(data)print(ft3{t3}, type:{type(t3)})# 场景4如果类型不匹配会尝试自动转换类型datanp.random.randint(0,10,size(2,3))# 2行3列的值t4torch.FloatTensor(data)# 默认float32print(ft4{t4}, type:{type(t4)})# 4.定义测试函数if__name____main__:demo01()# 掌握# demo02()# demo03()2.2.2 创建全0、1、指定值张量 案例 演示创建全0、1、指定值张量。 涉及到的函数如下: torch.ones 和 torch.ones_like 创建全1张量. torch.zeros 和 torch.zeros_like 创建全0张量. torch.full 和 torch.full_like 创建全为指定值的张量 需要掌握的函数 zeros(), full() # 导包importtorch# 场景1torch.ones 和 torch.ones_like 创建全1张量.t1torch.ones(2,3)# 创还能2行3类全1张量print(ft1{t1}, type:{type(t1)})# t2: 3行2列t2torch.tensor([[1,2],[3,4],[5,6]])print(ft2{t2}, type:{type(t2)})# t3-- 基于t2的形状创建全1张量t3torch.ones_like(t2)print(ft3{t3}, type:{type(t3)})# 3行2列的全1张量# 场景2torch.zeros 和 torch.zeros_like 创建全0张量.t3torch.zeros(2,3)# 创还能2行3类全0张量print(ft3{t3}, type:{type(t3)})# t4: 3行2列t4torch.tensor([[1,2],[3,4],[5,6]])print(ft4{t4}, type:{type(t4)})# t5-- 基于t4的形状创建全1张量t5torch.zeros_like(t4)print(ft5{t5}, type:{type(t5)})# 3行2列的全0张量# 场景3torch.full 和 torch.full_like 创建全为指定值的张量.t7torch.full(size(2,3),fill_value255)# 创还能2行3类全255张量print(ft7{t7}, type:{type(t7)})# t8 3行2列t8torch.tensor([[1,2],[3,4],[5,6]])print(ft8{t8}, type:{type(t8)})# t9-- 基于t8的形状创建全1张量t9torch.full_like(t8,255)print(ft9{t9}, type:{type(t9)})# 3行2列的全255张量2.2.3 创建线性和随机张量torch.initial_seed()默认采用当前系统的时间戳作为随机种子会随着时间变化而改变torch.manual_seed(3)设置随机种子值是固定的且一次设置全局生效torch.arange(start0, end10, step2)创建指定范围的线性张量参1起始值参2结束值参3步长[0,10)区间间隔2包左不包右torch.linspace(start1, end10, steps4)创建指定范围的线性张量 -- 等差数列参1起始值参2结束值参3元素个数[1,10]区间4个元素的等差数列包左包右torch.rand(size(2, 3))创建(0,1)之间均匀分布的随机张量torch.randn(size(2, 3))创建均值为0、标准差为1的正态分布的随机张量t3 torch.randint(low0, high10, size(2, 3))创建指定范围的整数的随机张量0~10区间2行3列的整数 案例 演示创建PyTorch中如何创建 线性和 随机张量 涉及到的函数如下: torch.arange() 和 torch.linspace() 创建线性张量. torch.random.initial_seed 和 torch.random.manual_seed() 创建随机张量. torch.rand/ randn() 创建随机浮点类型张量 torch.ranint(low, high, size()) 创建随机整数类型张量 需要掌握的函数 arange(), linspace(), manual_seed(), ranint() # 导包importtorch# 1.定义函数演示创建线性张量.defdemo01():# 场景:1创建指定范围的线性张量# 参1起始值参2结束值参3步长[0,10)区间间隔2包左不包右t1torch.arange(start0,end10,step2)print(ft1{t1}, type:{type(t1)})# t1tensor([0, 2, 4, 6, 8]), type:class torch.Tensor# 场景2创建指定范围的线性张量 -- 等差数列# 参1起始值参2结束值参3元素个数[1,10]区间4个数的等差数列包左包右t2torch.linspace(start1,end10,steps4)print(ft2{t2}, type:{type(t2)})# t2tensor([ 1., 4., 7., 10.]), type:class torch.Tensor# 2.定义函数演示创建随机张量.defdemo02():# step1设置随机种子# torch.initial_seed() # 默认采用当前系统的时间戳作为随机种子torch.manual_seed(3)# 设置随机种子# step2创建随机张量# 场景1均匀分布的(0,1)随机张量t1torch.rand(size(2,3))#创建一个2行3列的随机矩阵print(ft1{t1}, type:{type(t1)})# 场景2符合正态分布的随机张量t2torch.randn(size(2,3))print(ft2{t2}, type:{type(t2)})# 场景3创建随机整数张量# 0~10区间2行3列的整数t3torch.randint(low0,high10,size(2,3))print(ft3{t3}, type:{type(t3)})# 3.测试函数if__name____main__:# demo01()demo02()2.2.4 张量元素类型转换小数默认类型是float32整数默认类型是int64short - - int16、int - - int32、long - - int64half - - float16、float- - float32、double- - float64 案例 创建指定类型张量 涉及到的函数如下: type(torch支持的数据类型) half()/ double()/ float()/ short()/ int()/ long() 需要掌握的函数 type() # 导包importtorch# 场景1直接创建指定类型的张量t1torch.tensor([1,2,3,4,5],dtypetorch.float)# 默认是float32print(ft1{t1}, (元素)类型:{t1.dtype}, (张量)类型:{type(t1)})# 场景2创建好张量后--》做类型转换# 思路1type()函数推荐掌握t2t1.type(torch.int16)print(ft2{t2}, (元素)类型:{t2.dtype}, (张量)类型:{type(t2)})# 思路2half()/ double()/ float()/ short()/ int()/ long()print(t2.half())# float16print(t2.float())# float32默认print(t2.double())# float64print(t2.short())# int16print(t2.int())# int32print(t2.long())# int64默认# 结果# tensor([1., 2., 3., 4., 5.], dtypetorch.float16)# tensor([1., 2., 3., 4., 5.])# tensor([1., 2., 3., 4., 5.], dtypetorch.float64)# tensor([1, 2, 3, 4, 5], dtypetorch.int16)# tensor([1, 2, 3, 4, 5], dtypetorch.int32)# tensor([1, 2, 3, 4, 5])