【问题标题】:How to select parameters for nn.Linear layer while training a CNN?如何在训练 CNN 时为 nn.Linear 层选择参数?
【发布时间】:2019-11-01 18:33:12
【问题描述】:

我正在尝试训练 CNN 以使用 Conv2dMaxpoolLinear 层对来自 Fashion-MNIST 数据的图像进行分类。我在nn.Linear 层中遇到了下面提到的带有in_features = 12*4*4 的代码。

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

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.x conv-neural-network pytorch


    【解决方案1】:

    如果 CNN 最终具有 fc 层,则首先您必须确定输入大小。接下来你有三个选择:

    1. 自己算算。计算张量大小在通过不同的转换、池化层时如何变化。

    2. 只需输入您在初始层中固定大小的随机张量。然后查看输出的大小(tensor.size())。在您给出的示例中,它将是 (torch.Size([12, 4, 4]))。

    3. 使用 tsalib 之类的东西在后台处理大小调整。

    我个人更喜欢方法 2,因为它快速、准确并且不需要任何 3rd 方库。

    【讨论】:

      【解决方案2】:

      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. 然后我们使用2 x 2 的感受野执行maxpooling 操作,我们将每个维度减半,降至12 x 12
      4. 我们再次在没有paddingstride=1 的情况下进行另一个5 x 5 卷积,我们下降到8 x 8,即(12-5)/1 + 1
      5. 然后,我们执行另一个maxpooling操作,我们下拉到4 x 4

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

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

      希望对你有帮助!

      【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2017-10-24
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2018-07-01
      • 2020-04-23
      • 2021-04-26
      • 2020-08-27
      相关资源
      最近更新 更多