
Как сохранить и загрузить модели тензора
24 июля 2025 г.Обзор контента
- Настраивать
- Сохранение от API -интерфейсов TF.KERAS
- Написание контрольных точек
- Ручная контрольная точка
- Механика загрузки
- Отложенные реставрации
- Вручную проверку контрольных точек
- Отслеживание объекта
- Краткое содержание
Фраза «Сохранение модели тензора» обычно означает одну из двух вещей:
- Контрольные точки, или
- Сохраняйте модель.
Контрольные точки захватывают точное значение всех параметров (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:
dict
(иcollections.OrderedDict
)list
tuple
(иcollections.namedtuple
Вtyping.NamedTuple
)
Другие типы контейнеровне поддерживается, включая:
collections.defaultdict
set
Все остальные объекты Pythonигнорируется, включая:
int
string
float
Краткое содержание
Объекты TensorFlow обеспечивают простой автоматический механизм для сохранения и восстановления значений используемых ими переменных.
Первоначально опубликовано на
Оригинал