如何解决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].

我认为由于添加了额外的一层,编码器和解码器的维度不同。我不知道如何使它们相同。谁能帮帮我吗?

编辑 – @已回答了这个问题,我按照他说的做了,成功解决了问题。所以如果现在有人访问这个问题,请注意我之前提到的笔记本已更新,并且没有错误跟踪信息。


回答:

原因:

您的标签形状(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,您无法以相同的方式恢复原状。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注