如何查看已训练LSTM模型各层的权重?附模型代码示例
加载并查看LSTM模型各层权重的方法
一、先确保模型结构与训练时一致
加载权重前,必须保证当前定义的模型结构和训练保存权重时完全一致——包括层类型、单元数、输入形状、return_sequences参数等,否则会加载失败。你的代码已经正确还原了模型结构,这一步没问题。
二、修正权重路径并加载
注意Windows系统的路径需要转义,避免单斜杠被识别为转义字符,推荐两种写法:
# 方法1:使用原始字符串(前缀加r) weightsfile = r"C:\Users\...\weights-improvement.hdf5" # 方法2:使用双反斜杠 weightsfile = "C:\\Users\\...\\weights-improvement.hdf5" # 加载权重并重新编译模型 model.load_weights(weightsfile) model.compile(loss='categorical_crossentropy', optimizer='adam')
三、查看各层权重的两种方法
方法1:遍历所有层,批量查看
循环遍历模型的每一层,通过get_weights()获取权重参数(无训练参数的层如Dropout会返回空列表),可选择打印形状或具体数值:
for idx, layer in enumerate(model.layers): print(f"=== 第{idx+1}层:{layer.name} ===") weights = layer.get_weights() if not weights: print("该层无训练权重(如Dropout层)\n") continue # 打印每个权重数组的形状 for w_idx, w_arr in enumerate(weights): print(f"参数{w_idx+1}形状:{w_arr.shape}") # 如需查看具体数值,取消下面注释 # print(f"参数{w_idx+1}数值:\n{w_arr}\n") print("\n")
方法2:查看指定层的权重
如果只关注某一层(比如第一个LSTM层),可以直接通过索引定位后查看:
# 获取第一个LSTM层(索引为0) target_layer = model.layers[0] layer_weights = target_layer.get_weights() print("第一个LSTM层权重结构:") # LSTM层包含输入/遗忘/更新/输出门的权重与偏置,共8个数组 for w_idx, w_arr in enumerate(layer_weights): print(f"门控参数{w_idx+1}形状:{w_arr.shape}")
补充说明
- Dropout层仅做随机失活操作,没有可训练的权重参数,属于正常现象。
- LSTM层的权重数组对应不同门控的参数,Dense层则只有权重矩阵和偏置向量两组参数。
内容的提问来源于stack exchange,提问作者Sanne112
相关产品推荐
相关产品推荐

