Pytorch和深度学习 张量的基本操作导入库importtorch2.3 基本张量的创建​​​​​​​​Tensor张量是 PyTorch 的核心数据结构。张量在不同学科中有不同的意义在深度学习中张量表示一个多维数组是标量、向量、矩阵的拓展。如一个 RGB 图像的数组就是一个三维张量第 1 维是图像的高第 2 维是图像的宽第 3 维是图像的颜色通道。重点需要掌握的点创建指定形状的张量查看张量的类型2.3.1 基本张量创建1)torch.tensor(data)创建指定内容的张量importtorchimportnumpyasnp# 创建标量张量tensor1torch.tensor(10)print(tensor1)# 使用列表创建张量tensor2torch.tensor([1,2,3])print(tensor2)# 使用 numpy 创建张量tensor3torch.tensor(np.array([[1,2,3],[4,5,6],[7,8,9]]))print(tensor3)2)torch.Tensor(size)创建指定形状的张量importtorch# 创建指定形状的张量默认类型为 float32tensor1torch.Tensor(3,2,4)print(tensor1)print(tensor1.dtype)# 也可以用来创建指定内容的张量tensor2torch.Tensor([[1,2,3,4],[5,6,7,8]])print(tensor2)3) 创建指定类型的张量可通过torch.IntTensor()、torch.FloatTensor()等创建。或在torch.tensor()中通过dtype参数指定类型。importtorch# 创建 int32 类型的张量tensor1torch.IntTensor(2,3)tensor2torch.tensor([1,2,3],dtypetorch.int32)print(tensor1)print(tensor2)# 元素类型不匹配则会进行类型转换tensor1torch.IntTensor([1.1,2.2,3.6])tensor2torch.tensor([3.1,2.2,1.6],dtypetorch.int32)print(tensor1)print(tensor2)# 创建 int64 类型的张量tensor1torch.LongTensor([1,2,3])tensor2torch.tensor([1,2,3],dtypetorch.int64)print(tensor1,tensor1.dtype)print(tensor2,tensor1.dtype)# 创建 int16 类型的张量tensor1torch.ShortTensor(2,2)tensor2torch.tensor([1,2,3],dtypetorch.int16)print(tensor1,tensor1.dtype)print(tensor2,tensor1.dtype)# 创建 float32 类型的张量tensor1torch.FloatTensor([9,8,7])tensor2torch.tensor([1,2,3],dtypetorch.float32)print(tensor1,tensor1.dtype)print(tensor2,tensor1.dtype)# 创建 float64 类型的张量tensor1torch.DoubleTensor(2,3,1)tensor2torch.tensor([1,2,3],dtypetorch.float64)print(tensor1)print(tensor2)2.3.2 指定区间的张量创建1)torch.arange(start, end, step)在区间内按步长创建张量importtorch# torch.arange(start, end, step) 在区间[start,end)中创建步长为 step 的张量tensor1torch.arange(10,30,2)print(tensor1)# torch.arange(end) 创建区间为[0,end)步长为 1 的张量tensor2torch.arange(6)print(tensor2)2)torch.linspace(start, end, steps)在区间内按元素数量创建张量importtorch# torch.linspace(start, end, steps) 在区间按元素数量创建张量tensor1torch.linspace(10,30,5)print(tensor1)3)torch.logspace(start, end, steps, base)在指数区间内按指定底数创建张量importtorch# torch.logspace(start, end, steps, base) 在区间[start,end]之间生成 steps 个数并以 base 为底区间内的数为指数创建张量tensor1torch.logspace(1,3,3,2)print(tensor1)2.3.3 按数值填充张量torch.zeros(size)创建指定形状的全 0 张量torch.ones(size)创建指定形状的全 1 张量torch.full(size, value)创建指定形状的按指定值填充的张量torch.empty(size)创建指定形状的未初始化的张量torch.zeros_like(input)创建与给定张量形状相同的全 0 张量torch.ones_like(input)创建与给定张量形状相同的全 1 张量torch.full_like(input, value)创建与给定张量形状相同的按指定值填充的张量torch.empty_like(input)创建与给定张量形状相同的未初始化的张量importtorch# torch.zeros(size) 创建指定形状的全 0 张量tensor1torch.zeros(2,3)print(tensor1)# torch.ones_like(input) 创建与给定张量形状相同的全 1 张量tensor2torch.ones_like(tensor1)print(tensor2)# torch.full(size, fill_value) 创建指定形状的按指定值填充的张量tensor1torch.full((2,3),6)print(tensor1)# torch.empty_like(input) 创建与给定张量形状相同的未初始化的张量tensor2torch.empty_like(tensor3)print(tensor2)# torch.eye(n, [m]) 创建单位矩阵importtorch# torch.eye(n) 创建 n*n 的单位矩阵tensor1torch.eye(3)print(tensor1)# torch.eye(n, m) 创建指定的行和列创建tensor2torch.eye(3,4)print(tensor2)2.3.4 随机张量创建torch.rand(size)创建在[0,1)上均匀分布的指定形状的张量torch.randint(low, high, size)创建在[low,high)上均匀分布的指定形状的张量torch.randn(size)创建标准正态分布的指定形状的张量torch.normal(mean, std, size)创建自定义正态分布的指定形状的张量。mean 为均值std 为标准差torch.rand_like(input)创建在[0,1)上均匀分布的与给定张量形状相同的张量torch.randint_like(input, low, high)创建在[low,high)上均匀分布的与给定张量形状相同的张量torch.randn_like(input)创建标准正态分布的与给定张量形状相同的张量torch.randperm(n)生成从 0 到 n-1 的随机排列类似洗牌importtorch# torch.rand(size) 创建在[0,1)上均匀分布的指定形状的张量tensor1torch.rand(2,3)print(tensor1)# torch.rand_like(input) 创建在[0,1)上均匀分布的与给定张量形状相同的张量tensor2torch.rand_like(tensor1)print(tensor2)# torch.randn(size) 创建标准正态分布的指定形状的张量tensor1torch.randn(4,2)print(tensor1)# torch.normal(mean, std, size) 创建自定义正态分布的指定形状的张量。mean 为均值std 为标准差tensor2torch.normal(5,1,tensor1.shape)print(tensor2)# torch.randperm(n) 生成从 0 到 n-1 的随机排列importtorch tensor1torch.randperm(10)print(tensor1)# 查看随机数种子print(torch.random.initial_seed())# 设置随机数种子torch.manual_seed(42)print(torch.random.initial_seed())2.4 张量转换2.4.1 张量元素类型转换1)Tensor.type(dtype)修改张量的类型importtorch tensor1torch.tensor([1,2,3])print(tensor1,tensor1.dtype)# 使用 type 方法修改张量的类型tensor1tensor1.type(torch.float32)print(tensor1,tensor1.dtype)2)Tensor.double()等修改张量的类型importtorch tensor1torch.tensor([1,2,3])print(tensor1,tensor1.dtype)# 使用 double 方法修改张量的类型tensor1tensor1.double()print(tensor1)# 使用 long 方法修改张量的类型tensor1tensor1.long()print(tensor1,tensor1.dtype)2.4.2 Tensor 与 ndarray 转换1)Tensor.numpy()将 Tensor 转换为 ndarray共享内存。使用 copy() 避免共享内存importtorch# 使用 numpy() 方法将 Tensor 转换为 ndarray共享内存tensor1torch.rand(3,2)numpy_arraytensor1.numpy()print(tensor1)print(numpy_array)print(type(tensor1),type(numpy_array))张量数值运算广播操作在进行深度学习或数据分析时我们经常需要对张量Tensor或数组进行加减乘除运算。最理想的情况是两个矩阵形状完全一致比如都是3×33 \times 33×3这样可以直接**逐元素Element-wise**计算。但在实际场景中我们经常会遇到形状不一致的情况。例如你想给一个3×33 \times 33×3的矩阵每一行都加上同一个向量[1, 2, 3]。这时候广播机制Broadcasting就登场了要判断两个数组能否进行广播运算必须遵循以下规则从后往前比对齐将两个数组的形状Shape向右对齐。兼容条件在每一个维度上两个数组的大小必须满足以下任一条件大小相等。其中一个大小为1。其中一个数组在该维度缺失即维度数较少。如果某个维度上两个数字既不相等也没有一个是 1那么广播失败报错成功和失败情况代码实现importnumpyasnp# 定义 a: 3行1列 (3, 1)anp.array([[0],[1],[2]])# 定义 b: 1行2列 (1, 2)bnp.array([[0,1]])print(fa 的形状:{a.shape})# (3, 1)print(fb 的形状:{b.shape})# (1, 2)# 执行加法resultabprint(f结果的形状:{result.shape})# (3, 2)print(结果:\n,result)