如何从已保存的Keras主模型中提取子模型model_audio的输出
问题背景
构建了包含model_audio(model1)、model_text(model2)的主模型model_final,需从已保存的该Keras主模型中提取子模型model_audio的输出。
最初尝试的代码及错误
最初代码:
model_output = model.layers[-8].output # 'model' layer is at index -8 from the summary model_layer_output = Model(inputs=model.input, outputs=model_output) intermediate_output = model_layer_output.predict([test_input_1_data, test_input_2_data])
触发错误:
Graph disconnected: cannot obtain value for tensor KerasTensor(type_spec=TensorSpec(shape=(None, 135, 40), dtype=tf.float32, name='Input_layer'), name='Input_layer', description="created by layer 'Input_reshape'"). The following previous layers were accessed without issue: []
后续尝试的代码(输出形状符合预期,但存疑)
# audio model input_layer = Input(shape=(135, 40)) model_audio_output = model.get_layer('model')(input_layer) submodel = Model(inputs=input_layer, outputs=model_audio_output) audio_embed=submodel.predict(input_samples)
错误原因
直接通过主模型整体输入连接子模型输出时,计算图会断开。主模型输入包含音频、文本两个分支,而model_audio子模型的输入仅对应音频分支,强行从主模型全输入指向子模型输出,会导致Keras无法追踪到子模型输入与主模型输入的有效关联。
正确提取方法
核心思路
直接复用主模型中已保存的model_audio子模型实例,基于其自身的输入输出构建新的提取模型,确保权重和计算图的完整性。
严谨实现步骤
确认子模型的层名称
运行model.summary()查看主模型结构,找到model_audio子模型在主模型中的准确层名称(比如可能是'model_audio'、'model1',而非示例中的'model')。构建子模型提取器
无需手动定义输入层,直接利用子模型自身的输入输出节点构建新模型:from tensorflow.keras.models import load_model, Model # 加载已保存的主模型 model = load_model('path/to/model_final.h5') # 获取主模型中的model_audio子模型 audio_submodel = model.get_layer('your_model_audio_layer_name') # 构建仅输出model_audio结果的提取器 audio_extractor = Model(inputs=audio_submodel.input, outputs=audio_submodel.output) # 传入音频输入获取输出 audio_embed = audio_extractor.predict(input_samples)验证正确性
取少量测试数据,同时通过主模型(传入完整音频+文本输入)获取model_audio的输出,与提取器的输出做数值对比,若结果一致则说明提取正确。
对后续尝试代码的验证
你后续尝试的代码思路是可行的,但手动定义输入层时需确保输入形状与model_audio的原始输入完全匹配。相比之下,直接复用audio_submodel.input的方式更可靠,能避免形状匹配错误。
内容的提问来源于stack exchange,提问作者kesav raj

