训练CNN时如何为nn.Linear层选择参数?

时间:2019-06-19 05:25:54

标签: python-3.x conv-neural-network pytorch

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

请问如何为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)

2 个答案:

答案 0 :(得分:1)

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

  1. 输入为28 x 28
  2. 我们进行5 x 5卷积而没有填充(由于default padding=0)和stride=1(by default),所以我们在每一侧丢失2像素,我们下降到{{1} },即(28-5)/ 1 +1
  3. 然后我们使用24 x 24的接受域执行maxpooling操作,将每个维度切成一半,降到2 x 2
  4. 我们再次进行另一次12 x 12卷积而没有5 x 5padding,我们下降到stride=1,即(12-5)/ 1 + 1
  5. 然后,我们执行另一个maxpooling操作,我们下降到8 x 8

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

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

希望这对您有帮助!

答案 1 :(得分:0)

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

  1. 自己做数学。计算张量大小在通过不同的转换,合并层时的变化方式。

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

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

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