我在尝试按照深度自编码器的Keras 示例进行操作时,遇到了维度不匹配的异常,但我怎么也找不出原因。当我只使用一个编码维度时它可以工作,但当我堆叠它们时就不行了。
异常:输入 0 与层 dense_18 不兼容:
预期形状=(None, 128),发现形状=(None, 32)*
错误出现在代码行 decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))
from keras.layers import Dense,Inputfrom keras.models import Modelimport numpy as np# 这是编码表示的大小encoding_dim = 32#NPUT LAYERinput_img = Input(shape=(784,))#ENCODE LAYER# "encoded" 是输入的编码表示encoded = Dense(encoding_dim*4, activation='relu')(input_img)encoded = Dense(encoding_dim*2, activation='relu')(encoded)encoded = Dense(encoding_dim, activation='relu')(encoded)#DECODED LAYER# "decoded" 是输入的有损重建decoded = Dense(encoding_dim*2, activation='relu')(encoded)decoded = Dense(encoding_dim*4, activation='relu')(decoded)decoded = Dense(784, activation='sigmoid')(decoded)#MODELautoencoder = Model(input=input_img, output=decoded)#SEPERATE ENCODER MODELencoder = Model(input=input_img, output=encoded)# 为编码后的(32维)输入创建一个占位符encoded_input = Input(shape=(encoding_dim,))# 检索自编码器模型的最后一层decoder_layer = autoencoder.layers[-1]# 创建解码器模型decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))#COMPILERautoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
回答:
感谢Marcin的提示。原来所有解码层都需要展开才能使其工作。
# 检索自编码器模型的最后一层decoder_layer1 = autoencoder.layers[-3]decoder_layer2 = autoencoder.layers[-2]decoder_layer3 = autoencoder.layers[-1]# 创建解码器模型decoder = Model(input=encoded_input, output=decoder_layer3(decoder_layer2(decoder_layer1(encoded_input))))