有人可以解释以下pytorch神经网络中的层代码吗

Can someone explain the layers code in the following pytorch neural network

神经网络是 NVIDIA 自动驾驶汽车模型的 pytorch 实现。

这里我没看懂第一层的linear layers,下面是line.

'nn.Linear(in_features=64 * 2 * 33, out_features=100)'

我可以理解 64 是前一层的输出,2 是扁平层的数量(如果我没记错的话)。

现在我的问题是“33”的用途是什么?

class 网络密集(nn.Module):

def __init__(self):
    super(NetworkDense, self).__init__()
    self.conv_layers = nn.Sequential(
        nn.Conv2d(3, 24, 5, stride=2),
        nn.ELU(),
        nn.Conv2d(24, 36, 5, stride=2),
        nn.ELU(),
        nn.Conv2d(36, 48, 5, stride=2),
        nn.ELU(),
        nn.Conv2d(48, 64, 3),
        nn.ELU(),
        nn.Conv2d(64, 64, 3),
        nn.Dropout(0.25)
    )
    self.linear_layers = nn.Sequential(
        nn.Linear(in_features=64 * 2 * 33, out_features=100),
        nn.ELU(),
        nn.Linear(in_features=100, out_features=50),
        nn.ELU(),
        nn.Linear(in_features=50, out_features=10),
        nn.Linear(in_features=10, out_features=1)
    )
    
def forward(self, input):  
    input = input.view(input.size(0), 3, 70, 320)
    output = self.conv_layers(input)
    output = output.view(output.size(0), -1)
    output = self.linear_layers(output)
    return output

它来自您的第一个输入形状。 input = input.view(input.size(0), 3, 70, 320)

将其视为大小为 (70, 320) 的图像。如果我们把那个图像传递给第一个conv2d,那么它就会变成(33, 158)...,最后,如果它全部通过conv层,它的形状就会变成(2, 33).

那么,如何计算这些数字呢?

它是这样的:

(length - (kernel_size - stride)) // stride

现在让我们想想70将如何改变。第一个 conv2d 的内核大小为 5,步幅为 2。因此 70 将类似于:

(70 - (5 - 2)) // 2 => 33,那么剩下的:

(33 - (5 - 2)) // 2 => 15
(15 - (5 - 2)) // 2 => 6
(6 - (3 - 1)) // 1` => 4
(4 - (3 - 1)) // 1` => 2

和其他长度一样,320会变成33