在Keras
中,tf.nn.conv2d_transpose
中与Tensorflow
对应的图层(函数)是什么?我曾经看过我们Just use combinations of UpSampling2D and Convolution2D as appropriate
的评论。是吗?
在以下两个例子中,他们都使用这种组合。
1)在Building Autoencoders in Keras中,作者按如下方式构建解码器。
2)在u-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)
答案 0 :(得分:2)
Keras
中的相应图层是Deconvolution2D图层。
值得一提的是,你应该非常小心它们,因为它们有时可能会以意想不到的方式表现出来。在您开始使用此图层之前,我强烈建议您阅读this Stack Overflow问题(及其答案)。
<强>更新强>
Convolution2D * UpSampling2D
的原因。Convolution2D
和UpSampling2D
的形式呈现 - 所以也许这就是为什么在你提供的文本中提到它的原因。 / LI>
醇>
更新2:
确定。我想我找到了一个简单的解释,为什么Deconvolution2D
可能以Convolution2D
和UpSampling2D
的组合形式呈现。我们将使用Deconvolution2D
是某个卷积层的渐变的定义。让我们考虑三种最常见的情况:
Convolutional2D
没有任何合并。在这种情况下 - 因为它是线性操作 - 它的梯度本身就是一个函数 - 所以Convolution2D
。Convolution2D
和AveragePooling
的渐变。所以:(AveragePooling2D * Convolution2D)' = AveragePooling2D' * Convolution2D'
。但是AveragePooling2D = UpSample2D * constant
的渐变 - 所以在介词为真时也是如此。MaxPooling2D
。在这种情况下,仍为(MaxPooling2D * Convolution2D)' = MaxPooling2D' * Convolution2D'
但MaxPooling2D' != UpSample2D
。但在这种情况下,人们可以很容易地找到一个简单的Convolution2D
,它会MaxPooling2D' = Convolution2D * UpSample2D
(直观地说 - MaxPooling2D
的渐变是零矩阵,其对角线上只有一个1。作为{{1}可能表示矩阵运算 - 它也可能表示从单位矩阵到Convolution2D
梯度的注入。所以:
MaxPooling2D
。最后一点是证明的所有部分都表明(MaxPooling2D * Convolution2D)' = UpSampling2D * Convolution2D * Convolution2D = UpSampling2D * Convolution2D'
是Deconvolution2D
和UpSampling2D
的组合,而不是相反。可以很容易地证明,Convolution2D
和UpSampling2D
组合形式的每个功能都可以以Convolution2D
和UpSampling2D
的组合形式轻松呈现。所以基本上 - 证明已经完成:)