Tensors(张量)
Tensors张量,与numpy中的ndarray类似,但是在pytorch中,Tensors可以使用GPU进行计算,张量的话可以默认记录计算轨迹,从而方便求导。
torch_1 = torch.eye(4,4)#创建一个4乘4维的张量
torch_2 = torch.zeros(4,4)#创建一个4乘4的全零张量
torch_3 = torch.arange(16).reshape(2,2,-1)#定义一个范围0~15,然后修改维度第一维度有两个,第二维度为2,第三维度-1:自动填充
print(torch_1)
print(torch_2)
print(torch_3)
print(torch_1.shape)
print(torch_2.size())
输出:
print(torch_1[2])#第一维度中的第二个
print(torch_1[:,1])#第一维度全取,第二维度取1
print(torch_3[:,1,:-1])#第一维度全取,第二维度取1,其三维度取到倒数索引为1 的位置
torch_4 = torch.arange(2).reshape(2,)
torch_5 = torch.arange(2).reshape(2,1)
torch_6 = torch.arange(2).reshape(1,2)
解决形状不一致的时候的操作运算
判断是否可以进行广播:
从右往左,只看短的,看是具体的数字否相同或者是否其中一个为1
比如:
(2,3,4)和(1,1,4)————>可以进行广播
(3,4)和(2,1,4)可以
(2,3,4)和(1,2,4)不可以
广播方式:
(3,4)和(1,1,4)————>从左边补齐维度(1,3,4)(1,1,4)————>再看数字,实际上就是从右往左看,只看看短的————>可以
广播以后,就可以进行运算操作:
torch_11 = torch.arange(24).reshape(2,3,4)
torch_12 = torch.arange(4).reshape(1,1,4)
print(torch_11+torch_12)#相同维度上的元素进行相加
"""2"""
torch_21 = torch.arange(24).reshape(2,3,4)
torch_22 = torch.arange(8).reshape(1,2,4)
print(torch_22+torch_21)
arr = np.array([[1,2,3],[4,5,6]])
torch_7 = torch.from_numpy(arr)
print(arr,'\n',torch_7)
张量的拼接,非常常用,很重要
torch_8 = torch.arange(8).reshape(2,2,2)
torch_9 = torch.arange(12).reshape(3,2,2)
torch_cat = torch.cat((torch_8,torch_9),0)#拼接第0轴
print(torch_8,'\n',torch_9,'\n',torch_cat)
也很重要,
torch.squeeze 压缩维度,把维度为1 的去掉
torch_squeeze = torch.squeeze(torch_12)#shape(1,1,4)去掉为1的维度
print('torch_squeeze.shape',torch_squeeze.shape)
torch.unsqueeze 增加维度
第一个参数:操作的对象
第二个参数:增加维度的位置——>第几个轴
torch_unsqueeze = torch.unsqueeze(torch_squeeze,1)
print('torch_unsqueeze.shape',torch_unsqueeze.shape)
应用场景:预测的时候使用因为训练的时候是4维的数据(batchsize, c, h,w),预测的时候通过增加一个维度,将图片进行变化(c,h,w)- (1,c,h,w)使得预测数据和训练数据的维度保持一致
重构张量
print(torch_8.shape)
torch_view = torch_8.view(-1)#torch_8.shape = (2,2,2)
重构成1维,等价于
torch_reshape = torch_8.reshape(-1)
print('torch_view',torch_view)
print('torch_reshape',torch_reshape)