深度学习02-pytorch-01-张量形状的改变

在 PyTorch 中,张量的形状(或称为形状变换 )可以通过多种方式进行改变,这有助于数据的重新排列、打平、扩展或压缩。常用的操作包括 view(), reshape(), transpose(), unsqueeze(), squeeze(), 和 permute() 等等。下面将详细介绍这些常见的形状改变方法。

1. view()

view() 是 PyTorch 中常用的形状变换函数,它可以改变张量的形状,但要求张量在内存中是连续存储的。

python 复制代码
import torch
tensor = torch.randn(2, 3, 4)  # 原始张量形状为 (2, 3, 4)
print(tensor.size())  # 输出: torch.Size([2, 3, 4])
​
# 使用 view 变换形状
reshaped_tensor = tensor.view(6, 4)  # 变为形状 (6, 4)
print(reshaped_tensor.size())  # 输出: torch.Size([6, 4])

注意:view() 只能用于在内存中连续的张量,如果内存不连续,会报错。可以使用 tensor.contiguous() 使其连续。

2. reshape()

reshape() 功能类似于 view(),但它会自动处理张量是否连续的问题,即使张量不连续,也能重新调整形状。

python 复制代码
reshaped_tensor = tensor.reshape(6, 4)  # 变为形状 (6, 4)
print(reshaped_tensor.size())  # 输出: torch.Size([6, 4])

3. transpose()

transpose() 交换两个维度的位置。它不改变张量的存储顺序,只是交换了维度的显示顺序。

python 复制代码
tensor = torch.randn(2, 3)  # 形状为 (2, 3)
transposed_tensor = tensor.transpose(0, 1)  # 交换第 0 维和第 1 维
print(transposed_tensor.size())  # 输出: torch.Size([3, 2])

4. permute()

permute() 可以按照指定顺序重排张量的所有维度。它比 transpose() 更灵活。

python 复制代码
tensor = torch.randn(2, 3, 4)  # 原始形状 (2, 3, 4)
permuted_tensor = tensor.permute(2, 0, 1)  # 将维度顺序调整为 (4, 2, 3)
print(permuted_tensor.size())  # 输出: torch.Size([4, 2, 3])

5. squeeze()

squeeze() 会移除张量中大小为 1 的维度。

python 复制代码
tensor = torch.randn(1, 3, 1, 4)  # 形状为 (1, 3, 1, 4)
squeezed_tensor = tensor.squeeze()  # 移除所有大小为 1 的维度
print(squeezed_tensor.size())  # 输出: torch.Size([3, 4])

你也可以指定要移除的维度:

python 复制代码
squeezed_tensor = tensor.squeeze(2)  # 只移除第 2 维(大小为 1)

6. unsqueeze()

unsqueeze() 用来在指定的位置增加一个大小为 1 的维度。它与 squeeze() 相反。

python 复制代码
tensor = torch.randn(3, 4)  # 形状为 (3, 4)
unsqueezed_tensor = tensor.unsqueeze(0)  # 在第 0 维添加一个大小为 1 的维度
print(unsqueezed_tensor.size())  # 输出: torch.Size([1, 3, 4])

7. flatten()

flatten() 用来将多维张量展平成一个一维张量。

python 复制代码
tensor = torch.randn(2, 3, 4)  # 形状为 (2, 3, 4)
flattened_tensor = tensor.flatten()  # 展平成一维张量
print(flattened_tensor.size())  # 输出: torch.Size([24])

你也可以指定展平的范围:

python 复制代码
flattened_tensor = tensor.flatten(start_dim=1)  # 从第 1 维开始展平
print(flattened_tensor.size())  # 输出: torch.Size([2, 12])

总结

  • view(): 改变张量形状,要求连续存储。

  • reshape(): 改变张量形状,处理连续与否问题。

  • transpose(): 交换两个维度。

  • permute(): 自由调整所有维度的顺序。

  • squeeze(): 移除大小为 1 的维度。

  • unsqueeze(): 添加大小为 1 的维度。

  • flatten(): 将张量展平为一维。

这些形状变换操作是 PyTorch 中常用的工具,有助于你更灵活地操作张量并适应深度模型的需求。

相关推荐
向量引擎1 分钟前
[硬核架构] 2026 企业级 AI 网关落地指南:从“连接超时”到“秒级响应”的架构演进(附 Python/Java 源码)
人工智能·python·gpt·ai作画·架构·aigc·api调用
Aloudata5 分钟前
数据语义层 vs 宽表模式:哪种架构更适合 AI 时代的数据分析?
人工智能·架构·数据挖掘·数据分析·数据治理
前进的李工6 分钟前
深度解析:词向量与自注意力机制
深度学习·神经网络·cnn·位置编码·自注意力
OLOLOadsd12310 分钟前
基于改进YOLOv13的长曲棍球角色识别与装备检测系统
人工智能·yolo·目标跟踪
高频交易dragon10 分钟前
An Impulse Control Approach to Market Making in a Hawkes LOB Market从论文到生产
人工智能·算法·机器学习
AI营销快线11 分钟前
原圈科技AI CRM系统打破数据孤岛,实现业绩增长的可视化闘环
大数据·人工智能
mahtengdbb114 分钟前
【人工智能】基于YOLOv10n-ReCalibrationFPN-P345的道路坑洞与井盖检测
人工智能·yolo
数字化转型202517 分钟前
SAP 实施项目乙方因甲方逾期付款单方面中途离场的风险处理方案
运维·人工智能·机器学习
檐下翻书17320 分钟前
医疗、金融、教育等行业的智能助手
人工智能·金融
Rabbit_QL25 分钟前
【LLM背景】语言模型简史:从概率统计到通用智能接口
人工智能·语言模型·自然语言处理