在某些情况下,省略 CNN 中的池化层是否有意义?
Does omitting pooling layers in CNNs make sense in some cases?
我知道通常的 CNN 由卷积层和池化层组成。池化层使输出更小,这意味着更少的计算,并且它们还以某种方式使其变换不变,因此内核过滤器中的特征位置可以在原始图像中移动一点点。
但是当我不使用池化层时会发生什么?原因可能是我想要原始图像中每个像素的特征向量,因此卷积层的输出必须与图像大小相同,只是通道更多。这有意义吗?这些特征向量中是否还有有用的信息,或者在 CNN 中有池化层是必要的吗?或者是否有一些方法可以通过池化层获取单个像素的特征向量?
早期和后期的卷积特征图包含很多有用的信息。许多有趣和有趣的应用程序完全基于预训练的 CNN 的特征图,例如Google Deep Dream and Neural Style。预训练模型的常见选择是 VGGNet,因为它很简单。
还要注意一些 CNN,例如All Convolutional Net,用卷积层替换池化层。他们仍然通过跨步进行下采样,但完全避免了 maxpool 或 avgpool 操作。这个想法已经流行并应用在许多现代 CNN 架构中。
唯一的困难是没有下采样的 CNN 可能更难训练。您需要足够的训练数据,其中标签是图像(我假设您有),并且您还需要一些巧妙的反向传播损失函数。当然,你可以从像素差的L2范数开始,但这真的取决于你要解决的问题。
我的建议是采用现有的预训练 CNN(例如 VGGNet for tensorflow)并仅保留前两个卷积层,直到第一次下采样。这是尝试这种架构的快速方法。
我知道通常的 CNN 由卷积层和池化层组成。池化层使输出更小,这意味着更少的计算,并且它们还以某种方式使其变换不变,因此内核过滤器中的特征位置可以在原始图像中移动一点点。
但是当我不使用池化层时会发生什么?原因可能是我想要原始图像中每个像素的特征向量,因此卷积层的输出必须与图像大小相同,只是通道更多。这有意义吗?这些特征向量中是否还有有用的信息,或者在 CNN 中有池化层是必要的吗?或者是否有一些方法可以通过池化层获取单个像素的特征向量?
早期和后期的卷积特征图包含很多有用的信息。许多有趣和有趣的应用程序完全基于预训练的 CNN 的特征图,例如Google Deep Dream and Neural Style。预训练模型的常见选择是 VGGNet,因为它很简单。
还要注意一些 CNN,例如All Convolutional Net,用卷积层替换池化层。他们仍然通过跨步进行下采样,但完全避免了 maxpool 或 avgpool 操作。这个想法已经流行并应用在许多现代 CNN 架构中。
唯一的困难是没有下采样的 CNN 可能更难训练。您需要足够的训练数据,其中标签是图像(我假设您有),并且您还需要一些巧妙的反向传播损失函数。当然,你可以从像素差的L2范数开始,但这真的取决于你要解决的问题。
我的建议是采用现有的预训练 CNN(例如 VGGNet for tensorflow)并仅保留前两个卷积层,直到第一次下采样。这是尝试这种架构的快速方法。