如何将形状为[1,3,64,64]的PyTorch张量转换为[1,4,64,64]
解决方案:PyTorch张量通道扩展并复制指定层
针对你的需求,这里有两种简洁且保留梯度的实现方式,完全符合要求:
方法一:使用torch.cat()拼接复制的通道
这是最直观高效的方式——提取原张量的最后一个通道,再将其拼接到原张量的通道维度上:
import torch # 初始化和你规格一致的示例张量 x = torch.randn(1, 3, 64, 64, requires_grad=True) # 提取最后一个通道,保持形状为[1, 1, 64, 64](避免降维) last_channel = x[:, -1:, :, :] # 在通道维度(dim=1)拼接原张量和复制的通道 new_tensor = torch.cat([x, last_channel], dim=1) # 验证结果 print(new_tensor.shape) # 输出 torch.Size([1, 4, 64, 64]) # 验证梯度是否正常传递 new_tensor.sum().backward() print(x.grad is not None) # 输出 True,说明梯度保留成功
方法二:使用扩展赋值(可选)
如果你偏好先扩展张量尺寸再赋值的方式,也可以这样操作,同样保留计算图:
import torch x = torch.randn(1, 3, 64, 64, requires_grad=True) # 创建目标形状的张量,先复制原张量的所有通道,再填充新增通道 new_tensor = torch.zeros(1, 4, 64, 64, dtype=x.dtype, device=x.device) new_tensor[:, :3, :, :] = x new_tensor[:, 3, :, :] = x[:, 2, :, :] # 验证结果 print(new_tensor.shape) # 输出 torch.Size([1, 4, 64, 64]) new_tensor.mean().backward() print(x.grad is not None) # 输出 True
关键说明
- 两种方法都避开了
resize_(),且完整保留了张量的requires_grad属性,梯度可以正常反向传播。 - 方法一更推荐,无需额外的初始化操作,直接拼接即可满足需求,性能更优。
内容的提问来源于stack exchange,提问作者raspiduino
相关产品推荐
相关产品推荐

