张量的运算是深度学习的基本操作,深度学习框架的重要功能之一就是支持张量的定义与运算。
数据 | pytorch类型 | CPU上的张量 | GPU上的张量 |
---|---|---|---|
32位浮点数 | torch.float32 torch.float |
torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点数 | torch.float64 torch.double |
torch.DoubleTensor | torch.cuda.DoubleTensor |
16位浮点数 | torch.float16 torch.half |
torch.HalfTensor | torch.cuda.HalfTensor |
8位无符号整数 | torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
8位带符号整数 | torch.int8 | torch.CharTensor | torch.cuda.CharTensor |
16位带符号整数 | torch.int16 torch.short |
torch.ShortTensor | torch.cuda.ShortTensor |
32位带符号整数 | torch.int32 torch.int |
torch.IntTensor | torch.cuda.IntTensor |
64位带符号整数 | torch.int64 torch.long |
torch.LongTensor | torch.cuda.LongTensor |
布尔型 | rorch.bool | torch.BoolTensor | torch.cuda.BoolTensor |
t = torch.tensor([1, 2, 3, 4], dtype=torch.float32) # 列表转张量并指定张量数据类型
print(t)
print(t.dtype) # 张量类型
arr = np.array([1, 2, 3, 4])
t = torch.tensor(t)
print(t)
print(t.dtype)
该方法类似于numpy中的array方法,可以指定数据类型。例子如2.1所示。
同样类似于numpy中的数据创建,可以指定张量形状或数据类型。
t1 = torch.rand(3, 3) # 生成3x3的举证,矩阵元素服从[0, 1)上的均匀分布
print(t1)
print('=' * 50)
t2 = torch.randn(2, 3, 4) # 生成2x3x4的张量,张量元素服从标准正太分布
print(t2)
print('=' * 50)
t3 = torch.zeros(2, 3) # 生成2x3的张量,张量元素全为0
print(t3)
print('=' * 50)
t4 = torch.ones(2, 2) # 生成2x2的张量,张量元素全为1
print(t4)
print('=' * 50)
t5 = torch.eye(2, 2) # 生成2x2的单位矩阵
print(t5)
print('=' * 50)
t6 = torch.randint(0, 100, (3, 3)) # 生成0-100之间的均匀分布整数的3x3矩阵
print(t6)
形状相同,但元素可能不一样。
t = torch.randn(3, 3) # 生成一个随机正态分布的张量t
print(t)
t_like = torch.zeros_like(t) # 生成一个元素全为0的张量,形状和给定张量t相同
print(t_like)
已知张量的数据类型,创建一个形状不同但数据类型相同的新张量。此方法较少使用
t = torch.rand(1, 3) # 生成一个随机正态分布的张量t
print(t)
t_new = t.new_zeros(3, 3) # 生成相同类型且元素全为0的张量
print(t_new)
pytorch张量形状相关的一些函数。
t = torch.randn(3, 4, 5) # 产生一个3x4x5的张量
print(t.ndimension()) # 获取维度的数目
print(t.nelement()) # 获取张量的总元素数目
print(t.size()) # 获取每个维度的大小,调用方法
print(t.shape) # 获取张量每个维度的大小,访问属性
print('=' * 50)
t2 = torch.randn(12)
print(t2.view(3, 4)) # 改变向量形状为3x4的矩阵
print(t2.view(-1, 3)) # -1表示pytorch自动计算维度的具体值
print(t2.data_ptr()) # 获取张量的数据指针
print(t2.view(3, 4).transpose(0, 1).data_ptr()) # 交换两个维度的步长
print(t2.view(3, 4).transpose(0, 1).contiguous().data_ptr()) # 步长和维度不兼容,重新生成张量
pytorch张量支持类似numpy的索引(Indexing)和切片(Slicing)操作。
t = torch.randn(3, 4, 5)
print(t)
print(t[1, 2, 3]) # 取张量在0维1号、1维2号和2维3号的元素(编号从0开始)
print(t[:, 1:-1, 2:4]) # :表示取所有,-1表示取最后一个元素
t[1, 2, 3] = 0.9999 # 直接更改张量的元素值
print(t > 0) # 张量大于0部分的掩码
print(t[t>0]) # 根据掩码选出张量的元素,选出的是一个向量