You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Keras模型各层权重并解决get_layer查找LSTM层报错问题

报错原因

get_layer()方法仅支持传入层的名称字符串或者层的数字索引作为参数,你直接传入了LSTM类对象作为参数,因此无法匹配到已存在的LSTM层实例,触发报错。

解决方法

提供两种可行方案:

  • 方案1:给层指定自定义名称,按名称获取权重
    给每一层添加name参数定义唯一名称,修改模型搭建代码如下:
    # 给第一层LSTM指定名称
    model.add(LSTM(32, input_shape=(n_timesteps,n_features), return_sequences=True, name='lstm_1'))
    # 给第二层LSTM指定名称
    model.add(LSTM(32, return_sequences=True, name='lstm_2'))
    model.add(Dropout(0.1))
    # 给attention层指定名称
    model.add(attention(return_sequences=False, name='att_layer')) 
    model.add(Dense(n_outputs, activation='softmax'))
    
    训练完成后通过名称获取对应层权重:
    # 第一层LSTM权重
    lstm1_weights = model.get_layer('lstm_1').get_weights()[0]
    # 第二层LSTM权重
    lstm2_weights = model.get_layer('lstm_2').get_weights()[0]
    # attention层权重
    att_W = model.get_layer('att_layer').W.numpy()
    att_b = model.get_layer('att_layer').b.numpy()
    
  • 方案2:按层的索引顺序直接获取,无需修改层定义
    你的模型层按添加顺序索引从0开始计数,分别为:0=第一层LSTM、1=第二层LSTM、2=Dropout、3=attention层、4=输出Dense层,直接通过索引读取即可:
    # 第一层LSTM权重
    lstm1_weights = model.layers[0].get_weights()[0]
    # 第二层LSTM权重
    lstm2_weights = model.layers[1].get_weights()[0]
    # attention层权重
    att_W = model.layers[3].W.numpy()
    att_b = model.layers[3].b.numpy()
    
注意事项

你原代码中打印权重的位置在添加第一层LSTM之后、模型训练之前,此时获取的是随机初始化的权重,若需要训练后的权重,请将权重读取代码放在model.fit()执行之后。


内容的提问来源于stack exchange,提问作者apin pipin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:54:03