Spec-Zone.ru › TensorFlow 2.9

tf.train.ExponentialMovingAverage

Просмотреть исходный код на GitHub

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

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.train.ExponentialMovingAverage

tf.train.ExponentialMovingAverage(
    decay,
    num_updates=None,
    zero_debias=False,
    name='ExponentialMovingAverage'
)

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

Метод apply() добавляет теневые копии обученных переменных при первом вызове и поддерживает скользящую среднюю обученных переменных в их теневых копиях при каждом последующем вызове. Обычно его следует вызывать сразу после создания весов модели и затем после каждого шага обучения.

Метод average() предоставляет доступ к теневым переменным. Это позволяет использовать скользящие средние вместо последних обученных значений для оценок, загрузив скользящие средние в вашу модель с помощью var.assign(ema.average(var)). Кроме того, хотя объекты ExponentialMovingAverage не отслеживаются напрямую контрольными точками, average() возвращает переменные скользящей средней для весов вашей модели, которые вы можете затем сохранить в контрольной точке. (Пример этого находится в конце этого документа). Таким образом, average() полезен при создании модели оценки или при восстановлении модели из файла контрольной точки.

Скользящие средние вычисляются с использованием экспоненциального затухания. Вы указываете значение затухания (как скалярное число с плавающей запятой, Tensor, или Variable) при создании объекта ExponentialMovingAverage. Теневые переменные инициализируются теми же начальными значениями, что и обученные переменные. При выполнении apply для обновления скользящих средних каждая теневая переменная обновляется по формуле:

shadow_variable -= (1 - decay) * (shadow_variable - variable)

Это математически эквивалентно классической формуле ниже, но использование оператора assign_sub (оператора "-=" в формуле) позволяет одновременные бесблокировочные обновления переменных:

shadow_variable = decay * shadow_variable + (1 - decay) * variable

Разумные значения для decay близки к 1,0, обычно в диапазоне нескольких девяток: 0,999, 0,9999 и т. д.

Для точного управления значением параметра затухания во время обучения передайте скалярное tf.Variable в качестве значения decay конструктору и обновляйте переменную по мере необходимости.

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

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create an ExponentialMovingAverage object
ema = tf.train.ExponentialMovingAverage(decay=0.9999)

# The first `apply` creates the shadow variables that hold the moving averages
ema.apply([var0, var1])

# grab the moving averages for checkpointing purposes or to be able to
# load the moving averages into the model weights
averages = [ema.average(var0), ema.average(var1)]

...
def train_step(...):
...
  # Apply the optimizer.
  opt.minimize(my_loss, [var0, var1])

  # Update the moving averages
  # of var0 and var1 with additional calls to `apply`
  ema.apply([var0, var1])

...train the model by running train_step multiple times...

Существует несколько способов использования скользящих средних для оценок:

  1. Присвойте значения теневых переменных переменным вашей модели с помощью Variable.assign(...) перед оценкой вашей модели. Вы можете использовать метод average() для получения теневой переменной для данной переменной. Чтобы продолжить обучение после использования этого подхода, убедитесь, что вы сохранили не усредненные веса и восстановили их перед продолжением обучения. Вы можете увидеть метод swap_weights оптимизатора MovingAverage tensorflow-addons в качестве одного примера того, как эффективно обменивать переменные в распределенных средах: https://github.com/tensorflow/addons/blob/v0.13.0/tensorflow_addons/optimizers/moving_average.py#L151
  2. Убедитесь, что вы сохранили переменные скользящей средней в своей tf.train.Checkpoint. Во время оценки создайте свои теневые переменные и используйте tf.train.Checkpoint для восстановления скользящих средних в теневые переменные. Затем загрузите скользящие средние в фактические веса модели с помощью var.assign(moving_avg).
  3. Сохраните переменные скользящей средней в своей tf.train.Checkpoint. Для оценки восстановите веса вашей модели непосредственно из скользящих средних, а не из не усредненных весов. Предупреждение: если вы используете этот подход, включите только пути графа объекта к усредненному пути в восстановлении контрольной точки. Если вы указываете как не усредненные, так и усредненные пути в восстановлении контрольной точки для одних и тех же переменных, трудно понять, будут ли восстановлены средние или не средние переменные вашей модели.

