Сохранение и загрузка моделей

Смотрите на TensorFlow.org Запустите в Google Colab Изучайте код на GitHub Скачайте ноутбук

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

  • кодом необходимым для создания модели, и
  • обученными весами, или параметрами модели

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

Предупреждение: Будьте осторожны с ненадежным кодом — модели TensorFlow являются кодом. См. Безопасное использование TensorFlow для подробностей.

Варианты

Существуют различные способы сохранения моделей Tensorflow - зависит от API которое ты используешь. Это руководство использует tf.keras высокоуровневый API для построения и обучения моделей в TensorFlow. Для остальных подходов см. руководство TensorFlow сохранение и восстановление или Сохранение в eager.

Установка

Инсталляция и импорт

Установим и импортируем TensorFlow и зависимые библиотеки:

try:
  # %tensorflow_version существует только в Colab.
  %tensorflow_version 2.x
except Exception:
  pass

!pip install -q pyyaml h5py  # Требуется для сохранения модели в формате HDF5
from __future__ import absolute_import, division, print_function, unicode_literals

import os

import tensorflow as tf
from tensorflow import keras

print(tf.version.VERSION)
2.0.0

Получите набор данных

Для демонстрации того как сохранять и загружать веса вы используете датасет MNIST. Для ускорения запусков используйте только первые 1000 примеров:

(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

train_labels = train_labels[:1000]
test_labels = test_labels[:1000]

train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step

Определите модель

Начните с построения простой последовательной модели:

# Определим простую последовательную модель
def create_model():
  model = tf.keras.models.Sequential([
    keras.layers.Dense(512, activation='relu', input_shape=(784,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
  ])

  model.compile(optimizer='adam',
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])

  return model

# Создадим экземпляр базовой модели
model = create_model()

# Распечатаем архитектуру модели
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 512)               401920    
_________________________________________________________________
dropout (Dropout)            (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

Сохраните контрольные точки во время обучения

Вы можете использовать обученную модель без повторного ее обучения, или продолжить обучение с того места где вы остановились, в случае если процесс обучения был прерван. Коллбек tf.keras.callbacks.ModelCheckpoint позволяет непрерывно сохранять модель как во время так и по окончанию обучения

Использование коллбека контрольной точки (checkpoint callback)

Создайте коллбек tf.keras.callbacks.ModelCheckpoint который сохраняет веса только во время обучения:

checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Создаем коллбек сохраняющий веса модели
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
                                                 save_weights_only=True,
                                                 verbose=1)

# Обучаем модель с новым коллбеком
model.fit(train_images, 
          train_labels,  
          epochs=10,
          validation_data=(test_images,test_labels),
          callbacks=[cp_callback])  # Pass callback to training

# Это может генерировать предупреждения относящиеся к сохранению состояния оптимизатора.
# Эти предупреждения (и подобные предупреждения в этом уроке)
# используются для предотвращения устаревшего использования и могут быть проигнорированы.
Train on 1000 samples, validate on 1000 samples
Epoch 1/10
 768/1000 [======================>.......] - ETA: 0s - loss: 1.3148 - accuracy: 0.6107 
Epoch 00001: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 1s 1ms/sample - loss: 1.1632 - accuracy: 0.6580 - val_loss: 0.6907 - val_accuracy: 0.7930
Epoch 2/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.4500 - accuracy: 0.8724
Epoch 00002: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 164us/sample - loss: 0.4392 - accuracy: 0.8750 - val_loss: 0.5064 - val_accuracy: 0.8470
Epoch 3/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.3046 - accuracy: 0.9219
Epoch 00003: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 162us/sample - loss: 0.2918 - accuracy: 0.9260 - val_loss: 0.4581 - val_accuracy: 0.8580
Epoch 4/10
 736/1000 [=====================>........] - ETA: 0s - loss: 0.2150 - accuracy: 0.9375
Epoch 00004: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 163us/sample - loss: 0.2191 - accuracy: 0.9360 - val_loss: 0.4449 - val_accuracy: 0.8580
Epoch 5/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.1438 - accuracy: 0.9688
Epoch 00005: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 158us/sample - loss: 0.1478 - accuracy: 0.9680 - val_loss: 0.4093 - val_accuracy: 0.8700
Epoch 6/10
 736/1000 [=====================>........] - ETA: 0s - loss: 0.1132 - accuracy: 0.9796
Epoch 00006: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 163us/sample - loss: 0.1139 - accuracy: 0.9800 - val_loss: 0.4341 - val_accuracy: 0.8540
Epoch 7/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.0945 - accuracy: 0.9844
Epoch 00007: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 161us/sample - loss: 0.0923 - accuracy: 0.9860 - val_loss: 0.3997 - val_accuracy: 0.8670
Epoch 8/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.0647 - accuracy: 0.9935
Epoch 00008: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 161us/sample - loss: 0.0664 - accuracy: 0.9940 - val_loss: 0.4057 - val_accuracy: 0.8640
Epoch 9/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.0580 - accuracy: 0.9922
Epoch 00009: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 162us/sample - loss: 0.0566 - accuracy: 0.9910 - val_loss: 0.4057 - val_accuracy: 0.8600
Epoch 10/10
 768/1000 [======================>.......] - ETA: 0s - loss: 0.0410 - accuracy: 0.9974
Epoch 00010: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 162us/sample - loss: 0.0392 - accuracy: 0.9980 - val_loss: 0.4095 - val_accuracy: 0.8650

<tensorflow.python.keras.callbacks.History at 0x7fe69d382208>

Это создаст единый набор файлов контрольных точек TensorFlow который обновляется в конце каждой эпохи:

ls {checkpoint_dir}
checkpoint           cp.ckpt.data-00001-of-00002
cp.ckpt.data-00000-of-00002  cp.ckpt.index

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

Сейчас восстановите свежую, необученную модель и оцените ее на тестовом наборе. Неподготовленная модель будет работать на уровне угадывания (точность ~ 10%):

# Создайте экземпляр базовой модели
model = create_model()

# Оцените модель
loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 2.3261 - accuracy: 0.1180
Untrained model, accuracy: 11.80%

Затем загрузите веса из чекпоинта и оцените снова:

# Загрузим веса
model.load_weights(checkpoint_path)

# Оценим модель снова
loss,acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 0.4556 - accuracy: 0.8650
Restored model, accuracy: 86.50%

Параметры коллбека контрольной точки

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

Обучите новую модель и сохраните по разному названные чекпоинты каждые пять эпох:

# Добавим эпоху в имя файла (uses `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Создадим коллбек сохраняющий веса модели каждые 5 эпох
cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_path, 
    verbose=1, 
    save_weights_only=True,
    period=5)

