如何可视化含TimeDistributed层的Keras模型,展开显示内部CNN结构?
解决方案
方案1:调整Keras自带plot_model参数直接展开嵌套层
你之前使用tf.keras.utils.plot_model没有展开子结构是因为默认关闭了嵌套层展开选项,添加expand_nested=True参数即可显示TimeDistributed层包裹的CNN子模型内部结构,示例代码如下:
from tensorflow.keras.utils import plot_model plot_model( model, to_file="model_visual.png", show_shapes=True, show_layer_activations=True, expand_nested=True, # 核心参数,展开所有嵌套子模型 dpi=200 )
这个方法不需要改动你的原有网络代码,生成的图会直接显示TimeDistributed内部的BatchNormalization、Flatten、Dense等层结构。
方案2:手动展开时间步显式显示每个输入对应的独立CNN分支
如果需要显式看到3个输入图像各自对应的独立CNN分支,可以临时修改网络结构,把TimeDistributed按时间步拆分后再生成可视化图,验证后改回原有TimeDistributed的写法即可,示例逻辑如下:
# 临时展开TimeDistributed用于可视化 input_sequence1 = Input(shape=(nbr_img, new_img_size, new_img_size, 3)) # 拆分3个时间步的输入,分别调用cnn1 step1_cnn = cnn1(input_sequence1[:,0,:,:,:]) step2_cnn = cnn1(input_sequence1[:,1,:,:,:]) step3_cnn = cnn1(input_sequence1[:,2,:,:,:]) # 组合后输入LSTM lstm_input = tf.stack([step1_cnn, step2_cnn, step3_cnn], axis=1) lstm1 = LSTM(1024, activation='relu', return_sequences=False)(lstm_input) # 后半部分网络逻辑保持不变,生成模型后再用plot_model画图即可
生成的图会直接显示3个并行的CNN分支,完全符合你要的展开效果。
方案3:使用visualkeras生成自定义风格的结构图
如果需要类似参考示例的彩色美观风格,可以使用visualkeras库,它支持自定义层配色、尺寸,同样支持展开嵌套层,示例代码如下:
import visualkeras from PIL import ImageFont # 设置字体(可选,调整标注大小) font = ImageFont.truetype("arial.ttf", 12) visualkeras.layered_view( model, to_file='model_colored.png', expand_nested=True, font=font, legend=True )
内容的提问来源于stack exchange,提问作者RNS
相关产品推荐
相关产品推荐

