如何解决TensorFlow自动编码器的尺寸不匹配错误



代码有点长,所以我要求你检查一下这个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。你不能以同样的方式回来。

最新更新