Spec-Zone.ru › TensorFlow

tf.compat.v1.train.Optimizer

Базовый класс для оптимизаторов.

tf.compat.v1.train.Optimizer(
    use_locking, name
)

Переход на TF2

Внимание: Этот API разработан для TensorFlow v1. Продолжайте читать, чтобы узнать, как перейти с этого API на собственный эквивалент TensorFlow v2. Инструкции по переносу остальной части кода см. в руководстве по переходу с TensorFlow v1 на TensorFlow v2.

tf.compat.v1.train.Optimizer можно использовать в режиме eager и с tf.function, но это не рекомендуется. В TF2 вместо этого используйте подклассы tf.keras.optimizers.Optimizer. Примеры см. в разделах Основные циклы обучения и Создание цикла обучения с нуля.

Если ваш код TF1 содержит символ tf.compat.v1.train.Optimizer, его нельзя просто заменить соответствующими tf.keras.optimizers.Optimizer. Для перехода на TF2 рекомендуется перенести всю программу обучения на основе Keras Model.fit или на пользовательские циклы обучения TF2.

Структурное соответствие собственному TF2

До:

sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
opt_op.run(session=session)

После:

sgd = tf.keras.optimizers.SGD(3.0)
sgd.minimize(cost_fn, [var0, var1])

Сопоставление аргументов

Имя аргумента TF1 Имя аргумента TF2 Примечание
use_locking Не поддерживается -
name name. -

Пример использования до и после

До:

g = tf.compat.v1.Graph()
with g.as_default():
  var0 = tf.compat.v1.Variable([1.0, 2.0])
  var1 = tf.compat.v1.Variable([3.0, 4.0])
  cost = 5 * var0 + 3 * var1
  global_step = tf.compat.v1.Variable(
      tf.compat.v1.zeros([], tf.compat.v1.int64), name='global_step')
  init_op = tf.compat.v1.initialize_all_variables()
  sgd_op = tf.compat.v1.train.GradientDescentOptimizer(3.0)
  opt_op = sgd_op.minimize(cost, global_step, [var0, var1])
session = tf.compat.v1.Session(graph=g)
session.run(init_op)
opt_op.run(session=session)
print(session.run(var0))
[-14. -13.]

После:

>>> var0 = tf.Variable([1.0, 2.0])
>>> var1 = tf.Variable([3.0, 4.0])
>>> cost_fn = lambda: 5 * var0 + 3 * var1
>>> sgd = tf.keras.optimizers.SGD(3.0)
>>> sgd.minimize(cost_fn, [var0, var1])
>>> print(var0.numpy())
[-14. -13.]

Описание

Этот класс определяет API для добавления операций обучения модели. Этот класс не используется напрямую: вместо этого создайте экземпляр одного из его подклассов, например GradientDescentOptimizer, AdagradOptimizer или MomentumOptimizer.

Использование

# Create an optimizer with the desired parameters.
opt = GradientDescentOptimizer(learning_rate=0.1)
# Add Ops to the graph to minimize a cost by updating a list of variables.
# "cost" is a Tensor, and the list of variables contains tf.Variable
# objects.
opt_op = opt.minimize(cost, var_list=<list of variables>)

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

# Execute opt_op to do one step of training:
opt_op.run()

Обработка градиентов перед их применением.

Вызов minimize() выполняет как вычисление градиентов, так и их применение к переменным. Если перед применением градиентов требуется их обработать, можно использовать оптимизатор в три этапа:

  1. Вычислите градиенты с помощью compute_gradients().
  2. Обработайте градиенты нужным образом.
  3. Примените обработанные градиенты с помощью apply_gradients().

Пример:

# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)

# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss, <list of variables>)

# grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]

# Ask the optimizer to apply the capped gradients.
opt.apply_gradients(capped_grads_and_vars)

Управление синхронизацией градиентов

Методы minimize() и compute_gradients() принимают аргумент gate_gradients, который управляет степенью параллелизма при применении градиентов.

Возможные значения: GATE_NONE, GATE_OP и GATE_GRAPH.

