










好的!在 PyTorch 中,调整张量形状和维度的常用操作包括 torch.view、unsqueeze、reshape、transpose 和 permute。以下是它们的详细对比总结:
torch.view.contiguous()。x = torch.arange(6) # shape (6,)
y = x.view(2, 3) # shape (2, 3)
torch.reshapeview,但自动处理非连续张量(必要时复制数据)。view 一致时共享数据,否则生成新张量。x = torch.arange(6)
y = x.reshape(2, 3) # 结果同 view
torch.unsqueezex = torch.tensor([1, 2, 3]) # shape (3,)
y = x.unsqueeze(0) # shape (1, 3)
torch.transpose.contiguous() 使用。x = torch.randn(2, 3, 4) # shape (2, 3, 4)
y = x.transpose(0, 1) # shape (3, 2, 4)(交换维度0和1)
torch.permutetranspose 更通用(可一次调整多个维度)。.contiguous()。x = torch.randn(2, 3, 4) # shape (2, 3, 4)
y = x.permute(2, 0, 1) # shape (4, 2, 3)
| 方法 | 作用 | 是否共享数据 | 连续性要求 | 是否改变数据顺序 | 典型场景 |
|---|---|---|---|---|---|
view |
调整形状 | 是 | 必须连续 | 否 | 高效调整连续张量形状 |
reshape |
调整形状(更安全) | 可能不共享 | 无 | 否 | 通用形状调整 |
unsqueeze |
插入维度 | 是 | 无 | 否 | 扩展维度(如添加批次) |
transpose |
交换两个维度 | 是 | 无 | 是 | 交换维度(如矩阵转置) |
permute |
重新排列所有维度顺序 | 是 | 无 | 是 | 复杂维度重排(如通道顺序调整) |
view vs reshape
view 要求张量连续,否则报错;reshape 自动处理非连续张量(可能复制数据)。view(高效),不确定连续性时用 reshape。transpose vs permute
transpose 只能交换两个维度;permute 可一次性调整任意多个维度顺序。(B, C, H, W) 转换为 (B, H, W, C) 用 permute(0, 2, 3, 1)。是否改变数据顺序
view/reshape/unsqueeze 仅调整形状或扩展维度,不改变数据顺序。transpose/permute 改变数据顺序(维度交换后,内存布局可能不连续)。何时需要 contiguous()?
当使用 transpose 或 permute 后,若需要调用 view,需先调用 .contiguous() 确保数据连续:
x = x.permute(0, 2, 1).contiguous().view(-1, 10)
如何恢复原始维度顺序?
使用 permute 或 transpose 的逆操作:
x = torch.randn(4, 2, 3)
y = x.permute(1, 2, 0) # shape (2, 3, 4)
z = y.permute(2, 0, 1) # 恢复原状 (4, 2, 3)
unsqueeze 的逆操作是什么?
使用 squeeze 删除大小为 1 的维度:
x = torch.randn(1, 3, 1, 4)
y = x.squeeze() # 删除所有大小为1的维度,shape (3, 4)
图像维度调整
(N, H, W, C) 转换为 (N, C, H, W)(适配卷积输入):x = x.permute(0, 3, 1, 2)
矩阵转置
transpose 交换最后两个维度:x = torch.randn(3, 4)
y = x.transpose(0, 1) # shape (4, 3)
添加批次维度
x = torch.randn(3, 224, 224)
x = x.unsqueeze(0) # shape (1, 3, 224, 224)
掌握这些操作能灵活处理张量形状和维度,适配不同模型的输入需求!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。