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

构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:43:08