You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)

解决方法

要完成分类任务,需将预训练的编码器层串联,再添加分类输出层,步骤如下:

  1. 确保自编码器已完成训练:先对三个自编码器分别执行fit训练,确保编码器权重有效。
  2. 串联编码器层并加载权重:将输入依次经过三个编码器的所有层,复用之前训练好的权重。
  3. 添加分类层并编译模型:在最后一个编码器输出后连接分类层,根据需求选择是否冻结编码器层。

修改后的完整代码示例:

# 假设三个自编码器已完成训练,开始构建分类模型
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:15:31