如何为 nn 选择参数.训练 CNN 时的线性层



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

我能否获得有关如何为 nn 选择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)

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

  1. 输入28 x 28
  2. 我们做一个没有填充(自default padding=0以来(和stride=1(by default)5 x 5卷积,所以我们在每边损失2像素,我们下降到24 x 24,即(28-5(/1 + 1
  3. 然后,我们使用2 x 2感受野执行最大池化操作,我们将每个维度切成两半,精确到12 x 12
  4. 我们再次做另一个没有paddingstride=1 5 x 5卷积,我们下降到8 x 8,即(12-5(/1 + 1
  5. 然后,我们
  6. 执行另一个最大池操作,我们下降到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图层。

希望对您有所帮助!

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

  1. 自己算一算。计算张量大小在经过不同的卷积池层时如何变化。

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

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

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

最新更新