Как сохранить и загрузить модели тензора

Как сохранить и загрузить модели тензора

24 июля 2025 г.

Обзор контента

  • Настраивать
  • Сохранение от API -интерфейсов TF.KERAS
  • Написание контрольных точек
  • Ручная контрольная точка
  • Механика загрузки
  • Отложенные реставрации
  • Вручную проверку контрольных точек
  • Отслеживание объекта
  • Краткое содержание

Фраза «Сохранение модели тензора» обычно означает одну из двух вещей:

  1. Контрольные точки, или
  2. Сохраняйте модель.

Контрольные точки захватывают точное значение всех параметров (tf.VariableОбъекты) используются моделью. Контрольные точки не содержат никакого описания вычислений, определенного моделью, и, следовательно, обычно полезны только тогда, когда доступен исходный код, который будет использовать сохраненные значения параметров.

Формат SaveedModel, с другой стороны, включает в себя сериализованное описание вычислений, определенного моделью в дополнение к значениям параметров (контрольная точка). Модели в этом формате не зависят от исходного кода, который создал модель. Таким образом, они подходят для развертывания с помощью Tensorflow Forming, Tensorflow Lite, Tensorflow.js или программ на других языках программирования (C, C ++, Java, Go, Rust, C# и т. Д. Tensorflow API).

Это руководство охватывает API для написания и чтения контрольных точек.

Настраивать

import tensorflow as tf

class Net(tf.keras.Model):
  """A simple linear model."""

  def __init__(self):
    super(Net, self).__init__()
    self.l1 = tf.keras.layers.Dense(5)

  def call(self, x):
    return self.l1(x)

net = Net()

Сохранение отtf.kerasОбучение API

Увидетьtf.kerasРуководство по сохранению и восстановлению.

tf.keras.Model.save_weightsСохраняет контрольную точку TensorFlow.

net.save_weights('easy_checkpoint')

Написание контрольных точек

Постоянное состояние модели TensorFlow хранится вtf.Variableобъекты Они могут быть построены напрямую, но часто создаются с помощью API высокого уровняtf.keras.layersилиtf.keras.ModelПолем

Самый простой способ управления переменными - это прикрепить их к объектам Python, а затем ссылаться на эти объекты.

Подклассыtf.train.CheckpointВtf.keras.layers.Layer, иtf.keras.Modelавтоматически отслеживать переменные, назначенные их атрибутам. В следующем примере создается простая линейная модель, затем записывает контрольно -пропускные пункты, которые содержат значения для всех переменных модели.

Вы можете легко сохранить модель-проверку сModel.save_weightsПолем

Ручная контрольная точка

Настраивать

Чтобы продемонстрировать все особенностиtf.train.Checkpoint, Определите набор данных игрушек и шаг оптимизации:

def toy_dataset():
  inputs = tf.range(10.)[:, None]
  labels = inputs * 5. + tf.range(5.)[None, :]
  return tf.data.Dataset.from_tensor_slices(
    dict(x=inputs, y=labels)).repeat().batch(2)

def train_step(net, example, optimizer):
  """Trains `net` on `example` using `optimizer`."""
  with tf.GradientTape() as tape:
    output = net(example['x'])
    loss = tf.reduce_mean(tf.abs(output - example['y']))
  variables = net.trainable_variables
  gradients = tape.gradient(loss, variables)
  optimizer.apply_gradients(zip(gradients, variables))
  return loss

Создать объекты контрольной точки

Используйтеtf.train.CheckpointОбъект для вручную создать контрольную точку, где объекты, которые вы хотите, устанавливаются в качестве атрибутов на объекте.

Аtf.train.CheckpointManagerТакже может быть полезен для управления несколькими контрольно -пропускными пунктами.

opt = tf.keras.optimizers.Adam(0.1)
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator)
manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3)

Обучить и контролировать модель

Следующий учебный цикл создает экземпляр модели и оптимизатора, а затем собирает их вtf.train.Checkpointобъект. Он вызывает этап обучения в цикле каждой партии данных и периодически записывает контрольные точки на диск.

