Сохранение и загрузка результатов модели Tensorflow в ошибке Keras
Для проекта, над которым я работаю, я создал простую модель в 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%, как это реализовать.
Ответы
Попробуйте эту ссылку https://github.com/keras-team/keras/issues/11418
Есть ответ этанфаулера, который, кажется, решил проблему, используя custom_objects
Осмотревшись еще немного и покопавшись в некоторых проблемах 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)