PyTorch中如何将[1,20]张量重复堆叠得到形状为[2,20]的张量?
PyTorch实现张量堆叠扩展的内置方法
你需要的功能PyTorch有多个内置API可以直接实现,不需要自己写循环,以下是最常用的三种方案:
方案1:torch.repeat()(最通用,适合需要修改扩展后张量的场景)
repeat会真实复制张量数据,返回独立的连续张量,修改扩展后的结果不会影响原始张量:
import torch # 初始形状为[1, 20]的位置序列 pos = torch.arange(20).unsqueeze(0) # 沿第0维复制2次,第1维保持不变,输出形状[2, 20] expanded_pos = pos.repeat(2, 1)
如果需要和输入序列的batch size自动对齐,可以直接用输入的形状参数,不用写死数值:
input_seq = torch.randn(2, 20) # 你的输入序列 expanded_pos = pos.repeat(input_seq.shape[0], 1)
方案2:torch.expand()(只读场景更高效)
如果扩展后的张量不需要修改元素值,用expand更节省内存,它只会创建张量视图,不会真实复制数据:
# -1表示对应维度保持原始大小,无需手动指定长度 expanded_pos = pos.expand(input_seq.shape[0], -1)
注意:修改
expand生成的张量会同时修改所有复制出来的切片,且返回的张量默认不是连续内存排布,如果后续需要调用要求连续内存的API(比如view),需要手动调用.contiguous()。
方案3:torch.tile()(对齐Numpy接口)
PyTorch 1.8及以上版本支持该API,功能和repeat基本一致,参数传入元组即可:
expanded_pos = pos.tile((input_seq.shape[0], 1))
三种方案最终输出的结果完全符合你要求的格式,你可以根据自己的使用场景选择。
内容的提问来源于stack exchange,提问作者Arneo
相关产品推荐
相关产品推荐

