【发布时间】:2021-11-05 12:36:34
【问题描述】:
在 Pytorch 中,nn.conv2d() 的填充参数允许用户输入选择的填充大小(如 p=n)。 TensorFlow 没有这样的等价物。我们如何才能实现类似的定制?如果设计一个小型网络,使用池化和 FC 等常用 CNN 层来演示如何从输入层开始,将不胜感激。
【问题讨论】:
标签: python-3.x tensorflow keras deep-learning tensorflow2.0
在 Pytorch 中,nn.conv2d() 的填充参数允许用户输入选择的填充大小(如 p=n)。 TensorFlow 没有这样的等价物。我们如何才能实现类似的定制?如果设计一个小型网络,使用池化和 FC 等常用 CNN 层来演示如何从输入层开始,将不胜感激。
【问题讨论】:
标签: python-3.x tensorflow keras deep-learning tensorflow2.0
您可以使用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 元组代表一个维度(批次、宽度、高度、过滤器),在每个 2 元组中,第一个数字是要填充多少元素前面,第二个在后面垫多少。所以在这种情况下:
在此示例中,我们使用了 16 个过滤器,过滤器大小为 3。通常这需要在每侧填充 1 个元素以实现“相同”填充,但这里我们决定在一侧填充 2 个元素,并且另一方面为 0。这当然可以适应您想要/需要的任何其他方案。
默认情况下使用 0 填充,但您可以在 pad 函数中更改它。查看文档:https://www.tensorflow.org/api_docs/python/tf/pad
请注意,我省略了池化或其他层,因为这应该很容易添加。基本配方只是将卷积层替换为pad 加上没有填充的卷积。
【讨论】:
conv_with_custom_pad,它接受输入,应用tf.pad 和卷积层,并返回层的结果。然后,您可以在模型构建中使用此函数替换带有填充的卷积层。顺便说一句,我还鼓励您单独测试tf.pad 以探索它的行为,这样您就可以确定您知道它是如何工作的。