# Создадим новый экземпляр модели
model = create_model()

# Сохраним веса используя формат `checkpoint_path` format
model.save_weights(checkpoint_path.format(epoch=0))

# Обучим модель с новым коллбеком
model.fit(train_images, 
              train_labels,
              epochs=50, 
              callbacks=[cp_callback],
              validation_data=(test_images,test_labels),
              verbose=0)
WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of samples seen.

Epoch 00005: saving model to training_2/cp-0005.ckpt

Epoch 00010: saving model to training_2/cp-0010.ckpt

Epoch 00015: saving model to training_2/cp-0015.ckpt

Epoch 00020: saving model to training_2/cp-0020.ckpt

Epoch 00025: saving model to training_2/cp-0025.ckpt

Epoch 00030: saving model to training_2/cp-0030.ckpt

Epoch 00035: saving model to training_2/cp-0035.ckpt

Epoch 00040: saving model to training_2/cp-0040.ckpt

Epoch 00045: saving model to training_2/cp-0045.ckpt

Epoch 00050: saving model to training_2/cp-0050.ckpt

<tensorflow.python.keras.callbacks.History at 0x7fe69c381278>

Сейчас посмотрите на получившиеся чекпоинты и выберите последний:

 ls {checkpoint_dir}
checkpoint            cp-0025.ckpt.data-00001-of-00002
cp-0000.ckpt.data-00000-of-00002  cp-0025.ckpt.index
cp-0000.ckpt.data-00001-of-00002  cp-0030.ckpt.data-00000-of-00002
cp-0000.ckpt.index        cp-0030.ckpt.data-00001-of-00002
cp-0005.ckpt.data-00000-of-00002  cp-0030.ckpt.index
cp-0005.ckpt.data-00001-of-00002  cp-0035.ckpt.data-00000-of-00002
cp-0005.ckpt.index        cp-0035.ckpt.data-00001-of-00002
cp-0010.ckpt.data-00000-of-00002  cp-0035.ckpt.index
cp-0010.ckpt.data-00001-of-00002  cp-0040.ckpt.data-00000-of-00002
cp-0010.ckpt.index        cp-0040.ckpt.data-00001-of-00002
cp-0015.ckpt.data-00000-of-00002  cp-0040.ckpt.index
cp-0015.ckpt.data-00001-of-00002  cp-0045.ckpt.data-00000-of-00002
cp-0015.ckpt.index        cp-0045.ckpt.data-00001-of-00002
cp-0020.ckpt.data-00000-of-00002  cp-0045.ckpt.index
cp-0020.ckpt.data-00001-of-00002  cp-0050.ckpt.data-00000-of-00002
cp-0020.ckpt.index        cp-0050.ckpt.data-00001-of-00002
cp-0025.ckpt.data-00000-of-00002  cp-0050.ckpt.index

