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 execution скользящие средние нельзя инициализировать тензорами, не являющимися переменными.)
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
)

Возвращает 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/api_docs/python/tf/train/ExponentialMovingAverage

Spec-Zone.ru

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