【问题标题】:How to do atrous convolution in tensorflow 2 (tf.keras)如何在 tensorflow 2 (tf.keras) 中进行空洞卷积
【发布时间】:2021-02-12 15:39:55
【问题描述】:

我正在尝试将一些代码从 tensorflow 1.x 转换为 tensorflow 2.x。 到目前为止进展顺利,但我被困在空洞卷积上。与其他层不同,似乎没有一对一的转换。

到目前为止,我一直在将所有内容统一到 tf.keras。有一个纯 keras 实现 here 和一个 tf.nn.atrous_conv2d 实现 here 但我也不确定是否可以在 tf.keras.Model 功能 api 中使用它们。

代码如下:

with tf.variable_scope('aconv1d_' + name):
        shape = [None, 30, 128]
        kernel = tf.get_variable('kernel', (1, size, shape[-1], n_filters), dtype=tf.float32,
                                 initializer=tf.contrib.layers.xavier_initializer())
        if bias:
            b = tf.get_variable('b', [shape[-1]], dtype=tf.float32, initializer=tf.constant_initializer(0))
        out = tf.nn.atrous_conv2d(tf.expand_dims(input_tensor, dim=1), kernel, rate=rate, padding='SAME') + (
            b if bias else 0)
        out = tf.squeeze(out, [1])

        return out

我只想转换它,将其粘贴到 keras 功能 api 中,执行 model.fit,然后运行。

感谢您帮助像我这样的菜鸟。

【问题讨论】:

  • 您需要在tf.nn.conv2d 中使用dilations 参数或在tf.keras.layers.Conv2D 中使用dilation_rate
  • 感谢您的回答。我也一直在看这个,但是我该怎么做呢?我想要完全相同的结果,而输入不同的事实让我感到困惑。在 tf.nn.atrous_conv2d 中,它们将 4D 向量(内核)作为输入,而 tf.keras.layers.Conv2D 则不是这种情况。再次感谢您的宝贵时间。 @SusmitAgrawal
  • 在这种情况下,请使用tf.nn.conv2d。它使用您正在寻找的 4D 内核格式。
  • 我可以在 keras 序列中使用它吗?我认为所有事情都必须在 Keras 中完成才能进行 model.fit。
  • 只要你使用tf.keras、TF2 和函数式 API / Model 子类化,应该没有任何问题。

标签: tensorflow machine-learning keras tensorflow2.0 tf.keras


【解决方案1】:

由于参数“dilation_rate”,Atrous Convolution 或 Dilated Convolution 在 tensorflow2.x 版本中已经可用。默认情况下,它设置为(1,1),如果您查看https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D。将其修改为其他值,例如(2,2),您将得到扩张/空洞卷积。

【讨论】:

  • 感谢您的回答。这是一个后续问题,与我上面评论的相同,但为了您的查看方便,重新评论了。我也一直在看,但是我该怎么做呢?我想要完全相同的结果,而输入不同的事实让我感到困惑。在 tf.nn.atrous_conv2d 中,它们将 4D 向量(内核)作为输入,而 tf.keras.layers.Conv2D 则不是这种情况。再次感谢您的宝贵时间。
  • 是这样的,因为如果你仔细看解释,你会得到: input_shape = (4, 28, 28, 3) (batch_size,height,width,number_of_channels),所以正是 input_shape( 4)。另外,请查看此处以了解当有人回答您的问题时该怎么做,这对您有帮助:stackoverflow.com/help/someone-answers
  • 你是说我可以用:tf.keras.layers.Conv2D(filters=4,kernel_size = (size, shape[-1]), dillation_rate=rate, initializer=tf.keras.initializers.GlorotUniform())代替tf.nn.atrous_conv2d(tf.expand_dims(input_tensor, dim=1), kernel, rate=rate, padding='SAME')吗?
  • 另外,关于投票和接受解决方案:我还没有足够的声誉来支持你的答案(我试过了,但我今天才加入哈哈),我会更多一旦我弄清楚了,就很乐意接受您的解决方案。我想我很接近了!感谢您的耐心等待,也很抱歉成为这样的菜鸟。
  • 没问题,我们都是来学习的!我不希望你接受它,除非它真的帮助解决了你的问题。
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2018-02-15
  • 1970-01-01
相关资源
最近更新 更多