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

我有一个简单的 Keras 网络,它使用定义为 lambda 的自定义激活函数:


from tensorflow.keras.activations import relu

lrelu = lambda x: relu( x, alpha=0.01 )

model = Sequential

model.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 函数定义的函数吗?


30秒到达战场
浏览 120回答 2
2回答

慕标5832272

Lambda 没有 Keras 可以自省的有效名称属性,因此在序列化过程中会造成混淆。请改用命名函数。from tensorflow.keras.activations import reludef lrelu(x):&nbsp; &nbsp;return relu(x, alpha=0.01)model = Sequential()model.add(Dense( 10, activation=lrelu, input_dim=12 ))以机智:>>> lrelu1 = lambda x: 0>>> def lrelu2(x):...&nbsp; &nbsp;return 0...>>> lrelu1.__name__'<lambda>'>>> lrelu2.__name__'lrelu2'>>>

HUWWW

这是包装激活函数的另一种方法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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python