You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将形状为[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:41:02