在 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 中常用的工具,有助于你更灵活地操作张量并适应深度模型的需求。