为了账号安全,请及时绑定邮箱和手机立即绑定

由于使用“lambda”,无法加载已保存的 Keras 模型

由于使用“lambda”,无法加载已保存的 Keras 模型

30秒到达战场 2023-04-25 17:25:44
我有一个简单的 Keras 网络,它使用定义为 lambda 的自定义激活函数:from tensorflow.keras.activations import relulrelu = lambda x: relu( x, alpha=0.01 )model = Sequentialmodel.add(Dense( 10, activation=lrelu, input_dim=12 ))...它可以很好地编译、训练、测试(省略代码),我可以使用model.save( 'model.h5' ). 但是,当我尝试使用加载它时loaded = tf.keras.models.load_model( 'model.h5', custom_objects={'lrelu' : lrelu}),尽管定义lrelu完全如上所示,但它会抱怨:ValueError: Unknown activation function:<lambda>等一下:不是lambdapython 关键字吗?我不打算重新定义 python 所以我可以加载一个模型——它会在哪里结束?我该如何克服这个问题?我需要指定什么作为我的custom_objects?根据TF Keras guide to saving and loading with custom objects and functions ...自定义函数(例如激活损失或初始化)不需要 get_config 方法。只要将其注册为自定义对象,函数名称就足以加载。在我看来,这正是我所做的。难道这只适用于使用def而不适用于 lambda 函数定义的函数吗?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

Lambda 没有 Keras 可以自省的有效名称属性,因此在序列化过程中会造成混淆。请改用命名函数。


from tensorflow.keras.activations import relu


def lrelu(x):

   return relu(x, alpha=0.01)


model = Sequential()

model.add(Dense( 10, activation=lrelu, input_dim=12 ))

以机智:


>>> lrelu1 = lambda x: 0

>>> def lrelu2(x):

...   return 0

...

>>> lrelu1.__name__

'<lambda>'

>>> lrelu2.__name__

'lrelu2'

>>>


查看完整回答
反对 回复 2023-04-25
?
HUWWW

TA贡献1874条经验 获得超12个赞

这是包装激活函数的另一种方法


model = Sequential()

model.add(Dense( 10, input_dim=12 ))

model.add(Lambda( lambda x: tf.keras.activations.relu( x, alpha=0.01 ) ))

这与执行 model.add(Activation('...')) 的概念相同,但具有自定义修改的激活


用于保存和加载:


model.save( 'model.h5' )

loaded = tf.keras.models.load_model( 'model.h5' )

我使用它保存和加载模型没有问题https://colab.research.google.com/drive/1K-4_nt66AH5PQDv9Fn-l69-eu5S6Y5EU?usp=sharing


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信