【问题标题】:Deconvolution2D layer in keraskeras中的反卷积2D层
【发布时间】:2016-08-18 12:52:00
【问题描述】:

这个层没有很好地记录,我在弄清楚如何使用它时遇到了一些麻烦。
我正在尝试类似的东西:

input_img = Input(shape=(1, h, w))
x = Convolution2D(16, 7, 7, activation='relu', border_mode='valid')(input_img)
d = Deconvolution2D(1, 7, 7, (None, 1, 2*h, 2*w))
x = d(x)

但是当我尝试写 d.output_shape 时,我得到了图像的原始形状,而不是两倍大小(这是我所期望的)。
任何帮助将不胜感激!

【问题讨论】:

  • Deconvolution2DKeras 中也称为 Conv2DTranspose,并且有很好的文档记录。搜索它,您会很容易找到答案。

标签: theano keras deconvolution


【解决方案1】:

简短回答:如果您希望输出真正是输入的两倍,则需要将 subsample=(2,2) 添加到 Deconvolution2D。


更长的答案:Deconvolution2D 严重没有文档记录,您必须仔细阅读其代码才能了解如何使用它。

首先,您必须了解反卷积层的工作原理(如果您已经了解所有细节,请跳过此部分)。反卷积,不像它的名字所暗示的那样,只是简单地将标准卷积层的反向传播(梯度计算方法)应用到反卷积层的输入上。反卷积层的“kernel size”其实就是上面提到的backprop step的虚拟卷积层的kernel size。虽然给定卷积核的大小及其步幅,但计算卷积层的输出形状很简单(假设没有填充它是(输入 - 内核)//步幅 + 1),但反之则不然。事实上,与卷积层的给定输出形状匹配的可能输入形状可能不止一种(这是因为整数除法不可逆)。这意味着对于反卷积层,输出形状不能简单地从输入形状(隐含已知)、内核大小和步幅直接确定——这就是为什么我们在初始化层时需要知道输出形状的原因。当然,由于反卷积层的定义方式,对于某些输入形状,您会在其输出中得到未定义的空洞,如果我们禁止这些情况,那么我们实际上可以推导出输出形状.

回到 Keras 以及如何实现上述内容。令人困惑的是, output_shape 参数实际上并没有用于确定层的输出形状,而是他们尝试从输入、内核大小和步幅中推断出它,同时假设只提供了有效的 output_shapes(尽管它没有在代码是这样的)。 output_shape 本身仅用作反向传播步骤的输入。因此,您还必须指定步幅参数(Keras 中的子样本)才能获得所需的结果(这可以由 Keras 根据给定的输入形状、输出形状和内核大小确定)。

【讨论】:

  • 感谢您的解释!因此,如果我想在卷积自动编码器的“解码”端使用 deconv 层,我应该使用哪个 output_shape?
  • 这取决于原始图像的尺寸,以及您使用的边框模式类型。我发现总是使用 border_mode='same' 而不是 'valid' 更容易(至少在解码阶段),然后使用 subsample=(2,2) output_shape 始终是图层输入尺寸的两倍。然后,您可以根据需要将尺寸翻倍,直到 output_shape 至少与原始输入图像一样大,然后是裁剪层,从输出图像中删除任何多余的像素。