如何解决 TensorFlow Autoencoder 中的维度不匹配错误

How to solve dimensions mismatch error in TensorFlow Autoencoder

代码有点长,请您查看此Google Colab link。

我正在构建一个自动编码器。一开始我工作得很好,但在添加了一个 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].

我认为编码器的维度和解码器的维度是不同的,因为增加了一层。我不知道如何使它们相同。有人可以帮忙吗?

EDIT - @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 层,因为在第 3 层中,形状将是奇数除以二。而且你不能以同样的方式回来。