python - Pytorch 与转置之间的不同输出

标签 python numpy view pytorch reshape

设张量维度为 (B, N^2, C) 我将其 reshape 为 (B, C, N, N)。

我认为我有以下两个选择

A = torch.rand(5, 100, 20) # Original Tensor

# First Method
B = torch.transpose(2, 1)
B = B.view(5, 20, 10, 10)

# Second Method
C = A.view(5, 20, 10, 10)

这两种方法都有效,但输出略有不同,我看不出它们之间的区别。

谢谢

最佳答案

BC 的区别在于你使用了 torch.transpose 这意味着你交换了两个轴,这意味着你有改变了内存的布局。最后的 View 只是一个很好的界面,供您访问数据,但它对张量的基础数据没有影响。它归结为一个连续的内存数据缓冲区。

如果你举一个更小的例子,我们更容易掌握:

>>> A = torch.rand(1, 4, 3)
tensor([[[0.2656, 0.5920, 0.3774],
         [0.8447, 0.5984, 0.0614],
         [0.5160, 0.8048, 0.6260],
         [0.1644, 0.3144, 0.1040]]])

此处交换 axis=1axis=2 归结为批量转置(用数学术语):

>>> B = A.transpose(2, 1)
tensor([[[0.4543, 0.7447, 0.7814, 0.3444],
         [0.9766, 0.2732, 0.4766, 0.0387],
         [0.0123, 0.7260, 0.8939, 0.8581]]])

在内存布局方面A有如下内存安排:

>>> A.flatten()
tensor([0.4543, 0.9766, 0.0123, 0.7447, 0.2732, 0.7260, 0.7814, 0.4766, 0.8939,
        0.3444, 0.0387, 0.8581])

虽然 B 有不同的布局。 layout 我指的是内存排列,我不是指它的 shape 这是无关紧要的:

>>> B.flatten()
tensor([0.4543, 0.7447, 0.7814, 0.3444, 0.9766, 0.2732, 0.4766, 0.0387, 0.0123,
        0.7260, 0.8939, 0.8581])

正如我所说, reshape 在张量之上构建 View 不会改变其内存布局,它是更好地操纵张量的抽象级别。

所以最后,是的,你得到了两个不同的结果:CA 共享相同的数据,而 B 是一个复制并具有不同的内存布局。

关于python - Pytorch 与转置之间的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69446402/

相关文章:

python - Twitter oauth 与flask_oauthlib,无法生成请求 token

适合 Python 程序员的 PHP?

python - 从列表创建 numpy 数组给出了错误的形状

python - 第二次运行 np.empty

numpy - 'numpy.float64' 对象不可调用

python - Django:将来自外部 API 的数据映射到模型中?

grails - 如何在 View 中调用 Grails 服务?

jsp - 在liferay中显示 Controller 数据

android - 使用动态文本更新 UI

python - 如何使用 Numpy 查找两个图像之间的相关性