总结pytorch语法
scatter_(input, dim, index, src)
>>> x = torch.rand(2, 5)
>>> x
0.4319 0.6500 0.4080 0.8760 0.2355
0.2609 0.4711 0.8486 0.8573 0.1029
[torch.FloatTensor of size 2x5]
LongTensor的shape刚好与x的shape对应,也就是LongTensor每个index指定x中一个数据的填充位置。dim=0,表示按行填充,主要理解按行填充。举例LongTensor中的第0行第2列index=2,表示在第2行(从0开始)进行填充填充,对应到zeros(3, 5)中就是位置(2,2)。所以此处要求zeros(3, 5)的列数要与x列数相同,而LongTensor中的index最大值应与zeros(3, 5)行数相一致,其于地方填0。
>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), x)
0.4319 0.4711 0.8486 0.8760 0.2355
0.0000 0.6500 0.0000 0.8573 0.0000
0.2609 0.0000 0.4080 0.0000 0.1029
[torch.FloatTensor of size 3x5]
同上理,可以把1.23看成[[1.23], [1.23]]。此处按列填充,LongTensor中的index=2对应zeros(2, 4)的(0,2)位置,其于地方填0。
>>> z = torch.zeros(2, 4).scatter_(1, torch.LongTensor([[2], [3]]), 1.23)
>>> z
0.0000 0.0000 1.2300 0.0000
0.0000 0.0000 0.0000 1.2300
[torch.FloatTensor of size 2x4]
zip
# >>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
torch.randn(*sizes, out=None)
返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。
torch.randn(2, 3)
0.5419 0.1594 -0.0413
-2.7937 0.9534 0.4561
[torch.FloatTensor of size 2x3]
torch.rand(*sizes, out=None)
返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义
torch.rand(2, 3)
0.0836 0.6151 0.6958
0.6998 0.2560 0.0139
[torch.FloatTensor of size 2x3]
register_buffer()
model.state_dict() 的返回对象是一个 OrderDict ,它以键值对的形式包含模型中需要保存下来的参数,例如:
class MyModule(nn.Module):
def __init__(self, input_size, output_size):
super(MyModule, self).__init__()
self.lin = nn.Linear(input_size, output_size)
def forward(self, x):
return self.lin(x)
module = MyModule(4, 2)
print(module.state_dict())
模型中的参数就是线性层的 weight 和 bias.
Parameter 和 buffer,一种是反向传播需要被optimizer更新的,称之为 parameter,一种是反向传播不需要被optimizer更新,称之为 buffer
第一种参数我们可以通过 model.parameters() 返回;第二种参数我们可以通过 model.buffers() 返回。因为我们的模型保存的是 state_dict 返回的 OrderDict,所以这两种参数不仅要满足是否需要被更新的要求,还需要被保存到OrderDict。
torch.bmm
计算两个tensor的矩阵乘法,torch.bmm(a,b),tensor a 的size为(b,h,w),tensor b的size为(b,w,h),注意两个tensor的维度必须为3.
>>> cc=torch.randn((2,2,5))
>>>print(cc)
tensor([[[ 1.4873, -0.7482, -0.6734, -0.9682, 1.2869],
[ 0.0550, -0.4461, -0.1102, -0.0797, -0.8349]],
[[-0.6872, 1.1920, -0.9732, 0.4580, 0.7901],
[ 0.3035, 0.2022, 0.8815, 0.9982, -1.1892]]])
>>>dd=torch.reshape(cc,(2,5,2))
>>> print(dd)
tensor([[[ 1.4873, -0.7482],
[-0.6734, -0.9682],
[ 1.2869, 0.0550],
[-0.4461, -0.1102],
[-0.0797, -0.8349]],
[[-0.6872, 1.1920],
[-0.9732, 0.4580],
[ 0.7901, 0.3035],
[ 0.2022, 0.8815],
[ 0.9982, -1.1892]]])
>>>e=torch.bmm(cc,dd)
>>> print(e)
tensor([[[ 2.1787, -1.3931],
[ 0.3425, 1.0906]],
[[-0.5754, -1.1045],
[-0.6941, 3.0161]]])
>>> e.size()
torch.Size([2, 2, 2])
masked_fill
mask中数值为1的位置在 tensor a 中相应的位置填充成了-1000000000, mask中数值为0的位置在tensor a 中填充-1000000000
>>> t = torch.randn(3,2)
>>> t
tensor([[-0.9180, -0.4654],
[ 0.9866, -1.3063],
[ 1.8359, 1.1607]])
>>> m = torch.randint(0,2,(3,2))
>>> m
tensor([[0, 1],
[1, 1],
[1, 0]])
>>> m == 0
tensor([[ True, False],
[False, False],
[False, True]])
>>> t.masked_fill(m == 0, -1e9)
tensor([[-1.0000e+09, -4.6544e-01],
[ 9.8660e-01, -1.3063e+00],