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

标签 python tensorflow neural-network deep-learning keras

Keras中,Tensorflowtf.nn.conv2d_transpose对应的层(函数)有哪些?我曾经看到评论说我们可以 Just use combination 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)

最佳答案

Keras中对应的层是Deconvolution2D层。

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

更新:

  1. Deconvolution 是最近添加的一个层 - 也许这就是人们建议您使用 Convolution2D * UpSampling2D 的原因。
  2. 因为它相对较新 - 在某些情况下可能无法正常工作。正确使用它们也需要一些经验。
  3. 事实上 - 从数学的角度来看 - 每个反卷积都可以表示为 Convolution2DUpSampling2D 的组合 - 所以也许这就是它被提及的原因在您提供的文本中。

更新 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 的矩阵。因为 Convolution2D 可能表示矩阵运算 - 它也可能表示从单位矩阵到 MaxPooling2D 梯度的注入(inject))。所以: (MaxPooling2D * Convolution2D)' = UpSampling2D * Convolution2D * Convolution2D = UpSampling2D * Convolution2D'

最后要说的是,证明的所有部分都表明Deconvolution2DUpSampling2DConvolution2D 的组合,而不是相反。可以很容易地证明,UpSampling2DConvolution2D 的组合形式的每个函数都可以很容易地以 UpSampling2DConvolution2D。所以基本上 - 证明已经完成:)

关于python - 对应于 tf.nn.conv2d_transpose 的 Keras 层(函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42144191/

相关文章:

python - 可以使用格式对整数进行四舍五入吗?

python - 最大重试次数已用完。无法在 [azure 计算实例名称] : Cannot communicate with the Jupyter endpoint 上安装 VS Code 服务器

tensorflow - 检查点 keras 模型 : TypeError: can't pickle _thread. 锁定对象

python - Conv3d 与 Conv2d 之间的区别

machine-learning - 深度学习和传统的人工神经网络机器学习有什么区别?

python - 使用 Keras 的不平衡数据集

python - 动态填充的 Django 字段不显示选择

python - 完成所有测试后 pytest session 未结束

TensorFlow:无法创建 cudnn 句柄:CUDNN_STATUS_INTERNAL_ERROR 但没有其他 TF 实例正在运行

python - Tensorflow 上的简单线性回归