如何解决 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 层中,形状将是奇数除以二。而且你不能以同样的方式回来。
代码有点长,请您查看此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 层中,形状将是奇数除以二。而且你不能以同样的方式回来。