«ValueError: Неизвестная активация: активация» при попытке загрузить модель с пользовательскими объектами - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь загрузить модель с двумя пользовательскими объектами и получаю эту ошибку в заголовке.

Это место, где я импортирую / определяю свои функции, и где я позволяю keras ссылаться на них по имени.

from tensorflow.keras.utils import get_custom_objects
from tensorflow.python.keras.layers import LeakyReLU
from tensorflow.keras.layers import Activation
from tensorflow.keras.backend import sigmoid


def swish(x, beta=1):
    return x * sigmoid(beta * x)


get_custom_objects().update({'swish': Activation(swish)})
get_custom_objects().update({'lrelu': LeakyReLU()})

Я загружаю модель этой деталью

from tensorflow.keras.models import load_model
model = load_model('model.h5', custom_objects={'swish': Activation(swish), 'lrelu': LeakyReLU()}, compile=False)

Я получаю ошибку ниже:

Traceback (most recent call last):
  File "C:\Users\Ben\PycharmProjects\untitled\trainer.py", line 102, in load_items
    model = load_model(data_loc + 'model.h5', custom_objects={'swish': Activation(swish), 'lrelu': LeakyReLU()}, compile=False)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\saving\save.py", line 146, in load_model
    return hdf5_format.load_model_from_hdf5(filepath, custom_objects, compile)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\saving\hdf5_format.py", line 168, in load_model_from_hdf5
    custom_objects=custom_objects)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\saving\model_config.py", line 55, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\layers\serialization.py", line 102, in deserialize
    printable_module_name='layer')
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py", line 191, in deserialize_keras_object
    list(custom_objects.items())))
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\engine\sequential.py", line 369, in from_config
    custom_objects=custom_objects)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\layers\serialization.py", line 102, in deserialize
    printable_module_name='layer')
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py", line 193, in deserialize_keras_object
    return cls.from_config(cls_config)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 594, in from_config
    return cls(**config)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\layers\core.py", line 361, in __init__
    self.activation = activations.get(activation)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\activations.py", line 321, in get
    identifier, printable_module_name='activation')
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py", line 180, in deserialize_keras_object
    config, module_objects, custom_objects, printable_module_name)
  File "C:\Users\Ben\PycharmProjects\untitled\venv\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py", line 165, in class_and_config_for_serialized_keras_object
    raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
ValueError: Unknown activation: Activation

Также стоит отметить, что я пытаюсь сохранить и загрузить модель в разных проектах с разными средами. Оба используют графический процессор tf 2.0.0. Импорт должен быть одинаковым.

1 Ответ

1 голос
/ 17 января 2020

Не следует слепо верить каждому уроку в инте rnet. Как я сказал в комментариях, проблема заключается в передаче функции активации как Layer (точнее, Activation), которая работает, но не правильно, так как у вас возникают проблемы при сохранении / загрузке модели:

def swish(x, beta = 1):
    return (x * K.sigmoid(beta * x))

get_custom_objects().update({'swish': Activation(swish)})

model = Sequential()
model.add(Dense(10, input_shape=(1,), activation="swish"))

Этот код выше НЕ правильный путь, активация внутри слоя не должна быть другим слоем. С этим кодом я получаю ошибки во время model.save с keras и tf.keras в TensorFlow 1.14. Правильный путь:

def swish(x, beta = 1):
    return (x * K.sigmoid(beta * x))

get_custom_objects().update({'swish': swish})

model = Sequential()
model.add(Dense(10, input_shape=(1,), activation="swish"))

Тогда вы сможете правильно загрузить и сохранить модель. Если вам нужно добавить активацию в качестве слоя, вы должны выполнить:

model.add(Activation("swish"))

, что также позволит сохранить / загрузить модель очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...