pytorch实现某一维度的数据扩充(repeat、reshape、resize、cat等的用法和区别)

场景:想要将一个维度为(a,5,c)的张量扩充至(a,22,c),要求扩充后的张量axis=1的前5行是原张量,剩余行是扩充的数字。即只扩充指定维的数据,没有搜到现成的做法,自己进行了以下尝试:

1、使用repeat()想将b变成和a同size的张量

import torch
a = torch.ones(2, 22, 3)
b = torch.zeros(2, 5, 3)
b1 = b.repeat(1, 22, 1)      
print(b1.size())  # (2,110,3)
# repeat是将指定维重复n次,n必须是整型int

事实证明repeat将指定维重复n次,且n必须是整型int,没办法满足我将axis=1的维从5变到12的想法

2、使用reshape()

import torch
a = torch.ones(2, 22, 3)
b = torch.zeros(2, 5, 3)
b1 = b.reshape(2, 22, 3)      #报错

报错,根据报错信息得知,reshape是将张量中的元素重新排列成要求的shape

比如原张量x(a,b,c),reshape之后的张量y(a1,b1,c1),要求a1*b1*c1=a*b*c,即必须满足原来的tensor和reshape的tensor元素个数相等,不能达到我的目的

3、使用resize_()

import torch
a = torch.ones(2, 22, 3)
b = torch.zeros(2, 5, 3)
b1 = b.resize_(2, 22, 3)      
print(b1.size())  # (2,22,3)

可以使用该方法扩充某一维的数据,但是我输出扩充后的数据如下,发现使用resize_()扩充某一维的数据,会将改维已有数据排在前面,剩余的坑用自带的插值计算出的数来占领,也就是将第1维原来的数据都挤到前面来了。但是我想要第1维的原有数据保持位置不变,其他多出来的坑位用0补齐。

x = torch.ones(2, 4, 2)
Y = torch.zeros(2, 2, 2)
y3=Y.resize_(2,4,2)
print(y3.size())  # (2,4,2)
print(y3)

4、最后用了最笨的cat方法,创建一个辅助的全o张量来与需要扩充的张量进行拼接,验证可得到想要的答案。

x = torch.ones(2, 4, 2)
Y = torch.ones(2, 2, 2)
y3= torch.zeros(2, 2, 2)
y4 = cat((Y,y3),1)  # 在第一维上进行cat拼接
print(y4.size())  # (2,4,2)
print(y4)

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值