torch api总结
总结一些常用的api,以防忘记。
完整api链接地址:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/
torch 包含了多维张量的数据结构以及基于其上的多种数学操作。另外,它也提供了多种工具,其中一些可以更有效地对张量和任意类型进行序列化。
torch创建相关
# 1. 返回一个2维张量,对角线位置全1,其它位置全0
# torch.eye(n, m=None, out=None)
torch.eye(3)
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# 2. 将numpy.ndarray 转换为pytorch的 Tensor。
# 返回的张量tensor和numpy的ndarray共享同一内存空间。
# 修改一个会导致另外一个也被修改。返回的张量不能改变大小。
# torch.from_numpy(ndarray) → Tensor
a = np.array([1,1,1,1])
a
array([1, 1, 1, 1])
b = torch.from_numpy(a)
b
tensor([1, 1, 1, 1])
# 3. 返回一个1维张量,包含在区间start 和 end 上均匀间隔的steps个点。 输出1维张量的长度为steps。
# torch.linspace(start, end, steps=100, out=None) → Tensor
torch.linspace(0,100,11)
tensor([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.])
# 4. 其他常见的api
torch.ones(2,2)
tensor([[1., 1.],
[1., 1.]])
# rand和randn分别是服从均匀分布、标准正态分布。
torch.randn(2,2)
tensor([[ 2.0120, -0.8677],
[-2.7664, -0.0545]])
torch.rand(2,2)
tensor([[0.1918, 0.3749],
[0.0534, 0.0704]])
torch 索引,切片,连接,换位
# 矩阵拼接
# torch.cat(inputs, dimension=0) → Tensor
x=torch.rand(2,2)
x
tensor([[0.7937, 0.9239],
[0.5410, 0.9292]])
torch.cat((x,x),0)
tensor([[0.7937, 0.9239],
[0.5410, 0.9292],
[0.7937, 0.9239],
[0.5410, 0.9292]])
a = torch.cat((x,x),1)
tensor([[0.7937, 0.9239, 0.7937, 0.9239],
[0.5410, 0.9292, 0.5410, 0.9292]])
# 接上一个例子
# squeeze 将输入张量形状中的1 去除并返回。 如果输入是形如(A×1×B×1×C×1×D),那么输出形状就为: (A×B×C×D)
# unsqueeze 和squeeze相反,dim不传的话,
# torch.squeeze(input, dim=None, out=None)
# torch.unsqueeze(input, dim=None, out=None)
torch.unsqueeze(a, 0)
tensor([[[0.7937, 0.9239, 0.7937, 0.9239],
[0.5410, 0.9292, 0.5410, 0.9292]]])
torch.squeeze(a, 0)
tensor([[0.7937, 0.9239, 0.7937, 0.9239],
[0.5410, 0.9292, 0.5410, 0.9292]])
# 转置
# torch.transpose(input, dim0, dim1, out=None) → Tensor
x
tensor([[0.7937, 0.9239],
[0.5410, 0.9292]])
x.t()
tensor([[0.7937, 0.5410],
[0.9239, 0.9292]])
torch序列化
# torch 保存到文件
torch.save(obj, f)
# torch 从文件读取
>>> torch.load('tensors.pt')
# Load all tensors onto the CPU
>>> torch.load('tensors.pt', map_location=lambda storage, loc: storage)
# Map tensors from GPU 1 to GPU 0
>>> torch.load('tensors.pt', map_location={'cuda:1':'cuda:0'})
torch 数学操作
# masked_fill 覆盖指定位置的值
a = torch.tensor([3,10,10])
a.masked_fill(mask=torch.ByteTensor([1,1,1]),value=torch.tensor(-1e9))
tensor([-1000000000, -1000000000, -1000000000])
# matmul 矩阵乘法
# [2,3]*[3*4]=[2,4] [2,3,4]*[4,5]=[2,3,5]
# [1,2,3,4]*[2,4,5] = [1,2,3,5]
# 维度不相等,第一维广播;维度太长,从最后两维开始计算,前面对齐
# 实在不行就自己执行下看看效果
c = torch.matmul(a,b)
# bmm 3维矩阵乘法 [2,3,4]*[2,4,3] = [2,3,3]
b = torch.bmm(a,a)