我知道kera中有Conv2DTranspose可用于Image。我们需要在NLP中使用它,因此需要一维反卷积。
我们如何在keras中实现Conv1DTranspose?
答案 0 :(得分:7)
使用keras后端将输入张量拟合到2D转置卷积。不要总是使用转置操作,因为它会耗费大量时间。
import keras.backend as K
from keras.layers import Conv2DTranspose
def Conv1DTranspose(input_tensor, filters, kernel_size, strides=2, padding='same'):
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
答案 1 :(得分:4)
在我的回答中,我想你以前使用Conv1D进行卷积。
Conv2DTranspose是Keras2中的新功能,它曾经是由UpSampling2D和卷积层组合完成的。在StackExchange [数据科学]中有一个关于what are deconvolutional layers的非常有趣的讨论(一个答案包括非常有用的动画GIF)。
查看有关"Why all convolutions (no deconvolutions) in "Building Autoencoders in Keras"有趣的讨论。这里有一段摘录:“正如弗朗索瓦已经多次解释过的那样,反卷积层只是一个带有上采样的卷积层。我认为没有正式的反卷积层。结果是一样的。” (讨论继续进行,可能是它们大致相同,不一样 - 从那时起,Keras 2引入了Conv2DTranspose)
我理解它的方式,UpSampling1D和Convolution1D的组合是您正在寻找的,我认为没有理由去2D。
如果您想使用Conv2DTranspose,则需要先将输入从1D重新设置为2D,例如
。User
使用Conv2DTranspose的不方便的部分是你需要指定seq_length而不能将它作为None(任意长度系列) 不幸的是,对于TensorFlow后端的UpSampling1D也是如此(Theano似乎在这里再次变得更好 - 太糟糕了它不会出现在附近)
答案 2 :(得分:0)
您可以重塑它以占用额外的尺寸,运行反卷积,然后重新整形。在实践中,这是有效的。但是,如果它有任何理论意义,我并没有真正想到这一点(但理论上似乎也很好,因为你不会去#34;在这个方面进行卷入
x = Reshape( ( -1, 1 ) )( x )
x = Permute( ( 3, 1, 2 ) )( x )
x = Conv2DTranspose( filters, kernel )( x )
x = Lambda( K.squeeze, arguments={"axis":1} )( x )
答案 3 :(得分:0)
在TensorFlow v2.2.0中,Conv1DTranspose层已在tf.keras.layers API中实现。 Check it out!