在Keras
中,Tensorflow
中tf.nn.conv2d_transpose
对应的层(函数)有哪些?我曾经看到评论说我们可以 Just use combination 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)
最佳答案
Keras
中对应的层是Deconvolution2D层。
值得一提的是,您应该非常小心地对待它们,因为它们有时可能会以意想不到的方式行事。我强烈建议你阅读 this开始使用该层之前的 Stack Overflow 问题(及其答案)。
更新:
- Deconvolution 是最近添加的一个层 - 也许这就是人们建议您使用
Convolution2D * UpSampling2D
的原因。 - 因为它相对较新 - 在某些情况下可能无法正常工作。正确使用它们也需要一些经验。
- 事实上 - 从数学的角度来看 - 每个反卷积都可以表示为
Convolution2D
和UpSampling2D
的组合 - 所以也许这就是它被提及的原因在您提供的文本中。
更新 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 的矩阵。因为Convolution2D
可能表示矩阵运算 - 它也可能表示从单位矩阵到MaxPooling2D
梯度的注入(inject))。所以:(MaxPooling2D * Convolution2D)' = UpSampling2D * Convolution2D * Convolution2D = UpSampling2D * Convolution2D'
。
最后要说的是,证明的所有部分都表明Deconvolution2D
是UpSampling2D
和Convolution2D
的组合,而不是相反。可以很容易地证明,UpSampling2D
和 Convolution2D
的组合形式的每个函数都可以很容易地以 UpSampling2D
和Convolution2D
。所以基本上 - 证明已经完成:)
关于python - 对应于 tf.nn.conv2d_transpose 的 Keras 层(函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42144191/