在某些情况下,省略卷积神经网络中的池化层是否有意义?

5
我知道常规的卷积神经网络包含卷积层和池化层。池化层使输出较小,因此需要更少的计算量,并且它们可以使输出对位置变化具有一定的不变性,这意味着核过滤器中特征的位置可以在原始图像中稍微移动一下。
但是如果我不使用池化层会发生什么?可能的原因是我想要每个原始图像像素的特征向量,因此卷积层的输出必须与图像大小相同,只是通道更多。这样做有意义吗?这些特征向量中是否仍然有有用的信息,或者在CNN中使用池化层是必要的?或者有一些方法可以在使用池化层的情况下获得单个像素的特征向量吗?
2个回答

1
Convolutional特征图,早期和后期的特征图,包含了非常多有用的信息。许多有趣和有意义的应用正是基于预训练CNN的特征图,例如Google Deep DreamNeural Style。一个常见的预训练模型选择是VGGNet,因为它很简单。
另外请注意,一些CNN,例如All Convolutional Net,用卷积层替换池化层。它们仍然通过步幅进行下采样,但完全避免maxpool或avgpool操作。这个想法已经变得流行,并应用于许多现代CNN架构中。
唯一的困难是没有下采样的CNN可能更难训练。您需要足够的训练数据,其中标签是图像(我假设您拥有),并且您还需要一些聪明的损失函数用于反向传播。当然,您可以从像素差的L2范数开始,但这确实取决于您正在解决的问题。
我的建议是使用现有的预训练CNN(例如tensorflow的VGGNet),并仅保留前两个卷积层,直到第一次下采样。这是尝试这种架构的快速方法。

这些是没有池化层但仍有一些下采样的CNN。如果我根本不使用任何下采样会怎样?因此,如果输入是256x256x3图像,则输出将为256x256xN(每个像素的大小为N的特征向量)。它仍然具有信息并且是变换不变的吗?我的观点是使用此特征向量检测图像中具有特定邻域的某个像素。我不想使用传统的滑动窗口方法,因为整个图像的纹理会导致这个像素,如果我只使用滑动窗口,这些信息将会丢失。 - T.Poe
早期的卷积层可能不具有变换不变性,这是真的,但仍然包含有用的信息 - 这就是我的观点。很难预先确定早期特征图是否适用于您的数据您的任务。但如果不适用,您也可以考虑使用卷积进行下采样+上采样,以获得所需大小的特征图。 - Maxim
这可能是另一个问题,但你不知道在第一次下采样之前有一些具有两个以上层的模型吗?(已经像你在答案中发布的VGGNet一样进行了训练)@Maxim - T.Poe
我所知道的所有著名神经网络在向下采样之前都使用1-2层,我认为这是因为它们的主要目标是分类准确性,而2层足够灵活:更多的灵活性并不会导致更高的准确性。但是它们通常会在网络的后面使用更多的层。 - Maxim

0

问题1:我想从图像的每个像素中获取特征。

回答:图像像素通常高度相关,从每个像素获取特征几乎没有用处,因此一种重要的方法是在补偿抖动的同时沿着池化方向看到高度相关的空间批次中的一个像素。但话说回来,这并不是必须的。

问题2:这些特征向量中会有有用的信息吗?

回答:我们通常使图像的高度和宽度在层中变小,并增加通道数,原因是输出层的高度x宽度越大,空间信息就越明确。因此,使每个层的输出更深入通道但尺寸更小,使其失去空间信息,并具有更多语义上适当的编码,独立于位置,例如识别图像是否有猫不应取决于猫的位置或大小,而应该取决于猫的特征,如耳朵的形状、颜色模式、毛发等。

但是您可以通过步幅> 1的卷积进行相同的采样。

我们的主要思想是使包含在图像中的信息通过网络流动,但具有更小的尺寸和更深入的表示。

另外,应用程序也会产生很大的差异,例如去噪需要精确构建图像,因此您在重构时受到大小限制。

分类会压平图像映射,因此有不同的考虑。

还要注意CNN中图像映射中的信息量可以被保留(HxWx通道),并且可以在减少/增加乘数的同时保持产品相同。

最后一行获取单个像素的特征向量对我来说没有太多意义。像素本身就是一些低级特征,通常我们感兴趣的是获取一组像素的高级特征。如果您想更好地保留像素特征,请直接使用像素值。或者我漏掉了什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接