如何在Keras LSTM中设置kernel与recurrent_kernel为不可训练?
单独控制LSTM层kernel/recurrent_kernel的可训练性
你遇到的AttributeError是因为lstm_layer.cell.kernel返回的是计算图中的Tensor对象,而非可修改的权重Variable,所以无法直接设置其trainable属性。要单独控制LSTM层的kernel、recurrent_kernel和bias的可训练性,需要直接操作层的权重Variable对象,具体实现如下:
解决方案代码
# 获取迁移学习模型中的目标LSTM层 lstm_layer = modelTL.layers[0] # 遍历层的所有权重变量,设置指定权重为不可训练 for weight in lstm_layer.weights: weight_name = weight.name.lower() # 匹配kernel和recurrent_kernel权重,将其设为不可训练 if "kernel" in weight_name or "recurrent_kernel" in weight_name: weight._trainable = False # 重新编译模型,确保可训练变量列表更新 modelTL.compile(optimizer='adam', loss='your_loss_function')
关键说明
- LSTM层的权重变量会以明确的名称标识,比如
kernel、recurrent_kernel、bias,通过判断权重名称可以精准定位目标组件 - 修改权重的
_trainable属性后,必须重新编译模型,这样Keras才会更新可训练变量的集合 - 这种方式不会影响bias的可训练性,满足你只冻结kernel和recurrent_kernel的需求
内容的提问来源于stack exchange,提问作者Binata Roy
相关产品推荐
相关产品推荐

