Keras层(函数)对应于tf.nn.conv2d_transpose

时间:2017-02-09 18:23:31

标签: python tensorflow neural-network deep-learning keras

Keras中,tf.nn.conv2d_transpose中与Tensorflow对应的图层(函数)是什么?我曾经看过我们Just use combinations of UpSampling2D and Convolution2D as appropriate的评论。是吗?

在以下两个例子中,他们都使用这种组合。

1)在Building Autoencoders in Keras中,作者按如下方式构建解码器。

enter image description here

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)

1 个答案:

答案 0 :(得分:2)

Keras中的相应图层是Deconvolution2D图层。

值得一提的是,你应该非常小心它们,因为它们有时可能会以意想不到的方式表现出来。在您开始使用此图层之前,我强烈建议您阅读this Stack Overflow问题(及其答案)。

<强>更新

  1. 反卷积是一个相对最近添加的层 - 也许这就是人们建议你使用Convolution2D * UpSampling2D的原因。
  2. 因为它相对较新 - 在某些情况下可能无法正常工作。它还需要一些经验才能正确使用它们。
  3. 事实上 - 从数学的角度来看 - 每个反卷积可能会以Convolution2DUpSampling2D的形式呈现 - 所以也许这就是为什么在你提供的文本中提到它的原因。 / LI>

    更新2:

    确定。我想我找到了一个简单的解释,为什么Deconvolution2D可能以Convolution2DUpSampling2D的组合形式呈现。我们将使用Deconvolution2D是某个卷积层的渐变的定义。让我们考虑三种最常见的情况:

    1. 最简单的是Convolutional2D没有任何合并。在这种情况下 - 因为它是线性操作 - 它的梯度本身就是一个函数 - 所以Convolution2D
    2. 更棘手的是Convolution2DAveragePooling的渐变。所以:(AveragePooling2D * Convolution2D)' = AveragePooling2D' * Convolution2D'。但是AveragePooling2D = UpSample2D * constant的渐变 - 所以在介词为真时也是如此。
    3. 最棘手的是MaxPooling2D。在这种情况下,仍为(MaxPooling2D * Convolution2D)' = MaxPooling2D' * Convolution2D'MaxPooling2D' != UpSample2D。但在这种情况下,人们可以很容易地找到一个简单的Convolution2D,它会MaxPooling2D' = Convolution2D * UpSample2D(直观地说 - MaxPooling2D的渐变是零矩阵,其对角线上只有一个1。作为{{1}可能表示矩阵运算 - 它也可能表示从单位矩阵到Convolution2D梯度的注入。所以: MaxPooling2D
    4. 最后一点是证明的所有部分都表明(MaxPooling2D * Convolution2D)' = UpSampling2D * Convolution2D * Convolution2D = UpSampling2D * Convolution2D'Deconvolution2DUpSampling2D的组合,而不是相反。可以很容易地证明,Convolution2DUpSampling2D组合形式的每个功能都可以以Convolution2DUpSampling2D的组合形式轻松呈现。所以基本上 - 证明已经完成:)