Пример сохранения и восстановления значений теневых переменных:

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create an ExponentialMovingAverage object, create the shadow variables,
# and grab the moving averages for checkpointing purposes.
# (The ExponentialMovingAverage object itself is not checkpointable)
ema = tf.train.ExponentialMovingAverage(decay=0.9999)
ema.apply([var0, var1])
avg_var0 = ema.average(var0)
avg_var1 = ema.average(var1)

# Create a Checkpoint that will manage the model weights and the averages,
checkpoint = tf.train.Checkpoint(model_weights=[var0, var1],
                                 averaged_weights=[avg_var0, avg_var1])
... # Do training

# Save out the checkpoint including the model weights and the moving averages
checkpoint.save(...)

Вариант восстановления: восстановить все усредненные и не усредненные веса, а затем загрузить скользящие средние в модель с помощью var.assign()

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create an ExponentialMovingAverage object, create the shadow variables,
# and grab the moving averages for checkpoint restore purposes.
# (The ExponentialMovingAverage object itself is not checkpointable)
ema = tf.train.ExponentialMovingAverage(decay=0.9999)
ema.apply([var0, var1])
avg_var0 = ema.average(var0)
avg_var1 = ema.average(var1)

# Create a Checkpoint that will manage the model weights and the averages,
checkpoint = tf.train.Checkpoint(model_weights=[var0, var1],
                                 averaged_weights=[avg_var0, avg_var1])
checkpoint.restore(...)
var0.assign(avg_var0)
var1.assign(avg_var1)
# var0 and var1 now hold the moving average values

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

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...

# Create a Checkpoint that will manage two objects with trackable state,
checkpoint = tf.train.Checkpoint(averaged_weights=[var0, var1])
checkpoint.restore(...)
# var0 and var1 now hold the moving average values
Аргументы
decay Скалярное значение с плавающей запятой, Tensor, или Variable. Параметр затухания.
num_updates Необязательное количество обновлений, примененных к переменным.
zero_debias Если True, обнулить сдвиги скользящих средних, которые инициализированы тензорами. (Примечание: скользящие средние могут не быть инициализированы с помощью тензоров, отличных от переменных, когда включено выполнение eager).
name Строка. Необязательное имя префикса, которое нужно использовать для имени операций, добавленных в apply().
Атрибуты
name Имя этого объекта ExponentialMovingAverage.

Методы

apply

Просмотреть исходный код

apply(
    var_list=None
)

Поддерживает скользящие средние переменных.

var_list должен быть списком объектов Variable. Этот метод создает теневые переменные (содержащие скользящие средние) для всех элементов var_list, и обновляет скользящие средние, используя текущие значения var_list. Теневые переменные для объектов Variable инициализируются начальным значением переменной.

Теневые переменные создаются с помощью trainable=False. Для доступа к ним можно использовать метод average объекта EMA. Обратите внимание, что объекты EMA не отслеживаются контрольными точками, поэтому если вы хотите сохранить или восстановить переменные скользящего среднего, вам потребуется вручную получить теневые переменные через average() и назначить их как свойства tf.Module или напрямую передать их в вашу tf.train.Checkpoint.

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

В старых графах TF 1.x этот метод возвращает операцию, которая обновляет все теневые переменные из текущего значения их связанных переменных. В графах TF 1.x без автоматических зависимостей управления эту операцию необходимо вручную выполнить.

Аргументы
var_list Список объектов Variable. Переменные должны быть типов bfloat16, float16, float32 или float64. (В старых графах TF 1.x это могут быть тензоры, но это не поддерживается при включенном eager-выполнении).
Возвращает
Операция, которая обновляет скользящие средние.
Возбуждает
TypeError Если аргументы не являются допустимым типом.

average

Просмотреть исходный код

average(
    var
)

Возвращает переменную Variable, содержащую среднее значение var.

Аргументы
var Объект Variable .
Возвращает
Объект Variable или None, если скользящая средняя var не поддерживается.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/train/ExponentialMovingAverage

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API