如何确定 Keras Conv2D 函数中的“过滤器”参数

Posted

技术标签:

【中文标题】如何确定 Keras Conv2D 函数中的“过滤器”参数【英文标题】:How To Determine the 'filter' Parameter in the Keras Conv2D Function 【发布时间】:2018-06-22 22:12:24 【问题描述】:

我刚刚开始我的机器学习之旅,并且已经完成了一些教程。 (对我来说)不清楚的一件事是如何为 Keras Conv2D 确定“过滤器”参数。

我读过的大多数资料都只是将参数设置为 32 而没有解释。这只是经验法则还是输入图像的尺寸起作用?例如,CIFAR-10 中的图像是 32x32

具体来说:

model = Sequential()
filters = 32
model.add(Conv2D(filters, (3, 3), padding='same', input_shape=x_train.shape[1:]))

model.add(Activation('relu'))
model.add(Conv2D(filters, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

下一层有filter*2或64的filter参数。同样,这是如何计算的?

发送。

【问题讨论】:

【参考方案1】:

实际上 - 您的问题没有很好的答案。大多数架构通常在许多实验中经过精心设计和微调。我可以与您分享一些在设计自己的架构时应该应用的经验法则:

    避免在第一层中维度折叠假设您的输入过滤器具有RGB 图像的(n, n) 空间形状。在这种情况下,最好将过滤器编号设置为大于n * n * 3,因为这是单个过滤器输入的维度。如果您设置较小的数字 - 您可能会受到以下事实的困扰:由于初始化丢失了信息维度,有关图像的许多有用信息会丢失。当然 - 这不是一般规则 - 例如对于图像复杂度较低的纹理识别 - 少量过滤器实际上可能会有所帮助。

    更多地考虑体积而不是过滤器数量 - 在设置过滤器数量时,重要的是要考虑体积变化而不是连续层之间过滤器数量的变化。例如。在VGG 中 - 即使在池化层之后过滤器的数量增加了一倍 - 实际特征图体积减少了 2 倍,因为池化将特征图减少了 4 的因子。通常将卷的大小减少 3 以上应被视为一种不好的做法。大多数现代架构使用介于 1 和 2 之间的体积下降因子。不过——这不是一般规则——例如在层级较窄的情况下 - 更大的音量下降值实际上可能会有所帮助。

    避免瓶颈。正如在这个里程碑paper 中所读到的那样,瓶颈可能会严重损害您的培训过程。当音量下降太严重时会发生这种情况。当然 - 这仍然可以实现 - 但是你应该使用智能下采样,例如使用在Inception v>2

    检查 1x1 卷积 - 人们认为过滤器激活高度相关。可以通过使用 1x1 卷积来利用它 - 即过滤器大小为 1 的卷积。这使得例如音量由它们而不是pooling 或智能下采样(参见示例here)。你可以例如再构建两次过滤器,然后使用 1x1 卷积作为连续层来削减 25%。

如您所见。没有简单的方法来选择过滤器的数量。除了上面的提示,我想与你分享我最喜欢的关于过滤器数量的健全性检查之一。只需两个简单的步骤:

    尝试使用正则化对 500 个随机图像进行过拟合。 尝试在不进行任何正则化的情况下过度拟合整个数据集。

通常 - 如果过滤器的数量太少(通常) - 这两个测试会告诉你这一点。如果 - 在你的训练过程中 - 通过正则化 - 你的网络严重过度拟合 - 这清楚地表明你的网络有太多的过滤器。

干杯。

【讨论】:

感谢您的见解。 @Marcin,顺便说一句,input_filter 你的意思是 kernel size,对吧?还是 image dimensions【参考方案2】:

过滤器的数量是根据任务的复杂性来选择的。更复杂的任务需要更多的过滤器。通常每层过滤器的数量都会增加(例如128 -> 256 -> 512)。第一层(过滤器数量较少)捕获图像的一些简单特征(边缘、色调等),而下一层试图在简单特征的基础上获得更复杂的特征。

斯坦福有nice course,让你直观了解CNN。

【讨论】:

以上是关于如何确定 Keras Conv2D 函数中的“过滤器”参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Conv2D 层中使用 keras 指定填充?

keras.layers.Conv2D中过滤器参数中keras使用了哪些类型的“过滤器”?

如何正确从 keras 中的 Conv2D 获取层权重?

Keras Conv2D:过滤器与 kernel_size

keras.layers.Conv2D的默认内核大小,零填充和步幅是什么?

如何在 Tensorflow 2 中获取 Conv2D 内核值