Keras中,与tf.nn.conv2d_transpose中的Tensorflow对应的层(函数)是什么?我曾经看到过这样的评论:我们可以Just use combinations of UpSampling2D and Convolution2D as appropriate对吗?
在下面的两个例子中,它们都使用这种组合。
1)在Building Autoencoders in Keras中,作者按如下方式构建解码器。
python - 对应于tf.nn.conv2d_transpose的Keras层(函数)-LMLPHP
2)在au-uet implementation中,作者建立反褶积如下

up6 = merge([UpSampling2D(size=(2, 2))(conv5), conv4], mode='concat', concat_axis=1)
conv6 = Convolution2D(256, 3, 3, activation='relu', border_mode='same')(up6)
conv6 = Convolution2D(256, 3, 3, activation='relu', border_mode='same')(conv6)

最佳答案

Keras中对应的层是Deconvolution2D层。
值得一提的是,你应该对他们非常小心,因为他们有时可能会表现得出人意料。我强烈建议您在开始使用此层之前阅读this堆栈溢出问题(及其答案)。
更新:
反褶积是一个最近才加入的层,也许这就是人们建议你使用Convolution2D * UpSampling2D的原因。
因为它相对较新-在某些情况下可能无法正常工作正确使用它们还需要一些经验。
事实上,从数学的角度来看,每一次反褶积都可能是由Convolution2DUpSampling2D组成的,所以这可能就是你提供的文本中提到它的原因。
更新2:
好啊。我想我找到了一个简单的解释,为什么Deconvolution2D可能以Convolution2DUpSampling2D的组合形式出现我们将使用一个定义,Deconvolution2D是一些卷积层的梯度让我们考虑三种最常见的情况:
最简单的是一个没有任何池的Convolutional2D在这种情况下-因为它是线性运算-它的梯度本身就是一个函数-所以Convolution2D
更棘手的是Convolution2DAveragePooling的梯度。所以:(AveragePooling2D * Convolution2D)' = AveragePooling2D' * Convolution2D'。但是梯度是AveragePooling2D = UpSample2D * constant-所以在这种情况下,介词也是真的。
最棘手的是一个MaxPooling2D。在这种情况下仍然(MaxPooling2D * Convolution2D)' = MaxPooling2D' * Convolution2D'MaxPooling2D' != UpSample2D。但是在这种情况下,我们可以很容易地找到一个容易的Convolution2D使得MaxPooling2D' = Convolution2D * UpSample2D(直观地说,MaxPooling2D的梯度是一个只有一个1在其对角线上的零矩阵因为Convolution2D可能表示矩阵运算-它也可能表示从同一矩阵到MaxPooling2D梯度的注入所以:
(MaxPooling2D * Convolution2D)' = UpSampling2D * Convolution2D * Convolution2D = UpSampling2D * Convolution2D'
最后一点是,证明的所有部分都表明Deconvolution2DUpSampling2DConvolution2D的组合,而不是相反的组合我们可以很容易地证明,组成UpSampling2DConvolution2D的每一个函数都可以很容易地以组成UpSampling2DConvolution2D的形式表示。所以基本上-证明已经完成了:)

10-02 15:45