首页 > 解决方案 > 我的卷积神经网络如何只给通道数而没有高度和宽度?

问题描述

你好,我对深度学习社区有点陌生,我真的厌倦了如何通过神经网络输入数据。所以我在做 sentdex pytorch 系列,我在学习 convnets。他在 kaggle 上使用了微软的猫狗数据集。他将图像的大小调整为 50 x 50 并将它们变成灰度。如果你想看视频来回答我的问题,那就是 - https://pythonprogramming.net/convnet-model-deep-learning-neural-network-pytorch/

因此,在观看视频时,我的脑海中浮现了一些想法。他传递的输入只是图像的颜色通道——

在此处输入图像描述

看到他输入的输入,我立刻想到了为什么他只传递灰度图像的通道数。当一个 conv2d 需要 3 个输入时。 在此处输入图像描述

我的意思是它确实有效。我尝试进行了一些研究,但没有找到对此处输入的输入形状的良好解释

所以我对此有两个想法和问题-

标签: pythonneural-networkpytorch

解决方案


卷积层使用卷积操作,即在输入上滑动内核(矩阵),并在滑动时对每个位置的元素乘积求和。因此,输入维度会影响输出维度,但是,输入维度没有必要固定。

因此,该层可以定义为nn.Conv2d(1, 32, 5)其中 1 表示输入通道数,32 表示输出通道数,5 是内核的大小(在这种情况下是 5x5,因为它是 2D)。

32 个输出通道实际上意味着将有 32 个这样的5x5 内核应用于输入,每个输出将被堆叠以获得hx wx 32 的输出。请注意hw在不使用填充,但如果使用填充,则相同。h_inw_in

层中提到的 1 个输入通道意味着该层将仅接受单通道输入(实际上是灰度图像)。

如果您想限制您的 CNN 仅使用 (50, 50, 1) 输入,那么您可以在输入图像之前调整图像大小(您可以使用 OpenCV 做到这一点)。

检查此站点以获取一些卷积动画。

更新:在 OP 的评论中添加更多内容。

是的,您可以输入任何形状的图像(我想它们仍然必须至少是内核的大小)。因此,理论上,您可以将任何图像输入到卷积层,但不一定输入到您的 CNN。这是因为 CNN 可能有展平操作,然后是全连接层 ( nn.Linear)。这些展平+全连接将需要某些尺寸(由您在代码中固定),因此您不能将任何输入图像提供给您的 CNN,即您必须确保展平最后一个卷积层的输出具有等于您的第一个全连接的尺寸层的尺寸。

编辑:即使对于包含全连接层的 CNN,您实际上也可以提供任何大小的输入,方法是使用全局平均池化 (GAP) 层将大小减小到固定大小,而与输入大小无关。在 PyTorch中称为自适应平均池化。

例如,考虑这个网络(附图)在此处输入图像描述 ,在这个网络中,卷积核的大小在箭头下方提到,蓝色的长方体代表每个卷积层之后的输出。最后,有固定尺寸的全连接层(带圆圈的盒子)。因此,最后一个卷积层输出的维度为 6 6 256 = 9216,这也是第一个全连接层的维度。

所以,基本上,你设计你的网络,使最后一个卷积输出扁平化与第一个全连接层具有相同的尺寸。请注意,有一些称为全卷积网络 (FCN) 的网络不使用这些全连接层,因此与输入大小无关。网络设计和层的选择取决于您的应用程序。


推荐阅读