Keras图断开错误:拼接自编码器编解码器层用于LRP时出现报错
你遇到的Graph disconnected报错,是因为直接从原有Autoencoder的子Sequential模型中抽取全连接层拼接新模型时,这些层仍绑定了原模型的输入节点,新的Sequential没有正确重建层与层之间的计算链路,导致计算图断裂。
方案1:递归提取子层(优先推荐,改动最小)
不需要修改现有Autoencoder的结构,只要调整你获取模型参数的逻辑,递归遍历所有层级即可,不需要将模型转为单层Sequential结构:
def get_all_layers(model): layers = [] for layer in model.layers: # 如果当前层是Sequential子模型,继续遍历其内部层 if isinstance(layer, tf.keras.Sequential): layers.extend(get_all_layers(layer)) else: layers.append(layer) return layers
将你原有get_model_params函数中获取层列表的逻辑,替换为调用上述get_all_layers函数,就能直接拿到按编码器→解码器顺序排列的6个Dense层,完全符合LRP方法的输入要求,且不会破坏原有模型的计算图,也不需要重新训练权重。
方案2:正确构建单层序列模型
如果你确实需要生成一个结构为单层序列的独立模型,用函数式API拼接提取出的层,确保计算链路完整即可:
# 按顺序取出编码器、解码器的所有内部层 all_dense_layers = autoencoder._encoder.layers + autoencoder._decoder.layers # 用函数式API重建连接 inputs = tf.keras.Input(shape=(input_size,)) x = inputs for layer in all_dense_layers: x = layer(x) # 生成新模型 flatten_model = tf.keras.Model(inputs=inputs, outputs=x)
该方法生成的flatten_model.layers输出就是6个按顺序排列的Dense层,计算图完整,不会再出现断图报错,同时会完整继承原有自编码器的训练权重。
内容的提问来源于stack exchange,提问作者kenyu kobayashi
相关产品推荐
相关产品推荐

