构建Autoencoder时触发Graph disconnected错误的技术求助
解决Autoencoder图断开错误的方案
问题根源
你遇到的Graph disconnected错误,是因为用来计算损失的X_hat是基于独立输入X_en的张量,和Autoencoder的输入X没有形成完整的计算链路。Keras在计算损失时,找不到从X到X_hat的路径,所以抛出了图断开的异常。另外你的代码还缺了keras.backend的导入,Lambda层里的K会未定义,也得补上。
修改后的完整代码
from keras.layers import Lambda, Dense, Input from keras.losses import mse from keras.models import Model from tensorflow.keras.optimizers import Adam from keras import backend as K # 补上K的导入 ini = 'glorot_uniform' """ build autoencoder model""" # encoder X = Input(shape=(64,)) enc_1 = Dense(256, activation='relu', kernel_initializer=ini)(X) enc_2 = Dense(32, activation='relu', kernel_initializer=ini)(enc_1) # 用K.sqrt替代np.sqrt,保持张量运算一致性 U = Lambda(lambda x: K.sqrt(32) * K.l2_normalize(x, axis=1))(enc_2) # 先定义decoder的各个层,再用张量串联 dec_1 = Dense(512, activation='relu', kernel_initializer=ini) dec_2 = Dense(128, activation='relu', kernel_initializer=ini) dec_3 = Dense(64, activation='linear', kernel_initializer=ini) # 用encoder的输出U作为decoder输入,得到和X关联的重建结果X_hat X_hat = dec_3(dec_2(dec_1(U))) # 单独构建encoder和可独立使用的decoder encoder = Model(X, U) decoder_input = Input(shape=(32,)) decoder_output = dec_3(dec_2(dec_1(decoder_input))) decoder = Model(decoder_input, decoder_output) # 定义Autoencoder主模型 AE = Model(X, X_hat) """Training""" # 此时X和X_hat属于同一计算图,可正常计算损失 recon_loss = mse(X, X_hat) ### training ### AE.add_loss(recon_loss) AE.compile(optimizer=Adam(lr=0.001))
关键修改点
- 补全
keras.backend导入,确保K相关函数可正常调用; - 将Lambda层里的
np.sqrt替换为K.sqrt,全程使用Keras张量运算,避免numpy数组与张量的冲突; - 重构decoder构建逻辑:先定义decoder的层结构,再用encoder的输出
U作为输入串联得到X_hat,让X_hat与输入X形成完整计算链路; - 单独构建decoder时新增独立输入张量,保证decoder可以单独复用。
这样修改后,Autoencoder的计算图完全连通,add_loss能正确关联输入与重建输出的损失计算。
内容的提问来源于stack exchange,提问作者New_student
相关产品推荐
相关产品推荐

