代码有点长,因此我请求您通过这个Google Colab链接查看。
我正在构建一个自编码器。起初运行正常,但在添加了另一个CNN层后,也就是将layer_filters = [32, 64]
改为layer_filters = [32, 64, 128]
后,我遇到了维度错误。错误如下:
ValueError: Dimensions must be equal, but are 32 and 28 for '{{node mean_squared_error/SquaredDifference}} = SquaredDifference[T=DT_FLOAT](autoencoders/decoder/decoder_output/Sigmoid, IteratorGetNext:1)' with input shapes: [32,32,32,1], [32,28,28,1].
我认为由于添加了额外的一层,编码器和解码器的维度不同。我不知道如何使它们相同。谁能帮帮我吗?
编辑 – @已回答了这个问题,我按照他说的做了,成功解决了问题。所以如果现在有人访问这个问题,请注意我之前提到的笔记本已更新,并且没有错误跟踪信息。
回答:
原因:
您的标签形状(28,28,3)
与模型的输出形状(32,32,3)
不兼容,这是因为您的编码器和解码器的分割操作所致。
来源:
输入形状是(28,28)
,使用layer_filters = [32, 64]
时的形状变化如下:
- 编码器:28 -> 14 -> 7
- 解码器:7 -> 14 -> 28
因此,输入和输出形状相同(28),运行正常。但当您添加另一个具有128个神经元的层(layer_filters = [32, 64, 128]
)时,形状变化如下:
- 编码器:28 -> 14 -> 7 -> 4
- 解码器:4 -> 8 -> 16 -> 32
现在,32和28不兼容,您会得到错误。
解决方案:
调整您的层配置,使输入和输出具有相同的形状。例如:
- 您可以在编码器和解码器的for循环中移除
strides = 2, padding = 'same'
:- 编码器:28 -> 26 -> 24 -> 22
- 解码器:22 -> 24 -> 26 -> 28
或者
- 不再添加超过2个Conv2D层,因为在第三层中,形状将是一个奇数除以2,您无法以相同的方式恢复原状。