一、基本概念
Tensor.view() 是 PyTorch 中 Tensor 的一种方法,用于改变 Tensor 的形状或维度,不改变其数据存储。view() 方法有两个作用:
- 改变 Tensor 的形状或维度:原 Tensor 的元素总数只能是被重新定义的 Tensor 的元素总数的整数倍。
- 不改变 Tensor 的数据存储:将原 Tensor 中的数据存储于新 Tensor 中的方式与原 Tensor 相同。
这意味着,view() 操作可以有效地避免重新分配内存空间。
二、维度变换示例
下面,我们来看一个示例,将一个 3×3 的矩阵转换为行向量、列向量、以及一个大小为 9 的一维向量。
import torch
import numpy as np
# 创建一个 3x3 的矩阵
A = torch.tensor(np.random.randint(10, size=(3, 3)))
print("A =", A)
# 转换为行向量
A_row_vector = A.view(1, -1)
print("A_row_vector =", A_row_vector)
# 转换为列向量
A_column_vector = A.view(-1, 1)
print("A_column_vector =", A_column_vector)
# 转换为大小为 9 的一维向量
A_one_dimensional = A.view(-1)
print("A_one_dimensional =", A_one_dimensional)
输出结果:
A = tensor([[7, 1, 7],
[0, 4, 3],
[4, 8, 7]])
A_row_vector = tensor([[7, 1, 7, 0, 4, 3, 4, 8, 7]])
A_column_vector = tensor([[7],
[1],
[7],
[0],
[4],
[3],
[4],
[8],
[7]])
A_one_dimensional = tensor([7, 1, 7, 0, 4, 3, 4, 8, 7])
可以看到,我们通过 view 操作,快速变换了 Tensor 的维度,不需要重新为 Tensor 分配内存空间。
三、Tensor.view 的使用场景
1、Tensor.view 的作用
Tensor.view() 的意义在于改变 Tensor 的形状或维度,但是不会改变数据存储。一般而言,该方法用于以下场景:
- 改变 Tensor 的维度,包括变换形状、扩展维度等。
- 进行 Tensor 的不同视角查看,比如将图像从一维向量转换为二维像素矩阵。
2、Tensor.view 的注意事项
Tensor.view() 有以下几点需要注意:
- 原 Tensor 的元素总数只能是被重新定义的 Tensor 的元素总数的整数倍。
- 对新 Tensor 进行操作可能会危及原 Tensor 的数据。
- 对新 Tensor 的改动不会影响原 Tensor。
3、Tensor.view 与 Torch.squeeze 的区别
Tensor.view() 和 Torch.squeeze() 都可以用来压缩 tensor 的维度,两者的不同点在于:
- Tensor.view() 压缩维度后需要形状匹配,不匹配会报错;而 Torch.squeeze() 不需要形状匹配,可以自动匹配。
- Tensor.view() 压缩的维度必须为 1;而 Torch.squeeze() 可以压缩任意的维度。
下面是一个 Tensor.view() 与 Torch.squeeze() 的示例,将一个 Tensor 中维度为 1 的维度压缩。
import torch
# 创建一个大小为 1x3x1x2 的 Tensor
A = torch.tensor([[[[1, 2]], [[3, 4]], [[5, 6]]]])
print("Size of A:", A.size())
# 使用 Tensor.view() 压缩维度
B = A.view(3, 2)
print("Size of B:", B.size())
# 使用 Torch.squeeze() 压缩维度
C = torch.squeeze(A)
print("Size of C:", C.size())
输出结果:
Size of A: torch.Size([1, 3, 1, 2])
Size of B: torch.Size([3, 2])
Size of C: torch.Size([3, 2])
可以看到,使用 Tensor.view() 压缩维度需要事先知道 Tensor 的形状,而 Torch.squeeze() 可以自动判断并压缩指定的维度。
四、小结
Tensor.view() 是 PyTorch 中常用的一种 Tensor 方法,可用于改变 Tensor 的形状或维度,不改变其数据存储。它可以快速地进行 Tensor 维度变换,并且可以避免重新分配内存空间。Tensor.view() 的使用场景主要在于改变 Tensor 的维度,包括变换形状、扩展维度、不同视角查看等场景。在使用 Tensor.view() 注意要求的元素总数必须为被重新定义的 Tensor 的元素总数的整数倍。同时,还可以将 Tensor.view() 与 Torch.squeeze() 相结合使用,来压缩 tensor 的维度。
原创文章,作者:CZVLY,如若转载,请注明出处:https://www.506064.com/n/360908.html