如何获取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
相关产品推荐
相关产品推荐

