向后补零的举例
在很多项目中由于数据不同,在经过处理后数据的shape不一致。但在神经网络中的输入中需要保证batch中的每一条数据的shape相同才能训练,所以就会经常用到补零的方法,使得所有数据都有同样的shape,从而达到能够训练的目的。
利用tensor.narrow() .coupy_()
实现使数据shape一致
这是两条数据,一条shape为(3, 3),一条数据为(3, 4)。我们希望都变成(3, 4),从而组合成一个shape为(2, 3, 4)的数据。
import torch
# shape为(3, 3)
s1 =torch.tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# shape为(3, 4)
s2 = torch.tensor([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
t1 = []
t1.append(s1)
t1.append(s2)
# 获取每条数据中size(1)的数值
def fun(t):
return t.size(1)
# 获取所有数据中在size(1)上面最大的数据
longest_sample = max(t1, key=fun)
# 列和行的数值
longest_len = longest_sample.size(1)
longst_weight = longest_sample.size(0)
batch_size = len(t1)
一些输出
longest_sample
tensor([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
longest_len
4
longst_weight
3
batch_size
2
最后就是使用上面获得的数据进行操作了,解释一下narrow里面的参数,其中1
就是在dim=1
的方向上,选取索引从0
到t1[1].shape[1]
的数据粘贴到t2上
# t2就是最终我们想得到的shape, 这里就是(2, 3, 4),全为0
t2 = torch.zeros((batch_size, longst_weight, longest_len))
for i in range(batch_size):
t2[i].narrow(1, 0, t1[i].shape[1]).copy_(t1[i])
# 输出
# tensor([[[ 1., 2., 3., 0.],
# [ 4., 5., 6., 0.],
# [ 7., 8., 9., 0.]],
# [[ 1., 2., 3., 4.],
# [ 5., 6., 7., 8.],
# [ 9., 10., 11., 12.]]])