latest = tf.train.latest_checkpoint(checkpoint_dir)
latest
'training_2/cp-0050.ckpt'

Замечание: базовый формат tensorflow сохраняет только 5 последних контрольных точек.

Для проверки сбросим модель и загрузим последний чекпоинт:

# Создадим новый экземпляр модели
model = create_model()

# Загрузим предварительно сохраненные веса
model.load_weights(latest)

# Заново оценим модель
loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 0.5290 - accuracy: 0.8770
Restored model, accuracy: 87.70%

Что это за файлы?

Приведенный выше код хранит веса в коллекции checkpoint-отформатированных файлов, которые содержат только обученные веса в двоичном формате. Чекпоинты содержат:

  • Один или несколько разделов (shards) которые содержат веса вашей модели.
  • Индексный файл который указывает какие веса содрержатся в каждом из разделов.

Если Вы обучаете модель только на одной машине, у Вас будет один раздел с суффиксом: .data-00000-of-00001

Сохраните веса вручную

Вы уже видели как загрузить веса в модель. Ручное их сохранение так же просто с использованием метода Model.save_weights. По умолчанию tf.keras и save_weights в частности используют формат чекпоинтов TensorFlow с расширением .ckpt (сохранение в HDF5 с раширением .h5 рассмотренно в материале Сохранение и сериализация моделей guide):

# Сохраним веса
model.save_weights('./checkpoints/my_checkpoint')

# Создадим новый экземпляр модели
model = create_model()

# Восстановим веса
model.load_weights('./checkpoints/my_checkpoint')

# Оценим модель
loss,acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
1000/1 - 0s - loss: 0.5290 - accuracy: 0.8770
Restored model, accuracy: 87.70%

Сохраните всю модель

Модель и оптимизатор могут быть сохранены в файл который содержит и их состояние (веса и переменные) и конфигурацию модели. Это позволит Вам экспортировать модель так, чтобы она могла быть использована без доступа к исходному коду Python. Поскольку состояние оптимизатора восстановлено, вы можете продолжить обучение в точности с того места где остановились.

Сохранение полностью функциональной модели очень полезно - вы можете загрузить его в TensorFlow.js (HDF5, Сохраненная модель) и затем обучить и запустить ее в веб-браузере, или сконвертировать для исполнения в мобильных устройствах с использованием TensorFlow Lite (HDF5, Сохраненная модель)

Сохраните модель в файл HDF5

Keras также обеспечивает базовый формат сохранения с использованием стандарта HDF5. Для наших целей сохраненная модель может быть рассмотрена как единый двоичный blob:

# Создадим новый экземпляр модели
model = create_model()

# Обучим модель
model.fit(train_images, train_labels, epochs=5)

# Сохраним всю модель в  HDF5 файл
model.save('my_model.h5')
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 386us/sample - loss: 1.1446 - accuracy: 0.6670
Epoch 2/5
1000/1000 [==============================] - 0s 73us/sample - loss: 0.4255 - accuracy: 0.8740
Epoch 3/5
1000/1000 [==============================] - 0s 72us/sample - loss: 0.2800 - accuracy: 0.9310
Epoch 4/5
1000/1000 [==============================] - 0s 72us/sample - loss: 0.2033 - accuracy: 0.9500
Epoch 5/5
1000/1000 [==============================] - 0s 73us/sample - loss: 0.1492 - accuracy: 0.9650

