tensorflow 2.0 卷积层中的自定义填充

custom padding in convolution layer of tensorflow 2.0

在 Pytorch 中,nn.conv2d() 的填充参数允许用户输入选择的填充大小(如 p=n)。 TensorFlow 没有这样的等价物。我们如何才能实现类似的定制?如果设计一个小型网络,使用常用的 CNN 层(如池和 FC)来演示如何从输入层开始,将不胜感激。

您可以使用 tf.pad,然后使用无(“有效”)填充的卷积。这是一个简单的例子:

inp = tf.keras.Input((32, 32, 3)) # e.g. CIFAR10 images
custom_padded = tf.pad(inp, ((0, 0), (2, 0), (2, 0), (0, 0)))
conv = tf.keras.layers.Conv2D(16, 3)(custom_padded)  # default padding is "valid"

model = tf.keras.Model(inp, conv)

填充的语法可能需要一些时间来适应,但基本上每个二元组代表一个维度(批次、宽度、高度、过滤器),在每个二元组中,第一个数字是要填充多少个元素在前面垫,第二个在后面垫多少。所以在这种情况下:

  • 批处理轴中没有填充
  • 宽度轴左边2个元素,右边0个元素
  • 顶部 2 个元素,高度轴底部 0 个元素
  • 通道轴无填充

在此示例中,我们使用了 16 个过滤器,过滤器大小为 3。通常这需要在每一侧填充 1 个元素以实现“相同”填充,但在这里我们决定在一侧填充 2 个元素一侧,另一侧为 0。这当然可以适用于您 want/need.

的任何其他方案

这默认使用 0 填充,但您可以在 pad 函数中更改它。请参阅文档:https://www.tensorflow.org/api_docs/python/tf/pad

请注意,我省略了池化层或其他层,因为这应该很容易添加。基本配方只是用 pad 加上没有填充的卷积替换卷积层。