PyTorch技术问询:如何扩展张量维度并追加元素(从[1,2,3]到[[1,2,3,4]])
我来帮你一步步搞定这个问题~首先得明确两个需求的本质区别:从1D转2D是调整张量维度结构,而从3个元素扩展到4个是新增元素,这俩需要的方法完全不同,你之前用expand()没成功,是因为它的作用和你预期的不一样,下面给你拆解清楚:
第一步:把1D张量 tensor([1,2,3]) 转成2D的 tensor([[1,2,3]])
这里有几种简单易用的方法,选哪种都可以:
用
unsqueeze()新增维度:这是最直观的方式,专门用来给张量添加新维度。unsqueeze(0)表示在第0个维度(行维度)新增一个维度:import torch x = torch.tensor([1, 2, 3]) x_2d = x.unsqueeze(0) # 输出结果:tensor([[1, 2, 3]])你也可以用简写
x[None, :],效果完全一致,写法更简洁。用
reshape()重塑维度:如果明确目标维度的大小,reshape可以直接调整张量形状,其中-1表示让PyTorch自动计算该维度的长度:x_2d = x.reshape(1, -1)用
view()(适用于连续存储的张量):和reshape功能类似,但要求张量是连续存储的,如果你确定张量没有被修改过,用这个也没问题:x_2d = x.view(1, 3)
第二步:把2D张量 tensor([[1,2,3]]) 扩展成 tensor([[1,2,3,4]])
这里要重点说明:expand()的作用是重复已有维度的元素(比如把1行扩展成5行,每行都是[1,2,3]),但它不能新增全新的元素,所以没法直接用它实现从3个元素到4个元素的扩展。你可以用以下几种方法:
方法1:用torch.cat()拼接新元素
先创建一个包含4的2D张量,然后和原张量在列维度(dim=1)上拼接:
# 先得到第一步的x_2d = tensor([[1,2,3]]) new_tensor = torch.cat([x_2d, torch.tensor([[4]])], dim=1) # 输出结果:tensor([[1, 2, 3, 4]])
方法2:用F.pad()填充指定值
如果是要在张量末尾填充固定值,可以用torch.nn.functional.pad,参数(0,1)表示在最后一个维度(列)的左侧填0个元素,右侧填1个元素,填充值设为4:
import torch.nn.functional as F new_tensor = F.pad(x_2d, (0, 1), mode='constant', value=4)
方法3:直接创建新张量(适合元素固定的场景)
如果你的元素是确定的,直接创建新张量是最省事的:
new_tensor = torch.tensor([[1, 2, 3, 4]])
最后再补充下expand()的正确用法:比如你有x_2d = tensor([[1,2,3]]),想把它变成3行的张量,就可以用x_2d.expand(3, 3),结果会是tensor([[1,2,3],[1,2,3],[1,2,3]])——它只是重复已有元素,并不会新增哦~
内容的提问来源于stack exchange,提问作者GreMal

