python - x.view(x.size(0), -1) 和 torch.nn.Flatten() 层和 torch.flatten(x) 有什么区别? torch 问题

标签 python pytorch

我很好奇使用 view(,-1) 和 flatten 之间有什么区别,就像这里的简单代码一样:

因为我发现大小和数据都扁平化为一维。

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda, Compose
import matplotlib.pyplot as plt

x = torch.rand(3,256,256)
x.size()

a = x.view(x.size(0), -1)
print('after view:',a.size())

m = nn.Sequential(nn.Flatten())
y = m(x)
print('after nn flatten:',y.size())
z = torch.flatten(x)
print('after torch flatten:',y.size())

而且, = 和 =.contigulous 之间似乎没有区别:返回内存中连续的张量,其中包含与自身张量相同的数据。但对我来说,似乎只是返回自身张量,而不是复制或具有相同数据的新张量。

c = y
print(c)
b = y.contiguous()
print(b)

# change original data
y[0][0]=1
print(b)
print(c)
print(y)

最佳答案

View 是一种在不修改数据本身的情况下修改查看数据的方式的方法:

  • torch.view返回数据 View :数据不会被复制,只有您查看数据变化的“窗口”
  • torch.flatten 从多维输入返回一维输出。如果出现以下情况,它可能不会复制数据

[the] input can be viewed as the flattened shape (source)

  • torch.nn.Flatten 只是一个 wrapper为了方便 torch.flatten

连续数据仅意味着数据在内存中是线性可寻址的,例如对于二维数据,这意味着元素 [i][j] 位于位置 i * num_columns + j。如果情况已经如此,那么 .contiguous不会更改您的数据或复制任何内容。

关于python - x.view(x.size(0), -1) 和 torch.nn.Flatten() 层和 torch.flatten(x) 有什么区别? torch 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70348437/

相关文章:

python - 在 swift 和 python 中从相同的返回类型获得不同的结果

python - 使用 Python 访问 .zipx

python - SimpleHTTPRequestHandler 在从 do_POST 方法返回之前关闭连接

python - 如何将算法转换为python

docker - 在Google Cloud Build上运行步骤时,如何指定docker标志?

python - PyTorch 不能 pickle lambda

python - 具有可变长度数组的索引多维 torch 张量

c# - 如果公司使用 C++、C# 或 Java 作为应用程序语言,为什么要学习 Perl、Python、Ruby?

python - 如何获得神经网络的ROC曲线?

nlp - 计算梯度PyTorch 中嵌入向量的值