为什么这个CNN的隐藏层输出通道数是16?

人工智能 卷积神经网络 火炬 超参数 过滤器
2021-11-01 18:19:01

在 Jeremy Howard 的本教程中:torch.nn 到底是什么?他最后有一个例子,他为 MNIST 创建了一个 CNN。nn.Conv2d中,他使in_channelsand out_channels: (1,16), (16,16), (16,10)

我知道最后一个必须是 10,因为有 10 个班级,我们想要每个班级的“概率”。但是为什么要先升到 16 呢?你如何选择这个值?为什么不直接从 1 到 10、10 到 10 和 10 到 10?这与kernel_sizeand有关系stride吗?

所有的图像都是28x28,所以我也看不到这些值和 16 之间的任何相关性。

class Mnist_CNN(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=2, padding=1)
        self.conv2 = nn.Conv2d(16, 16, kernel_size=3, stride=2, padding=1)
        self.conv3 = nn.Conv2d(16, 10, kernel_size=3, stride=2, padding=1)

    def forward(self, xb):
        xb = xb.view(-1, 1, 28, 28)
        xb = F.relu(self.conv1(xb))
        xb = F.relu(self.conv2(xb))
        xb = F.relu(self.conv3(xb))
        xb = F.avg_pool2d(xb, 4)
        return xb.view(-1, xb.size(1))
1个回答

我将您的问题理解为:“作者如何选择隐藏层中的神经元数量?”

隐藏层中神经元的数量是您如何控制您尝试生成的函数的复杂性,以将输入映射到输出。隐藏层中的神经元越多,功能就越复杂,因此您可以捕获更复杂的决策障碍。然而,更复杂的功能更难优化,并会导致性能得分较低。这里的目标是找到正确的权衡以最大化您的性能。您可以使用交叉验证将隐藏神经元的数量调整为超参数。

没有任何公式可以确定您需要的神经元数量,但是您可以根据您将拥有的输入和输出数量获得直觉。通常,您需要比输入和输出神经元更多的隐藏神经元。由于大多数人都是编写神经网络的程序员,我们习惯于使用2n. 因此,在 10 中选择 16,在 28 中选择 32。