Сохранение и загрузка результатов модели Tensorflow в ошибке Keras

Aug 20 2020

Для проекта, над которым я работаю, я создал простую модель в TensorFlow, которая состоит из слоя плотных объектов, за которым следуют три плотных слоя.

def build_model(arguments):
    model = tf.keras.Sequential([
        tf.keras.layers.DenseFeatures(arguments),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dense(5, activation='sigmoid')
    ])
    
    return model

Я не могу вдаваться в подробности этого параметра arguments, но указанная выше функция модели отлично работает и может отлично обучать и сохранять .h5файл, используя приведенный ниже код.

    # Create a path for the saving location of the model
    model_dir = log_dir + "\model.h5"

    # Save the model
    model.save(model_dir)

Однако, когда я пытаюсь загрузить модель обратно из .h5файла,

model = tf.keras.models.load_model(model_path)

Я получаю следующее сообщение об ошибке.

  File "sampleModel.py", line 342, in <module>
    model = tf.keras.models.load_model(model_path)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\save.py", line 1
82, in load_model
    return hdf5_format.load_model_from_hdf5(filepath, custom_objects, c
ompile)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\hdf5_format.py",
 line 178, in load_model_from_hdf5
    custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\saving\model_config.py"
, line 55, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\layers\serialization.py
", line 175, in deserialize
    printable_module_name='layer')
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\utils\generic_utils.py"
, line 358, in deserialize_keras_object
    list(custom_objects.items())))
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\engine\sequential.py",
line 487, in from_config
    custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\layers\serialization.py
", line 175, in deserialize
    printable_module_name='layer')
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\utils\generic_utils.py"
, line 358, in deserialize_keras_object
    list(custom_objects.items())))
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\keras\feature_column\base_fea
ture_layer.py", line 141, in from_config
    config['feature_columns'], custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 186, in deserialize_feature_columns
    for c in configs
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 186, in <listcomp>
    for c in configs
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 138, in deserialize_feature_column
    columns_by_name=columns_by_name)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\feature_column
_v2.py", line 2622, in from_config
    config['normalizer_fn'], custom_objects=custom_objects)
  File "C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\Python
\Python37\site-packages\tensorflow\python\feature_column\serialization.
py", line 273, in _deserialize_keras_object
    obj = module_objects.get(object_name)
AttributeError: 'NoneType' object has no attribute 'get'

Оглядываясь вокруг, я подозреваю, что это как-то связано с custom_objectsтегом load_modelфункции, но я не уверен на 100%, как это реализовать.

Ответы

John Aug 21 2020 at 20:55

Попробуйте эту ссылку https://github.com/keras-team/keras/issues/11418

Есть ответ этанфаулера, который, кажется, решил проблему, используя custom_objects

AaronJones Sep 05 2020 at 01:54

Осмотревшись еще немного и покопавшись в некоторых проблемах Github, я считаю, что разобрался с проблемой. Для моей конкретной ситуации мне не нужно было сохранять всю модель, а не только веса. В своей конфигурации я использую Tensorflow 2.3.0 и Keras 2.4.3.

КОРОТКИЙ ОТВЕТ:

Подберите свою модель хотя бы на одну эпоху, а затем загрузите веса.

ДЛИННЫЙ ОТВЕТ:

Чтобы сохранить веса, я использую следующую функцию, над которой добавлен путь к моему файлу модели.

# Create a path for the saving location of the model
model_dir = dir_path + '/model.h5'

# Save the model
model.save_weights(model_dir)

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

model = build_model(arguments)

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

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    
#Declare and set the parametors of the optimizer
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001, decay=0.001)
    
#Compile the model
model.compile(loss=loss_object, optimizer=optimizer, metrics=['accuracy'])

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

history = model.fit(test_data, batch_size=1, epochs=1)

После этого вы сможете нормально загружать гири, используя функцию ниже.

model.load_weights(model_path)