Spec-Zone.ru › TensorFlow

tf.train.ExponentialMovingAverage

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

Псевдонимы

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

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

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 execution каждый вызов apply будет обновлять переменные один раз, поэтому это нужно вызывать в цикле.

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

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

average

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

average(
    var
)

Возвращает переменную, содержащую среднее значение 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/api_docs/python/tf/train/ExponentialMovingAverage

Spec-Zone.ru

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