Сейчас восстановим модель с того файла:

# Восстановим в точности ту же модель, включая веса и оптимизатор
new_model = keras.models.load_model('my_model.h5')

# Покажем архитектуру модели
new_model.summary()
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_10 (Dense)             (None, 512)               401920    
_________________________________________________________________
dropout_5 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_11 (Dense)             (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

Проверим ее точность:

loss, acc = new_model.evaluate(test_images,  test_labels, verbose=2)
print("Точность восстановленной модели: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 0.5069 - accuracy: 0.8620
Точность восстановленной модели: 86.20%

Эта техника сохраняет все:

  • Значения весов
  • Конфигурацию модели (архитектуру)
  • Конфигурацию оптимизатора

Keras сохраняет модели путем проверки архитектуры. Сейчас Keras не может сохранять оптимизаторы TensorFlow (из tf.train). При их использовании вам нужно перекомпилировать модель после загрузки и вы потеряете текущее состояние оптимизатора.

Как и saved_model

Предупреждение: Этот метод сохранения модели tf.keras экспериментальный и может измениться в будущих версиях.

Постройте новую модель и затем обучите ее:

model = create_model()

model.fit(train_images, train_labels, epochs=5)
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 372us/sample - loss: 1.2161 - accuracy: 0.6680
Epoch 2/5
1000/1000 [==============================] - 0s 72us/sample - loss: 0.4419 - accuracy: 0.8700
Epoch 3/5
1000/1000 [==============================] - 0s 73us/sample - loss: 0.2912 - accuracy: 0.9300
Epoch 4/5
1000/1000 [==============================] - 0s 72us/sample - loss: 0.2186 - accuracy: 0.9450
Epoch 5/5
1000/1000 [==============================] - 0s 73us/sample - loss: 0.1591 - accuracy: 0.9700

<tensorflow.python.keras.callbacks.History at 0x7fe648470278>

Создайте saved_model, и поместите ее в папку с временной меткой с tf.keras.experimental.export_saved_model:

import time
saved_model_path = "./saved_models/{}".format(int(time.time()))

tf.keras.experimental.export_saved_model(model, saved_model_path)
saved_model_path
WARNING:tensorflow:From <ipython-input-20-9d5aff309515>:4: export_saved_model (from tensorflow.python.keras.saving.saved_model_experimental) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `model.save(..., save_format="tf")` or `tf.keras.models.save_model(..., save_format="tf")`.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_core/python/saved_model/signature_def_utils_impl.py:253: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: None
INFO:tensorflow:Signatures INCLUDED in export for Train: ['train']
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
WARNING:tensorflow:Export includes no default signature!
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: None
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: ['eval']
WARNING:tensorflow:Export includes no default signature!
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: ./saved_models/1570197180/saved_model.pb

'./saved_models/1570197180'

Выведите на экран ваши сохраненные модели:

ls saved_models/
1570197180

Загрузите свежую модель Keras из сохраненной модели:

new_model = tf.keras.experimental.load_from_saved_model(saved_model_path)

# Проверим ее архитектуру
new_model.summary()
WARNING:tensorflow:From <ipython-input-22-c3d8c7de0a7e>:1: load_from_saved_model (from tensorflow.python.keras.saving.saved_model_experimental) is deprecated and will be removed in a future version.
Instructions for updating:
The experimental save and load functions have been  deprecated. Please switch to `tf.keras.models.load_model`.
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-1.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-1.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-1.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-1.bias
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_12 (Dense)             (None, 512)               401920    
_________________________________________________________________
dropout_6 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_13 (Dense)             (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

Запустите предсказания с восстановленной моделью:

model.predict(test_images).shape
(1000, 10)
# Модель должна быть скомпилирована перед использованием.
# Этот шаг не требуется если сохраненная модель только разворачивается.

new_model.compile(optimizer=model.optimizer,  #Оставляем загруженный оптимизатор
                  loss='sparse_categorical_crossentropy', 
                  metrics=['accuracy'])

# Evaluate the restored model
loss, acc = new_model.evaluate(test_images,  test_labels, verbose=2)
print("Точность восстановленной модели: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 0.3909 - accuracy: 0.8650
Точность восстановленной модели: 86.50%


#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.