利用tensor.narrow().copy_()向后补零

向后补零的举例

在很多项目中由于数据不同,在经过处理后数据的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的方向上,选取索引从0t1[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.]]])
  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值