【问题标题】:custom padding in convolution layer of tensorflow 2.0tensorflow 2.0卷积层中的自定义填充
【发布时间】:2021-11-05 12:36:34
【问题描述】:

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

【问题讨论】:

    标签: python-3.x tensorflow keras deep-learning tensorflow2.0


    【解决方案1】:

    您可以使用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 元组中,第一个数字是要填充多少元素前面,第二个在后面垫多少。所以在这种情况下:

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

    在此示例中,我们使用了 16 个过滤器,过滤器大小为 3。通常这需要在每侧填充 1 个元素以实现“相同”填充,但这里我们决定在一侧填充 2 个元素,并且另一方面为 0。这当然可以适应您想要/需要的任何其他方案。

    默认情况下使用 0 填充,但您可以在 pad 函数中更改它。查看文档:https://www.tensorflow.org/api_docs/python/tf/pad

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

    【讨论】:

    • 感谢您回答我的问题。我只是有另一个疑问。告诉我是否有这个权利。就像您在示例中显示的方式一样,首先,我们应用填充,然后将其传递给 conv 层。如果我必须再次在 conv 的输出上放置填充,然后再次通过 conv2d 传递它。代码会是这样吗?。
    • custom_pad = tf.pad(conv, ((0, 0), (2, 0), (2, 0), (0, 0))) | conv2 = tf.keras.layers.conv2d(32,3)(custom_pad)
    • 是的。最佳实践可能是定义一个函数conv_with_custom_pad,它接受输入,应用tf.pad 和卷积层,并返回层的结果。然后,您可以在模型构建中使用此函数替换带有填充的卷积层。顺便说一句,我还鼓励您单独测试tf.pad 以探索它的行为,这样您就可以确定您知道它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2020-11-04
    • 2018-08-04
    • 2017-10-21
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多