如何在 keras 中实现 Conv1DTranspose?

Posted

技术标签:

【中文标题】如何在 keras 中实现 Conv1DTranspose?【英文标题】:How to Implement the Conv1DTranspose in keras? 【发布时间】:2017-10-19 01:29:29 【问题描述】:

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

我们

【问题讨论】:

【参考方案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)

按照我的理解,UpSampling1D 和 Convolution1D 的组合就是你要找的,我认为没有理由去 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 )

【讨论】:

以上是关于如何在 keras 中实现 Conv1DTranspose?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras 模型中实现汉明损失作为自定义指标

如何在 Keras 中实现高斯模糊层?

如何在 keras 层中实现 GlobalMinPool2D 函数?

如何在 Keras 中实现分层 Transformer 用于文档分类?

如何在 keras 中实现 ssim 的损失函数?

如何从零开始在 Keras 中实现 Leaky ReLU? [关闭]