Python 理解火炬

Python 理解火炬,python,machine-learning,neural-network,pytorch,Python,Machine Learning,Neural Network,Pytorch,我知道展平会移除除一个维度之外的所有维度。例如,我理解: 然而,我不明白这段代码的意思,尤其是我不明白这段代码的意思: 我觉得输出的大小应该是[160],因为32*5=160 Q1.那么为什么它会输出大小[32288] Q2.我也不明白文件中给出的shape信息的含义: Q3.以及参数的含义: 这是默认行为的不同之处。默认情况下展平所有标注,而默认情况下展平从第二个标注(索引1)开始的所有标注 您可以在start\u dim和end\u dim参数的默认值中看到这种行为。start\u di

我知道展平会移除除一个维度之外的所有维度。例如,我理解:

然而,我不明白这段代码的意思,尤其是我不明白这段代码的意思:

我觉得输出的大小应该是
[160]
,因为
32*5=160

Q1.那么为什么它会输出大小
[32288]

Q2.我也不明白文件中给出的
shape
信息的含义:

Q3.以及参数的含义:


这是默认行为的不同之处。默认情况下展平所有标注,而默认情况下展平从第二个标注(索引1)开始的所有标注

您可以在
start\u dim
end\u dim
参数的默认值中看到这种行为。
start\u dim
参数表示要展平的第一个维度(零索引),而
end\u dim
参数表示要展平的最后一个维度。因此,当
start\u dim=1
torch.nn.Flatten
的默认值时,第一个维度(索引0)不会展平,但当
start\u dim=0
torch.Flatten
的默认值时,它会包括在内

这种差异背后的原因可能是因为
torch.nn.flatte
用于
torch.nn.Sequential
,其中通常对一批输入执行一系列操作,其中每个输入独立于其他输入进行处理。例如,如果您有一批图像,并调用
torch.nn.flatte
,典型的用例是分别展平每个图像,而不是展平整个批次

如果确实要使用
torch.nn.flatte
展平所有标注,只需将对象创建为
torch.nn.flatte(start\u dim=0)


最后,文档中的形状信息仅涵盖了张量的形状将如何受到影响,说明第一个(索引0)维度保持原样。因此,如果您的输入张量为shape
(N,*dims)
,其中
*dims
是任意尺寸序列,则输出张量将具有shape
(N,*dims的乘积)
,因为除批量尺寸外的所有尺寸都是展平的。例如,shape
(3,10,10)
的输入将具有shape
(3,10 x 10)=(3100)

的输出,但如何将
nn.Conv2d(1,32,5,1,1)
转换为
[32288]
?@Rnj这些参数对应于输入通道、输出通道、内核大小等。创建conv层时,不是输入的形状(请参见)。输入经过conv层后的形状是
(32,32,3,3)
,它变平为
(32,32 x 3 x 3)=(32288)
> t = torch.ones(4, 3)
> t
tensor([[1., 1., 1.],
    [1., 1., 1.],
    [1., 1., 1.],
    [1., 1., 1.]])

> flatten(t)
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
>>> input = torch.randn(32, 1, 5, 5)
>>> m = nn.Sequential(
>>>     nn.Conv2d(1, 32, 5, 1, 1),
>>>     nn.Flatten()
>>> )
>>> output = m(input)
>>> output.size()
torch.Size([32, 288])