代码有点长,所以我要求你检查一下这个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].
我认为编码器的尺寸和解码器的尺寸是不同的,因为增加了一层。我不知道怎么让它们一样。有人能帮忙吗?
编辑@Kaveh已经在下面回答了这个问题,我照他说的做了,它起作用了。如果有人在看这个问题。请注意,我之前提到的笔记本已经更新了,没有可追溯的。
原因:
你的标签形状(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是不兼容的,你得到错误。
解决方案:
改变你的层配置,使输入和输出得到相同的形状。例如:
- 你可以在解码器和编码器的循环中删除
strides = 2, padding = 'same'
:- 编码器:28 ->26日→24→22日
- 解码器:22 ->24→26日→28日
或
- 不要再添加超过2个Conv2D层,因为在第三层中形状将是奇数除以2。你不能以同样的方式回来。