在这里我们可以看到前两个 Conv2D 层的步幅为 1×1。 最终的 Conv2D 层; 然而,它代替了最大池化层,而是通过跨步卷积减少了输出体积的空间维度。
2014 年,Springenber 等人。 发表了一篇题为 Striving for Simplicity: The All Convolutional Net 的论文,该论文证明在某些情况下用跨步卷积替换池化层可以提高准确性。
ResNet 是一种流行的 CNN,已经接受了这一发现——如果您查看 ResNet 实现的源代码(或自己实现它),您会看到 ResNet 响应跨步卷积而不是最大池化以减少两者之间的空间维度 残余模块。
==================================================================
图5: 应用于带有填充的图像的 3×3 内核。 Keras Conv2D 填充参数接受“valid”(无填充)或“same”(填充 + 保留空间维度)。 此动画贡献给 StackOverflow。
Keras Conv2D 类的填充参数可以采用以下两个值之一: valid 或 same 。 使用有效参数,输入体积不会被零填充,并且空间维度可以通过卷积的自然应用减少。 下面的例子自然会减少我们体积的空间维度:
model.add(Conv2D(32, (3, 3), padding=“valid”))
如果您想要保留体积的空间尺寸,以便输出体积大小与输入体积大小匹配,那么您需要为 padding 提供“same”的值:
model.add(Conv2D(32, (3, 3), padding=“same”))
虽然默认的 Keras Conv2D 值是有效的,但我通常会将其设置为网络中大多数层的相同值,
然后通过以下任一方式减少我的体积的空间维度:
最大池化
- 跨步卷积
我建议您也使用类似的方法来填充 Keras Conv2D 类。
=======================================================================
图 6: Keras 作为高级框架,支持多个深度学习后端。 因此,它包括对“channels last”和“channels last”通道排序的支持。
Conv2D 类中的数据格式值可以是 channels_last 或 channels_first : Keras 的 TensorFlow 后端使用最后排序的通道。 Theano 后端使用通道优先排序。
由于以下两个原因,您通常不必像 Keras 那样触及此值:
- 您很有可能使用 TensorFlow 后端到 Keras
- 如果没有,你可能已经更新了你的 ~/.keras/keras.json 配置文件来设置你的后端和相关的频道排序
我的建议是永远不要在你的 Conv2D 类中明确设置 data_format ,除非你有很好的理由这样做。
=========================================================================
Figure 7: Keras 深度学习 Conv2D 参数 dilation_rate 接受一个 2 元组整数来控制膨胀卷积。
Conv2D 类的 dilation_rate 参数是一个二元组整数,控制膨胀卷积的膨胀率。 扩张卷积是一种基本卷积,仅应用于具有定义间隙的输入体积,如上图 7 所示。 您可以在以下情况下使用扩张卷积:
1、您正在处理更高分辨率的图像,但细粒度的细节仍然很重要
2、 您正在构建一个参数较少的网络
=====================================================================
图8: Keras 提供了许多常见的激活函数。 Conv2D 的激活参数是一个方便的问题,它允许指定卷积后使用的激活函数。
Conv2D 类的激活参数只是一个方便的参数,允许您提供一个字符串,指定执行卷积后要应用的激活函数的名称。 在以下示例中,我们执行卷积,然后应用 ReLU 激活函数:
model.add(Conv2D(32, (3, 3), activation=“relu”))
等效于:
model.add(Conv2D(32, (3, 3)))
model.add(Activation(“relu”))
我的建议? 如果您可以使用激活参数,并且它有助于保持您的代码更清晰——这完全取决于您,并且不会影响您的卷积神经网络的性能。
=============================================