如何选择卷积层的输出通道数?

数据挖掘 深度学习 美国有线电视新闻网 卷积 火炬
2021-10-09 21:08:45

我正在关注一个 pytorch 教程,其中对于形状为 [8,3,32,32] 的张量,其中 8 是批量大小,3 是通道数,32 x 32,像素大小,它们定义了第一个卷积层作为 nn.Conv2d(3, 16, 5 ),其中 3 是输入大小,16 是输出大小,5 是内核大小,它工作正常。

in_size = 3
hid1_size = 16
hid2_size = 32
out_size = len(labels)
k_conv_size = 5 

class ConvNet(nn.Module):

    def __init__(self):
        super(ConvNet, self).__init__()

        self.layer1 = nn.Sequential(
            nn.Conv2d(in_size, hid1_size, k_conv_size ),
            nn.BatchNorm2d(hid1_size),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2))

        self.layer2 = nn.Sequential(
            nn.Conv2d(hid1_size, hid2_size, k_conv_size),
            nn.BatchNorm2d(hid2_size),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2))

        self.fc = nn.Linear(hid2_size *  k_conv_size * k_conv_size, out_size)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.fc(out)

        return out

我将输出大小从 16 更改为 32,将下一层的输出大小从 32 更改为 64,它仍然有效。但是当我调整张量的大小以具有 [8, 3, 64, 64] 的形状时,它会抛出一个不匹配错误,说size mismatch, m1: [16 x 5408], m2: [800 x 4] 我理解 m2 是它所期望的,而 m1 是我给出的。

但我不明白 m2 和 m1 的值来自哪里以及如何相应地更改 hid1_size 。

在构建规则线性层时,我了解输入数据的形状与第一层中的神经元之间的关系,但是如何定义输入的形状与 cnns 中卷积层产生的通道数之间的关系?

1个回答

我建议您阅读 深度学习卷积算法指南在那里你可以找到关于根据内核大小、步幅、膨胀等计算层的大小的非常好的书面解释。

print(x.shape)此外,您可以通过在前向传递中添加一个简单的语句并调整完全连接层中的神经元数量,轻松地在 pytorch 中获得中间形状。

最后但并非最不重要的。当您将输入大小从 32x32 更改为 64x64 时,您的最终卷积层的输出在每个维度(高度、宽度)中也将具有大约两倍的大小(取决于内核大小和填充),因此您将数字增加四倍(双倍 x 双倍)线性层所需的神经元。