这一层在没有准备好的情况下有很好的记录,我在弄清楚如何正确使用它时遇到了一些麻烦。
我正在尝试这样的方法:
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时,我得到了图像的原始形状,而不是原来的两倍(这正是我所期望的)。
任何帮助都将不胜感激!
发布于 2016-08-20 16:05:16
简单回答:如果您希望输出的大小是输入的两倍,则需要将subsample=(2,2)添加到Deconvolution2D中。
更长的答案: Deconvolution2D是严重无文档化的,您必须通过它的代码来理解如何使用它。
首先,您必须了解反褶积层是如何工作的(如果您已经知道所有细节,请跳过此操作)。反褶积与其名称不同,只是简单地将标准卷积层的后推(梯度计算法)应用于反褶积层的输入。反褶积层的“核大小”实际上是上述反褶积步骤的虚卷积层的核大小。尽管给定卷积核的大小及其步长,计算卷积层的输出形状(假设没有填充它的(输入核) // size + 1)是很简单的,但相反不是这样。事实上,可以有多个可能的输入形状与卷积层的给定输出形状相匹配(这是因为整数除法不是可逆的)。这意味着对于反褶积层,输出形状不能直接由输入形状(这是隐式已知的)、内核大小和步长来确定--这就是为什么我们在初始化层时需要知道输出形状。当然,由于反褶积层的定义方式,对于一些输入形状,在它的输出中会有一些未定义的洞,如果我们禁止这些情况,那么实际上可以推导出输出形状。
返回到Keras,以及如何实现上述内容。令人困惑的是,output_shape参数实际上并不用于确定层的输出形状,而是试图从输入、内核大小和步幅中推断出它,同时假设只提供有效的output_shapes (尽管在代码中没有签入情况)。output_shape本身仅被用作后端步骤的输入。因此,您还必须指定shape参数( Keras中的子样本),以获得所需的结果(这可以由Keras从给定的输入形状、输出形状和内核大小确定)。
https://stackoverflow.com/questions/39018767
复制相似问题