【发布时间】:2021-05-05 00:09:43
【问题描述】:
我正在尝试学习 PyTorch,偶然发现了一个 CNN 定义如下的教程,
class Net(Module):
def __init__(self):
super(Net, self).__init__()
self.cnn_layers = Sequential(
# Defining a 2D convolution layer
Conv2d(1, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
# Defining another 2D convolution layer
Conv2d(4, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
)
self.linear_layers = Sequential(
Linear(4 * 7 * 7, 10)
)
# Defining the forward pass
def forward(self, x):
x = self.cnn_layers(x)
x = x.view(x.size(0), -1)
x = self.linear_layers(x)
return x
我了解 cnn_layers 是如何制作的。在 cnn_layers 之后,数据应该被展平并交给 linear_layers。
我不明白 Linear 的特征数量是多少 4*7*7。我知道 4 是最后一个 Conv2d 层的输出维度。
7*7 是如何进入图片的? stride 或 padding 在其中有什么作用吗?
输入图像形状为 [1, 28, 28]
【问题讨论】:
-
输入图像的形状是什么?
-
28x28 单通道
-
据我了解,全连接层中的神经元数量不需要与卷积层的输出相同。如果你在第一个 FC 层有 30 个神经元并且 conv 层的输出是 4*7*7 你仍然可以有 30,10 10 是输出维度,30 是隐藏层维度,可以有任意数量的输入.
-
@cerofrais 不,这不是它的工作原理