首页 > 解决方案 > 如何在训练 CNN 时为 nn.Linear 层选择参数?

问题描述

我正在尝试训练 CNN 使用 和 层对数据中Fashion-MNIST的图像进行分类。我在层中遇到了如下所述的代码。Conv2dMaxpoolLinearin_features = 12*4*4nn.Linear

我能否获得有关如何in_features为 nn.Linear 层选择参数的帮助?

class Network(nn.Module):
    def __init__(self):
        super(Network, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
        self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)

        self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
        self.fc2 = nn.Linear(in_features=120, out_features=60)
        self.out = nn.Linear(in_features=60, out_features=10)

标签: python-3.xconv-neural-networkpytorch

解决方案


Fashion-MNIST数据集中的每个示例都是28 x 28灰度图像。

  1. 输入是28 x 28
  2. 我们在5 x 5没有填充的情况下进行卷积(因为default padding=0)并且stride=1(by default),所以我们在每一边都丢失了2像素,我们下降到24 x 24,即,(28-5)/1 + 1
  3. 然后我们使用感受野执行 maxpooling 操作2 x 2,我们将每个维度减半,降低到12 x 12
  4. 我们再次在没有and的情况下进行另一个5 x 5卷积,我们下降到,即 (12-5)/1 + 1paddingstride=18 x 8
  5. 然后,我们执行另一个 maxpooling 操作,我们下拉到4 x 4

这就是为什么,self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)。它基本上是n_features_conv * height * width,其中高度和宽度4分别是,并且与位于其正上方的层n_features_conv 相同。out_channelsconv2D

请注意,如果您更改输入图像的大小,则必须执行上述计算并Linear相应地调整第一层。

希望这对你有帮助!


推荐阅读