了解 torch.nn.Flatten

Rnj*_*Rnj 6 python machine-learning neural-network pytorch

据我了解,Flatten 会删除除一个维度之外的所有维度。例如,我理解flatten()

> 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.])
Run Code Online (Sandbox Code Playgroud)

但是,我不明白Flatten,特别是我不明白文档中这段代码的含义:

>>> 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])
Run Code Online (Sandbox Code Playgroud)

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

Q1. 那么为什么它输出尺寸[32,288]呢?

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

在此输入图像描述

Q3。还有参数的含义:

在此输入图像描述

Goo*_*eds 6

这是默认行为的差异。torch.flatten默认展平所有维度,同时torch.nn.Flatten默认展平从第二个维度(索引 1)开始的所有维度。

start_dim您可以在和参数的默认值中看到这种行为end_dim。参数start_dim表示要展平的第一个维度(零索引),end_dim参数表示要展平的最后一个维度。因此,当 时start_dim=1(这是 的默认值torch.nn.Flatten),第一个维度(索引 0)不会展平,但当 时(start_dim=0这是 的默认值)时,第一个维度(索引 0)会被包含在内torch.flatten

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

如果您确实想使用 展平所有尺寸torch.nn.Flatten,则只需将对象创建为torch.nn.Flatten(start_dim=0)

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

  • @Rnj这些是创建转换层时对应于输入通道、输出通道、内核大小等的参数,而不是输入的形状(请参阅https://pytorch.org/docs/stable/ generated/torch.nn .Conv2d.html#torch.nn.Conv2d)。通过卷积层后输入的形状为“(32, 32, 3, 3)”,其展平为“(32, 32 x 3 x 3) = (32, 288)”。 (2认同)