有人可以解释以下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
。
神经网络是 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
。