tf.train.ExponentialMovingAverage
| Просмотреть исходный код на GitHub |
Поддерживает скользящие средние значений переменных с использованием экспоненциального затухания.
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/r1.15/api_docs/python/tf/train/ExponentialMovingAverage