def train_and_checkpoint(net, manager):
  ckpt.restore(manager.latest_checkpoint)
  if manager.latest_checkpoint:
    print("Restored from {}".format(manager.latest_checkpoint))
  else:
    print("Initializing from scratch.")

  for _ in range(50):
    example = next(iterator)
    loss = train_step(net, example, opt)
    ckpt.step.assign_add(1)
    if int(ckpt.step) % 10 == 0:
      save_path = manager.save()
      print("Saved checkpoint for step {}: {}".format(int(ckpt.step), save_path))
      print("loss {:1.2f}".format(loss.numpy()))

train_and_checkpoint(net, manager)

Восстановить и продолжить обучение

После первого тренировочного цикла вы можете пройти новую модель и менеджер, но подобрать обучение именно там, где вы остановились:

opt = tf.keras.optimizers.Adam(0.1)
net = Net()
dataset = toy_dataset()
iterator = iter(dataset)
ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=opt, net=net, iterator=iterator)
manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3)

train_and_checkpoint(net, manager)

Аtf.train.CheckpointManagerОбъект удаляет старые контрольно -пропускные пункты. Выше он настроен на то, чтобы сохранить только три последних контрольных точек.

print(manager.checkpoints)  # List the three remaining checkpoints

Эти пути, например,'./tf_ckpts/ckpt-10', не являются файлами на диске. Вместо этого они представляют собой префиксы дляindexФайл и один или несколько файлов данных, которые содержат значения переменной. Эти префиксы сгруппированы вместе в одинcheckpointфайл ('./tf_ckpts/checkpoint') гдеCheckpointManagerспасает его состояние.

ls ./tf_ckpts

Механика загрузки

Tensorflow соответствует переменным с контролированными значениями, пройдя направленный график с именованными краями, начиная с загружаемого объекта. Имена краев обычно исходят от имен атрибутов в объектах, например"l1"вself.l1 = tf.keras.layers.Dense(5)Полемtf.train.Checkpointиспользует свои имена аргументов ключевого слова, как в"step"вtf.train.Checkpoint(step=...)Полем

График зависимостей из приведенного выше примера выглядит следующим образом:

Оптимизатор находится в красном, обычные переменные в синем, а переменные слота оптимизатора находятся в оранжевом. Другие узлы, например, представляющиеtf.train.Checkpoint- в черном.

Переменные слоты являются частью состояния оптимизатора, но создаются для определенной переменной. Например,'m'Ряд выше соответствуют импульсу, который отслеживает оптимизатор ADAM для каждой переменной. Переменные слота сохраняются только в контрольной точке, если переменная и оптимизатор будут сохранены, таким образом, пунктирные края.

Вызовrestoreнаtf.train.CheckpointОбъекты очереди запрашиваемые реставрации, восстановление значений переменных, как только появится соответствующий путь отCheckpointобъект. Например, вы можете загрузить только смещение из модели, которую вы определили выше, реконструируя один путь к ней через сеть и слой.

to_restore = tf.Variable(tf.zeros([5]))
print(to_restore.numpy())  # All zeros
fake_layer = tf.train.Checkpoint(bias=to_restore)
fake_net = tf.train.Checkpoint(l1=fake_layer)
new_root = tf.train.Checkpoint(net=fake_net)
status = new_root.restore(tf.train.latest_checkpoint('./tf_ckpts/'))
print(to_restore.numpy())  # This gets the restored value.

График зависимостей для этих новых объектов представляет собой гораздо меньший подграф более крупной контрольной точки, которую вы написали выше. Он включает только предвзятость и счетчик сохранения, которыйtf.train.Checkpointиспользует для номера контрольных точек.

restoreВозвращает объект статуса, который имеет дополнительные утверждения. Все объекты, созданные в новомCheckpointбыли восстановлены, так чтоstatus.assert_existing_objects_matchedпроходы.

status.assert_existing_objects_matched()

В контрольной точке есть много объектов, которые не совпадают, включая ядро слоя и переменные оптимизатора.status.assert_consumedПроходит только в том случае, если контрольно -пропускной пункт и программа точно совпадают, и выставили бы здесь исключение.

