如何使用Keras构建堆叠自编码器并整合编码器实现分类?
堆叠自编码器(Stacked Autoencoder)
我尝试用Keras构建堆叠自编码器,但卡在了最后一步。

我已经分别训练好了三个自编码器,它们各自都能正常运行,但不知道怎么把所有编码器部分组合起来完成分类任务。
import keras from keras import layers from keras.layers import Input, Dense input_size = 2304 hidden_size = 64 output_size = 2304 input_img = keras.Input(shape=(input_size,)) # 自编码器1 encoded = layers.Dense(512, activation='relu')(input_img) encoded = layers.Dense(256, activation='relu')(encoded) decoded = layers.Dense(512, activation='relu')(encoded) decoded = layers.Dense(output_size, activation='sigmoid')(decoded) autoencoder = keras.Model(inputs=input_img, outputs=decoded) autoencoder.compile(optimizer='adam', loss='mse') encoder = keras.Model(inputs=input_img, outputs=encoded) encoder.compile(optimizer='adam', loss='mse') # 自编码器2 input_size = 256 input_img1 = keras.Input(shape=(input_size,)) output_size = 256 encoded1 = layers.Dense(128, activation='relu')(input_img1) encoded1 = layers.Dense(64, activation='relu')(encoded1) decoded1 = layers.Dense(128, activation='relu')(encoded1) decoded1 = layers.Dense(output_size, activation='sigmoid')(decoded1) autoencoder1 = keras.Model(inputs=input_img1, outputs=decoded1) autoencoder1.compile(optimizer='adam', loss='mse') encoder1 = keras.Model(inputs=input_img1, outputs=encoded1) encoder1.compile(optimizer='adam', loss='mse') # 自编码器3 input_size = 64 input_img2 = keras.Input(shape=(input_size,)) output_size = 64 encoded2 = layers.Dense(32, activation='relu')(input_img2) decoded2 = layers.Dense(output_size, activation='sigmoid')(decoded2) autoencoder2 = keras.Model(inputs=input_img2, outputs=decoded2) autoencoder2.compile(optimizer='adam', loss='mse') encoder2 = keras.Model(inputs=input_img2, outputs=encoded2) encoder2.compile(optimizer='adam', loss='mse') # 原代码错误:encoder3未定义 y = Dense(7, activation='softmax')(encoder3) autoencoder3 = keras.Model(inputs=input_img, outputs=y)
解决方法
要完成分类任务,需将预训练的编码器层串联,再添加分类输出层,步骤如下:
- 确保自编码器已完成训练:先对三个自编码器分别执行
fit训练,确保编码器权重有效。 - 串联编码器层并加载权重:将输入依次经过三个编码器的所有层,复用之前训练好的权重。
- 添加分类层并编译模型:在最后一个编码器输出后连接分类层,根据需求选择是否冻结编码器层。
修改后的完整代码示例:
# 假设三个自编码器已完成训练,开始构建分类模型 input_img = keras.Input(shape=(2304,)) # 第一层编码器(复用自编码器1的前两层) x = layers.Dense(512, activation='relu')(input_img) x = layers.Dense(256, activation='relu')(x) x.set_weights(encoder.get_weights()) # 第二层编码器(复用自编码器2的前两层) x = layers.Dense(128, activation='relu')(x) x = layers.Dense(64, activation='relu')(x) x.set_weights(encoder1.get_weights()) # 第三层编码器(复用自编码器3的第一层) x = layers.Dense(32, activation='relu')(x) x.set_weights(encoder2.get_weights()) # 添加分类输出层 output = layers.Dense(7, activation='softmax')(x) # 构建最终分类模型 classification_model = keras.Model(inputs=input_img, outputs=output) # 可选:冻结编码器层,仅训练分类层 for layer in classification_model.layers[:6]: layer.trainable = False # 编译模型 classification_model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )
关键提示
- 若数据集较小,建议冻结编码器层,避免过拟合;数据集充足时可微调所有层提升性能。
- 原代码中
encoder3未定义,这是导致失败的直接原因,需通过串联三个编码器的层来替代。
内容的提问来源于stack exchange,提问作者Mohana
相关产品推荐
相关产品推荐

