Не удается загрузить сохраненную модель Keras из-за использования «лямбда» - PullRequest
1 голос
/ 05 августа 2020

У меня есть простая сеть Keras, в которой используется настраиваемая функция активации, определенная как лямбда:

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>

Подождите: не lambda a python ключевое слово ? Я не собираюсь заново определять python, чтобы загрузить модель - где это закончится? Как мне это преодолеть? Что мне нужно указать в качестве моего custom_objects?

Согласно руководству TF Keras по сохранению и загрузке с пользовательскими объектами и функциями ...

Пользовательские функции (например, потеря активации или инициализация) не нуждаются в методе get_config. Имени функции достаточно для загрузки, если она зарегистрирована как пользовательский объект.

Мне кажется, это именно то, что я сделал. Может быть, это применимо только к функциям, определенным с помощью def, а не к лямбда-функциям?

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

У лямбда-выражений нет допустимого атрибута имени, который Керас мог бы проанализировать, поэтому он запутался во время сериализации. Вместо этого используйте именованную функцию.

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'
>>>
1 голос
/ 05 августа 2020

это еще один способ обернуть вашу функцию активации

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

...