Отложенные реставрации

LayerОбъекты в TensorFlow могут отложить создание переменных от первого вызова, когда доступны входные формы. Например, формаDenseЯдро слоя зависит как от входных и выходных форм слоя, так и от формы вывода, требуемой в качестве аргумента конструктора, недостаточно информации, чтобы самостоятельно создать переменную. С тех пор, как звонит аLayerТакже читает значение переменной, необходимо произойти восстановление между созданием переменной и ее первым использованием.

Чтобы поддержать эту идиому,tf.train.CheckpointДеферы восстанавливают, которые еще не имеют соответствующей переменной.

deferred_restore = tf.Variable(tf.zeros([1, 5]))
print(deferred_restore.numpy())  # Not restored; still zeros
fake_layer.kernel = deferred_restore
print(deferred_restore.numpy())  # Restored

Вручную проверку контрольных точек

tf.train.load_checkpointВозвращает аCheckpointReaderЭто дает более низкий уровень доступа к содержимому контрольно -пропускной точки. Он содержит сопоставления из ключа каждой переменной, до формы и dtype для каждой переменной в контрольной точке. Ключом переменной является его путь объекта, как на графиках, отображаемых выше.

Примечание:В контрольной точке нет структуры более высокого уровня. Он знает только пути и значения для переменных и не имеет концепцииmodelsВlayersили как они связаны.

reader = tf.train.load_checkpoint('./tf_ckpts/')
shape_from_key = reader.get_variable_to_shape_map()
dtype_from_key = reader.get_variable_to_dtype_map()

sorted(shape_from_key.keys())

Так что, если вы заинтересованы в ценностиnet.l1.kernelВы можете получить значение со следующим кодом:

key = 'net/l1/kernel/.ATTRIBUTES/VARIABLE_VALUE'

print("Shape:", shape_from_key[key])
print("Dtype:", dtype_from_key[key].name)

Это также предоставляетget_tensorМетод, позволяющий вам проверить значение переменной:

reader.get_tensor(key)

Отслеживание объекта

Контрольные точки сохраняют и восстанавливают значенияtf.VariableОбъекты по «отслеживанию» любой переменной или отслеживаемых объектов, установленных в одном из его атрибутов. При выполнении сохранения переменные собираются рекурсивно из всех достижимых отслеживаемых объектов.

Как и в случае с прямыми назначениями атрибутов, какself.l1 = tf.keras.layers.Dense(5), назначение списков и словарей для атрибутов, будет отслеживать их содержимое.

save = tf.train.Checkpoint()
save.listed = [tf.Variable(1.)]
save.listed.append(tf.Variable(2.))
save.mapped = {'one': save.listed[0]}
save.mapped['two'] = save.listed[1]
save_path = save.save('./tf_list_example')

restore = tf.train.Checkpoint()
v2 = tf.Variable(0.)
assert 0. == v2.numpy()  # Not restored yet
restore.mapped = {'two': v2}
restore.restore(save_path)
assert 2. == v2.numpy()

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

restore.listed = []
print(restore.listed)  # ListWrapper([])
v1 = tf.Variable(0.)
restore.listed.append(v1)  # Restores v1, from restore() in the previous cell
assert 1. == v1.numpy()

Отслеживаемые объекты включаютtf.train.CheckpointВtf.Moduleи его подклассы (например,keras.layers.Layerиkeras.Model) и распознанные контейнеры Python:

  • dictcollections.OrderedDict)
  • list
  • tuplecollections.namedtupleВtyping.NamedTuple)

Другие типы контейнеровне поддерживается, включая:

  • collections.defaultdict
  • set

Все остальные объекты Pythonигнорируется, включая:

  • int
  • string
  • float

Краткое содержание

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

Первоначально опубликовано наTensorflowВеб -сайт, эта статья появляется здесь под новым заголовком и имеет лицензию в CC на 4.0. Образцы кода, разделенные по лицензии Apache 2.0.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE