Keras使用load_model加载LSTM模型报错Unknown activation function: LeakyReLU
报错原因
该错误的核心是你在输出层使用了带自定义参数的LeakyReLU作为激活函数,Keras的load_model方法默认不会自动识别这类非内置字符串别名的带参数激活函数,加载时找不到对应实现就会抛出未知激活函数的错误。
解决方法
- 方案1:加载时通过
custom_objects参数手动传入LeakyReLU
这是无需修改原有训练代码、最快的临时解决方案,加载时指定自定义对象即可,示例代码:
from tensorflow.keras.models import load_model from tensorflow.keras.layers import LeakyReLU model = load_model('model_LSTM.h5', custom_objects={'LeakyReLU': LeakyReLU})
- 方案2:训练时将LeakyReLU拆分为独立层(一劳永逸,后续加载无需额外参数)
你之前的写法是把LeakyReLU直接作为Dense层的activation参数传入,改成单独新增一层激活层,保存的模型会自带层定义,后续加载不需要额外传参,修改后的输出层代码如下:
# 原有写法 # output = Dense(1, activation= LeakyReLU(alpha=0.1),name="class")(drop_out) # 替换为以下写法 dense_out = Dense(1, name="class")(drop_out) output = LeakyReLU(alpha=0.1)(dense_out)
修改后重新训练保存的模型,后续直接调用load_model('model_LSTM.h5')即可正常加载。
- 方案3:使用激活函数字符串别名(仅适用于不需要修改默认参数的场景)
如果你不需要自定义LeakyReLU的alpha值,使用默认的0.3参数的话,可以直接在Dense层的activation参数传入字符串'leaky_relu',Keras可以自动识别,后续加载也不会报错:
output = Dense(1, activation='leaky_relu', name="class")(drop_out)
内容的提问来源于stack exchange,提问作者Subhanjan Basu
相关产品推荐
相关产品推荐

