tf.compat.v1.train.Optimizer
Базовый класс для оптимизаторов.
tf.compat.v1.train.Optimizer(
use_locking, name
)
Переход на TF2
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() выполняет как вычисление градиентов, так и их применение к переменным. Если перед применением градиентов требуется их обработать, можно использовать оптимизатор в три этапа:
- Вычислите градиенты с помощью
compute_gradients(). - Обработайте градиенты нужным образом.
- Примените обработанные градиенты с помощью
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
В 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