拼接模型时遇Graph disconnected报错求助:预训练模型构建新模型问题
你遇到的这个报错核心原因是:当你把model2作为一个完整的Sequential模型嵌入到model_merge中时,model_merge.layers[-2](也就是那个sequential_2层)的输出张量,其对应的输入依赖是model2自身的输入层(conv2d_2_input),而这个输入层并没有被纳入model_merge的计算图连接路径里——在构建model_merge时,你是直接把model1的conv层输出喂给了model2的计算逻辑,但model2的输入层本身并没有和model_merge的输入形成有效连接。当你尝试以model_merge.input为输入,以sequential_2的输出为输出构建新模型时,Keras无法找到从model_merge.input到sequential_2输出的完整路径,所以抛出了图断开的错误。
这里提供两种可行的解决思路:
方法1:直接使用model2的内部层而非完整模型
在构建model_merge时,不要把model2当作一个整体模型调用,而是直接取出它的层来使用,这样所有层都会直接纳入model_merge的计算图,后续获取任意层的输出都不会有问题:
# 重新构建model_merge,直接使用model2的层 x = model1.get_layer('conv2d').output x = model2.layers[0](x) # 取model2的Conv2D层 x = model2.layers[1](x) # 取model2的Activation层 # 你额外加的softmax可以保留(注意:model2本身已有softmax,可根据需求调整) x = Activation('softmax')(x) model_merge = Model(inputs=model1.input, outputs=x)
之后再执行test2 = Model(inputs=model_merge.input, outputs=layers[-2])就不会报错了,因为所有层的输入输出都在同一个计算图里形成了完整连接。
方法2:保存model_merge中model2的输出张量,而非通过layers[-2].output获取
在构建model_merge的时候,把model2的输出张量保存下来,后续构建新模型时直接用这个张量,而不是通过层列表去取:
# 构建model_merge时保存中间张量 model1_conv_output = model1.get_layer('conv2d').output model2_output = model2(model1_conv_output) final_output = Activation('softmax')(model2_output) model_merge = Model(inputs=model1.input, outputs=final_output) # 后续构建test2时直接用保存的model2_output test2 = Model(inputs=model_merge.input, outputs=model2_output)
这样就绕开了从层列表中获取输出导致的图断开问题,因为model2_output本身就是model_merge计算图中的一个有效张量,和输入路径是连通的。
额外说明
你之前用layers[-1]没问题,是因为layers[-1]是你额外添加的Activation('softmax')层,它的输入直接来自model2_output,而这个张量是和model_merge.input连通的,所以Keras能找到完整路径。但layers[-2]是sequential_2层,它的内部输入依赖的是model2自己的输入层,这个层并没有和model_merge的输入连接,所以就报错了。
内容的提问来源于stack exchange,提问作者haojie yuan

