keras中的deconvolution2D层

izi*_*kgo 8 theano keras deconvolution

这个层没有准备好记录得很好,我在确定如何使用它时遇到了一些麻烦.
我正在尝试这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

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

Or *_*rir 8

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


更长的答案:Deconvolution2D严重无证,你必须通过它的代码来了解如何使用它.

首先,您必须了解解卷积层的工作原理(如果您已经了解所有细节,请跳过此处).与其名称所暗示的不同,解卷积仅仅是在反卷积层的输入上应用标准卷积层的反向预测(梯度计算方法).去卷积层的"内核大小"实际上是上述后向支撑步骤的虚拟卷积层的内核大小.虽然给出了卷积核的大小及其步幅,但是计算卷积层的输出形状是直截了当的(假设没有填充它(输入 - 内核)// stride + 1),但反之则不然.实际上,可以有多个可能的输入形状与卷积层的给定输出形状相匹配(这是因为整数除法不可逆).这意味着对于反卷积层,输出形状不能直接由输入形状(隐式已知),内核大小和步幅直接确定 - 这就是我们在初始化图层时需要知道输出形状的原因.当然,由于定义了反卷积层的方式,对于某些输入形状,你会在输出中得到未定义的漏洞,如果我们禁止这些情况,那么我们实际上可以推导出输出形状.

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

  • 它取决于原始图像的尺寸以及您使用的边框模式的类型.我发现总是使用border_mode ='same'而不是'valid'更容易(至少在解码阶段),然后使用subsample =(2,2),output_shape始终是图层输入维度的两倍.然后,您可以根据需要将尺寸加倍,直到output_shape至少与原始输入图像一样大,然后裁剪图层从输出图像中剪切任何多余的像素. (2认同)