【问题标题】:How to Implement the Conv1DTranspose in keras?如何在 keras 中实现 Conv1DTranspose?
【发布时间】:2023-03-28 10:20:02
【问题描述】:

我知道 keras 中有 Conv2DTranspose 可以在 Image 中使用。我们需要在 NLP 中使用它,因此需要进行 1D 反卷积。

我们如何在 keras 中实现 Conv1DTranspose?

【问题讨论】:

    标签: keras keras-layer


    【解决方案1】:

    使用 keras 后端将输入张量拟合到 2D 转置卷积。不要总是使用转置操作,因为它会消耗很多时间。

    import keras.backend as K
    from keras.layers import Conv2DTranspose, Lambda
    
    
    def Conv1DTranspose(input_tensor, filters, kernel_size, strides=2, padding='same'):
        """
            input_tensor: tensor, with the shape (batch_size, time_steps, dims)
            filters: int, output dimension, i.e. the output tensor will have the shape of (batch_size, time_steps, filters)
            kernel_size: int, size of the convolution kernel
            strides: int, convolution step size
            padding: 'same' | 'valid'
        """
        x = Lambda(lambda x: K.expand_dims(x, axis=2))(input_tensor)
        x = Conv2DTranspose(filters=filters, kernel_size=(kernel_size, 1), strides=(strides, 1), padding=padding)(x)
        x = Lambda(lambda x: K.squeeze(x, axis=2))(x)
        return x
    

    【讨论】:

    • 来自评论:虽然答案总是很受欢迎,但它确实有助于提供一些有关您的代码如何解决手头问题的信息。不是每个人都熟悉您的确切编码逻辑,但可能了解您的一般方法概念。为了帮助改进您的答案,请提供一些context surrounding it,并查看writing great answers 上的帮助文章以获取有关如何使您的答案重要的一些提示:)
    • @ObsidianAge 我同意。这是一个很好的答案,我想……但我真的可以不加解释地相信它吗?
    • 嗨,输入张量应该是什么,Lambda函数是如何定义的??
    【解决方案2】:

    在我的回答中,我想您之前使用 Conv1D 进行卷积。

    Conv2DTranspose 是 Keras2 中的新功能,过去它的工作是通过 UpSampling2D 和卷积层的组合来完成的。在 StackExchange[Data Science] 中有一个关于 what are deconvolutional layers 的非常有趣的讨论(一个答案包括非常有用的动画 gif)。

    查看这个关于"Why all convolutions (no deconvolutions) in "Building Autoencoders in Keras" 的讨论很有趣。这是一段摘录:“正如弗朗索瓦已经多次解释的那样,反卷积层只是一个带有上采样的卷积层。我认为没有官方的反卷积层。结果是一样的。” (讨论还在继续,可能它们是大致相同的,并不完全相同——而且,从那时起,Keras 2 引入了 Conv2DTranspose)

    按照我的理解,UpSampling1DConvolution1D 的组合就是你要找的,我认为没有理由去 2D。

    但是,如果您想使用 Conv2DTranspose,则需要首先将输入从 1D 重塑为 2D,例如

    model = Sequential()
    model.add(
        Conv1D(
            filters = 3, 
            kernel_size = kernel_size, 
            input_shape=(seq_length, M),#When using this layer as the first layer in a model, provide an input_shape argument 
        )
    )
    model.add(
        Reshape( ( -1, 1, M) )
    )
    model.add(
        keras.layers.Conv2DTranspose(
            filters=M,
            kernel_size=(10,1),
            data_format="channels_last"
        )
    )
    

    使用 Conv2DTranspose 的不便之处在于您需要指定 seq_length 并且不能将其设置为 None (任意长度系列) 不幸的是,用于 TensorFlow 后端的 UpSampling1D 也是如此(Theano 在这里似乎再次变得更好 - 可惜它不会出现)

    【讨论】:

    • 您应该再次检查您提到的问题。人们已经解释了反卷积和卷积加上采样之间的区别。
    【解决方案3】:

    在 TensorFlow v2.2.0 中,Conv1DTranspose 层已在 tf.keras.layers API 中实现。 Check it out!

    【讨论】:

      【解决方案4】:

      您可以对其进行整形以占据额外的维度,运行反卷积,然后将其重新整形。在实践中,这是可行的。但是我并没有认真考虑它是否有任何理论意义(但理论上它似乎也很好,因为你不会在那个维度上“卷积”

      x = Reshape( ( -1, 1 ) )( x )
      x = Permute( ( 3, 1, 2 ) )( x )
      x = Conv2DTranspose( filters, kernel )( x )
      x = Lambda( K.squeeze, arguments={"axis":1} )( x )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 2017-03-07
        • 2017-06-28
        • 2019-07-03
        • 2017-09-30
        相关资源
        最近更新 更多