如何使用tf.keras.Model.summary和plot_model显示子模型各层而非单个Sequential层
原因说明
你在定义cnn2时将其封装为独立的tf.keras.Sequential模型,当你将这个模型作为层直接接入融合网络时,Keras默认会将其识别为单个嵌套层,因此summary和模型结构图默认不会展示其内部的独立层结构。
解决方法
方法1:仅在查看summary时展开嵌套层
调用summary时开启expand_nested参数即可打印嵌套模型的内部结构,代码如下:
model.summary(expand_nested=True)
方法2:彻底拆解嵌套层,让内部层直接作为融合模型的一部分
修改fuse_model中调用cnn2的逻辑,将cnn2返回的Sequential模型的内部层依次作用在拼接后的张量上,不需要将整个Sequential作为单个层调用,修改后的代码参考:
def fuse_model(output_channels, lrval=0.0001): cnn1_mel = cnn_mls(output_channels, lrval=lrval) cnn1_sslm = cnn_sslm(output_channels, lrval=lrval) combined = keras.layers.concatenate([cnn1_mel.output, cnn1_sslm.output]) # 拆解cnn2的内部层 cnn2_model = cnn2(output_channels, lrval=lrval) x = combined for layer in cnn2_model.layers: x = layer(x) cnn2_in = x opt = keras.optimizers.Adam(lr=lrval) model = keras.models.Model(inputs=[cnn1_mel.input, cnn1_sslm.input], outputs=[cnn2_in]) model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) model.summary() if not os.path.isfile('Model_Diagram.png'): plot_model(model, to_file='Model_Diagram.png', show_shapes=True, show_layer_names=True, expand_nested=True) return model
修改后生成的模型和结构示意图都会直接显示cnn2内部的卷积、Dropout等独立层,不会再封装为单个Sequential块。
方法3:模型结构图展开嵌套层
你现有代码里的plot_model已经设置了expand_nested=True,如果你使用的是TensorFlow 2.3及以上版本,该参数会自动生效,不需要额外修改代码即可在生成的模型结构图中看到嵌套Sequential的内部层。如果版本较低不生效,使用方法2拆解层即可解决。
内容的提问来源于stack exchange,提问作者Daniel S.
相关产品推荐
相关产品推荐

