Spec-Zone.ru › TensorFlow 2.4

tf.train.ExponentialMovingAverage

Просмотр исходного кода на GitHub

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

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

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

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

tf.compat.v1.train.ExponentialMovingAverage

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

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

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

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

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

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

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

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

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

# Create variables.
var0 = tf.Variable(...)
var1 = tf.Variable(...)
# ... use the variables to build a training model...
...
# Create an op that applies the optimizer.  This is what we usually
# would use as a training op.
opt_op = opt.minimize(my_loss, [var0, var1])

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

with tf.control_dependencies([opt_op]):
    # Create the shadow variables, and add ops to maintain moving averages
    # of var0 and var1. This also creates an op that will update the moving
    # averages after each training step.  This is what we will use in place
    # of the usual training op.
    training_op = ema.apply([var0, var1])

...train the model by running training_op...

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

  • Построить модель, которая использует теневые переменные вместо переменных. Для этого используйте метод average(), который возвращает теневую переменную для заданной переменной.
  • Построить модель обычным образом, но загрузить файлы контрольных точек для оценки, используя имена теневых переменных. Для этого используйте метод average_name(). См. tf.compat.v1.train.Saver для получения дополнительной информации о восстановлении сохранённых переменных.

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

# Create a Saver that loads variables from their saved shadow values.
shadow_var0_name = ema.average_name(var0)
shadow_var1_name = ema.average_name(var1)
saver = tf.compat.v1.train.Saver({shadow_var0_name: var0, shadow_var1_name:
var1})
saver.restore(...checkpoint filename...)
# var0 and var1 now hold the moving average values
Аргументы
decay Вещественное число. Используемое затухание.
num_updates Необязательное количество обновлений, применённых к переменным.
zero_debias Если True, обнулить смещённые скользящие средние, которые инициализированы тензорами.
name Строка. Необязательное имя префикса, используемое для имени операций, добавленных в apply().
Атрибуты
name Имя объекта ExponentialMovingAverage.

Методы

apply

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

apply(
    var_list=None
)

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

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

теневые переменные создаются с trainable=False и добавляются в коллекцию GraphKeys.ALL_VARIABLES. Они будут возвращены вызовами tf.compat.v1.global_variables().

Возвращает операцию, которая обновляет все теневые переменные из текущего значения соответствующих переменных.

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

Аргументы
var_list Список объектов Variable или Tensor. Переменные и тензоры должны быть типов bfloat16, float16, float32 или float64.
Возвращает
Операция, обновляющая скользящие средние.
Исключения
TypeError Если аргументы не являются допустимым типом.

average

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

average(
    var
)

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

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

average_name

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

average_name(
    var
)

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

Типичный сценарий для ExponentialMovingAverage заключается в вычислении скользящих средних переменных во время обучения и восстановлении переменных из вычисленных скользящих средних во время оценок.

Для восстановления переменных необходимо знать имя теневых переменных. Затем это имя и исходная переменная могут быть переданы объекту Saver() для восстановления переменной из значения скользящего среднего с помощью: saver = tf.compat.v1.train.Saver({ema.average_name(var): var})

average_name() может вызываться независимо от того, был ли вызван apply().

Аргументы
var Объект Variable
Возвращает
Строка: Имя переменной, которая будет или использовалась объектом ExponentialMovingAverage class для хранения скользящего среднего значения var

variables_to_restore

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

variables_to_restore(
    moving_avg_variables=None
)

Возвращает карту имён к Variables для восстановления.

Если у переменной есть скользящее среднее, используйте имя переменной скользящего среднего в качестве имени восстановления; иначе используйте имя переменной.

Например,

variables_to_restore = ema.variables_to_restore()
saver = tf.compat.v1.train.Saver(variables_to_restore)

Ниже приведён пример такой карты:

conv/batchnorm/gamma/ExponentialMovingAverage: conv/batchnorm/gamma,
conv_4/conv2d_params/ExponentialMovingAverage: conv_4/conv2d_params,
global_step: global_step
Аргументы
moving_avg_variables Список переменных, для которых требуется использование имени переменной скользящего среднего для восстановления. Если None, по умолчанию будут использоваться variables.moving_average_variables() + variables.trainable_variables()
Возвращает
Карта от restore_names к переменным. Имя restore_name — это либо исходное, либо версия скользящего среднего имени переменной в зависимости от того, находится ли имя переменной в moving_avg_variables.

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

Spec-Zone.ru

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