我很好奇使用 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/