文章目录
张量
Tensor是pytorch中最基本的数据类型, 相当于numpy中的ndarray, 是具有追踪运算, 自动求导功能的多维数组.
1. 创建
x = torch.rand(5, 3) # 随机二维数组
x = torch.empty(5, 3) # 创建二维数组但不进行初始化
x = torch.zeros(5, 3) # 创建全零的二维数组
x = torch.tensor([1, 2, 3]) # 从list创建tensor
x = torch.from_numpy(np.array([1, 2, 3])) # 使用ndarray创建张量
# 从已有张量创建新张量, 新张量复用原有张量的未指定参数
x = x.new_ones(5, 3, dtype=torch.long)
x = torch.randn_like(x, dtype = torch.double) # reuse the size and override the type
2. 计算
张量加法:
x + y
torch.add(x, y)
y.add_(x) # 所有带_后缀的方法都是在原地修改张量
切片: 语法和numpy一致
修改shape: 使用x.view(dim1, dim2, ..)
使用-1
表示按照其他维度自适应
矩阵乘: 使用torch.mm(tensor1, tensor2)
计算矩阵乘
矩阵转置: 二维矩阵的转置torch.Tensor.t()
高维矩阵的转置: torch.Tensor.transpose(dim1, dim2, dim3, ...)
, dim是原矩阵的维度index
元素点乘: 使用troch.mul(tensor1, tensor2)
计算元素范围的乘法
numpy桥梁: 对张量使用x.numpy()
获得张量对应的np.ndarray, 二者共享底层的数据, 即修改该array能够直接修改tensor的数据
获取值: 对于只含有一个元素的tensor, 可以使用x.item()
获得数值, 对于含有多个元素的tensor, 使用x. tolist()
.
3. 使用gpu计算
在使用GPU计算前, 需要将训练集, 标签, 模型都转入到GPU中, 对于tensor, 使用x.to(device)
转移到对应的设备中.
4. 其他常用方法
torch.Tensor.expand(*size):
expand函数对tensor按照size进行扩展, 这种扩展不会增加内存, 也就是说, 他们是指向的同一对象, 修改其中任意一个会修改全部. size与原tensor.size()的关系, size能够在原tensor的size为1的维扩展, 其他维保持不变, 也可以使用-1
代替其他维的shape, 但是不能够不一致. 可以直接扩展为更高的维, 更高的维一定在现有维之前.
*size是解序列, 这里例如传入一个list, *list将list解析为它的所有元素
In [42]: a = torch.tensor([1, 2, 3, 4])
In [43]: a.unsqueeze(1).expand(4, 2) # (4,1)->(4,2)
Out[43]:
tensor([[1, 1],
[2, 2],
[3, 3],
[4, 4]])
In [45]: a.unsqueeze(1).expand(-1, 2) #(4,1) - (-1, 2) -> (4, 2)
Out[45]:
tensor([[1, 1],
[2, 2],
[3, 3],
[4, 4]])
a.unsqueeze(1).expand(5, -1, 2) #(4,1) -> (5, 4, 2)
a.unsqueeze(1).expand(-1, 2, 5) # 报错, 高维在前
a.unsqueeze(1).expand(3, 2) # 报错, size不为1的dim的size, 4和3不能够对应
torch.Tensor.repeat(*size)
和expand的功能类似, 但是是对原tensor的复制, 而不是引用. 参数是每个维度的重复次数.
In [5]: a = torch.tensor([1, 2, 3, 4])
In [6