GATE_NONE: вычислять и применять градиенты параллельно. Это обеспечивает максимальный параллелизм выполнения, но результаты могут быть невоспроизводимыми. Например, два градиента matmul зависят от входных значений: при использовании GATE_NONE один из градиентов может быть применен к одному из входов до вычисления другого градиента, что приведет к невоспроизводимым результатам.

GATE_OP: для каждой операции гарантировать, что все градиенты вычислены до их использования. Это предотвращает состояния гонки для операций, которые вычисляют градиенты для нескольких входов, если градиенты зависят от входов.

GATE_GRAPH: гарантировать, что все градиенты для всех переменных вычислены до использования любого из них. Это обеспечивает наименьший параллелизм, но может быть полезно, если требуется обработать все градиенты до применения любого из них.

Слоты

Некоторые подклассы оптимизаторов, например MomentumOptimizer и AdagradOptimizer, выделяют и управляют дополнительными переменными, связанными с обучаемыми переменными. Они называются слотами. У слотов есть имена, и у оптимизатора можно запросить список имен используемых слотов. Узнав имя слота, можно запросить у оптимизатора переменную, созданную для хранения значения этого слота.

Это может быть полезно для журналирования отладки алгоритма обучения, вывода статистики по слотам и т. д.

Аргументы
use_locking Логическое значение. Если True, для предотвращения параллельного обновления переменных используются блокировки.
name Непустая строка. Имя, которое будет использоваться для аккумуляторов, создаваемых оптимизатором.
Вызывает исключения
ValueError Если имя имеет неверный формат.

Методы

apply_gradients

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

apply_gradients(
    grads_and_vars,
    global_step=None,
    name=None,
    skip_gradients_aggregation=False
)

Применяет градиенты к переменным.

Это вторая часть minimize(). Метод возвращает Operation, применяющую градиенты.

@compatibility(TF2)

Сопоставление аргументов

Имя аргумента TF1 Имя аргумента TF2 Примечание
grads_and_vars grads_and_vars -
global_step Не поддерживается. Используйте optimizer.iterations
name name. -
Аргументы
grads_and_vars Список пар (градиент, переменная), возвращаемый методом compute_gradients().
global_step Необязательный Variable, который увеличивается на единицу после обновления переменных.
name Необязательное имя возвращаемой операции. По умолчанию используется имя, переданное конструктору Optimizer.
skip_gradients_aggregation Если true, агрегирование градиентов не выполняется внутри оптимизатора. Обычно этому аргументу присваивается True, если вы пишете пользовательский код для агрегирования градиентов вне оптимизатора.
Возвращает
Operation, применяющий указанные градиенты. Если global_step не равен None, эта операция также увеличивает global_step.
Вызывает исключения
TypeError Если grads_and_vars имеет неверный формат.
ValueError Если ни у одной из переменных нет градиентов.
RuntimeError Если вместо этого следует использовать _distributed_apply().

compute_gradients

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

compute_gradients(
    loss,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    grad_loss=None
)

Вычисляет градиенты loss для переменных из var_list.

Переход на TF2

Внимание: Этот API разработан для TensorFlow v1. Продолжайте читать, чтобы узнать, как перейти с этого API на собственный эквивалент TensorFlow v2. Инструкции по переносу остальной части кода см. в руководстве по переходу с TensorFlow v1 на TensorFlow v2.

В TF2 у tf.keras.optimizers.Optimizer нет метода compute_gradients; для получения градиентов следует использовать tf.GradientTape:

@tf.function
def train step(inputs):
  batch_data, labels = inputs
  with tf.GradientTape() as tape:
    predictions = model(batch_data, training=True)
    loss = tf.keras.losses.CategoricalCrossentropy(
        reduction=tf.keras.losses.Reduction.NONE)(labels, predictions)
  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

