【问题标题】:How to solve dimensions mismatch error in TensorFlow Autoencoder如何解决 TensorFlow Autoencoder 中的尺寸不匹配错误
【发布时间】:2021-10-17 23:50:29
【问题描述】:

代码有点长,所以我请求你在这个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 在下面回答了这个问题,我照他说的做了,而且效果很好。所以如果有人现在正在访问这个问题。请注意,我之前提到的笔记本已经更新,没有任何追溯。

【问题讨论】:

  • 请更新完整的错误跟踪。
  • 编码器输入维度为(None, 28, 28, 1),解码器输出维度为(None, 32, 32, 1)。您正在通过autoencoder.fit() 向他们俩发送X_trainX_test 也一样。因此,这意味着X_trainX_test 的维度为(None, 32, 32, 1),与编码器输入维度(None, 28, 28, 1) 不兼容。 TL;DR:由于编码器输入和解码器输出两端都获得相同的输入,它们的尺寸应该相同。

标签: tensorflow machine-learning deep-learning autoencoder


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

【讨论】:

  • 感谢您的解释,非常有帮助。
  • 你能告诉我你是怎么知道删除步幅和填充可以解决这个问题的?
  • @Hobo 我查看了他提供的完整代码(链接),正如我所说,从层定义中删除此配置,然后形状将在每层上减去 2(没有填充和 strides=1),而不是除以 2。
猜你喜欢
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2016-03-09
相关资源
最近更新 更多