这个层没有很好的文档记录,我在弄清楚如何使用它时遇到了一点麻烦。
我正在尝试这样做:
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
时,我得到的是图像的原始形状,而不是两倍的大小(这是我所期望的)。
任何帮助将非常感激!
简短的回答:如果您希望输出真正是输入的两倍,则需要向Deconvolution2D添加subsample=(2,2)。
更长的回答:Deconvolution2D是严重未记录的,你必须通过它的代码来理解如何使用它。
首先,你必须了解反卷积层是如何工作的(如果你已经知道了所有的细节,就跳过这个)。反卷积与它的名字不同,它只是将标准卷积层的反向传播(梯度计算方法)应用于反卷积层的输入。反卷积层的"核大小"实际上就是上面提到的backprop步骤的虚拟卷积层的核大小。虽然给定卷积核的大小和它的步幅,计算卷积层的输出形状是很简单的(假设没有填充,它是(input - kernel)//步幅+ 1),但反过来是不正确的。实际上,可以有多个可能的输入形状与卷积层的给定输出形状相匹配(这是因为整数除法不是可逆的)。这意味着对于反卷积层,输出形状不能直接从输入形状(隐式已知)、内核大小和步幅中确定——这就是为什么我们需要在初始化层时知道输出形状的原因。当然,由于反卷积层的定义方式,对于某些输入形状,你会在它的输出中得到未定义的孔,如果我们禁止这些情况,那么我们实际上可以推断输出形状。
回到Keras以及上面的实现方式。令人困惑的是,output_shape参数实际上并不用于确定层的输出形状,相反,它们试图从输入、内核大小和步长中推断出它,同时假设只提供了有效的output_shapes(尽管在代码中没有检查这种情况)。output_shape本身仅用作backprop步骤的输入。因此,您还必须指定stride参数(Keras中的子样本),以便获得所需的结果(可以由Keras根据给定的输入形状、输出形状和内核大小确定)。