Аргументы: loss: тензор, содержащий минимизируемое значение, или вызываемый объект без аргументов, возвращающий минимизируемое значение. При включенном eager-выполнении он должен быть вызываемым объектом. var_list: необязательный список или кортеж объектов tf.Variable, которые нужно обновить для минимизации loss. По умолчанию используется список переменных, собранных в графе под ключом GraphKeys.TRAINABLE_VARIABLES. gate_gradients: способ управления вычислением градиентов. Возможные значения: GATE_NONE, GATE_OP или GATE_GRAPH. aggregation_method: задает способ объединения слагаемых градиента. Допустимые значения определены в классе AggregationMethod. colocate_gradients_with_ops: если True, попытаться разместить градиенты рядом с соответствующей операцией. grad_loss: необязательно. Tensor, содержащий градиент, вычисленный для loss.

Возвращает: список пар (градиент, переменная). Переменная присутствует всегда, но градиент может быть None.

Вызывает исключения: TypeError: если var_list содержит что-либо, кроме объектов Variable. ValueError: если некоторые аргументы недопустимы. RuntimeError: если метод вызван при включенном eager-выполнении, а loss не является вызываемым объектом.

@compatibility(eager) При включенном eager-выполнении аргументы gate_gradients, aggregation_method и colocate_gradients_with_ops игнорируются.

Описание

Это первая часть minimize(). Метод возвращает список пар (градиент, переменная), где «градиент» — это градиент для «переменной». Обратите внимание, что «градиентом» может быть Tensor, IndexedSlices или None, если для данной переменной градиент отсутствует.

get_name

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

get_name()

get_slot

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

get_slot(
    var, name
)

Возвращает слот с именем name, созданный оптимизатором для var.

Некоторые подклассы Optimizer используют дополнительные переменные. Например, Momentum и Adagrad используют переменные для накопления обновлений. Этот метод предоставляет доступ к объектам Variable, если они вам зачем-либо понадобятся.

Используйте get_slot_names(), чтобы получить список имен слотов, созданных объектом Optimizer.

Аргументы
var Переменная, переданная в minimize() или apply_gradients().
name Строка.
Возвращает
Variable слота, если он был создан, иначе None.

get_slot_names

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

get_slot_names()

Возвращает список имен слотов, созданных объектом Optimizer.

См. get_slot().

Возвращает
Список строк.

minimize

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

minimize(
    loss,
    global_step=None,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    name=None,
    grad_loss=None
)

Добавляет операции для минимизации loss путем обновления var_list.

Этот метод просто объединяет вызовы compute_gradients() и apply_gradients(). Если перед применением градиента требуется его обработать, вызовите compute_gradients() и apply_gradients() явно, а не используйте эту функцию.

Аргументы
loss Tensor, содержащий минимизируемое значение.
global_step Необязательный Variable, который увеличивается на единицу после обновления переменных.
var_list Необязательный список или кортеж объектов Variable, которые нужно обновить для минимизации loss. По умолчанию используется список переменных, собранных в графе под ключом GraphKeys.TRAINABLE_VARIABLES.
gate_gradients Способ управления вычислением градиентов. Возможные значения: GATE_NONE, GATE_OP или GATE_GRAPH.
aggregation_method Задает способ объединения слагаемых градиента. Допустимые значения определены в классе AggregationMethod.
colocate_gradients_with_ops Если True, попытаться разместить градиенты рядом с соответствующей операцией.
name Необязательное имя возвращаемой операции.
grad_loss Необязательно. Tensor, содержащий градиент, вычисленный для loss.
Возвращает
Операцию, которая обновляет переменные из var_list. Если global_step не равен None, эта операция также увеличивает global_step.
Вызывает исключения
ValueError Если некоторые переменные не являются объектами Variable.

Совместимость с eager-выполнением

При включенном eager-выполнении loss должна быть функцией Python без аргументов, вычисляющей минимизируемое значение. Минимизация (и вычисление градиента) выполняется относительно элементов var_list, если он не равен None, а в противном случае — относительно всех обучаемых переменных, созданных во время выполнения функции loss. При включенном eager-выполнении аргументы gate_gradients, aggregation_method, colocate_gradients_with_ops и grad_loss игнорируются.

variables

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

variables()

Список переменных, описывающих текущее состояние Optimizer.

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

Возвращает
Список переменных.
Переменные класса
GATE_GRAPH 2
GATE_NONE 0
GATE_OP 1

© 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/compat/v1/train/Optimizer

Spec-Zone.ru

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