如何在 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 层中实现 GlobalMinPool2D 函数?