tf.compat.v1.train.Optimizer
Базовый класс для оптимизаторов.
tf.compat.v1.train.Optimizer(
use_locking, name
)
Переход к TF2
tf.compat.v1.train.Optimizer может использоваться в режиме eager и tf.function, но это не рекомендуется. Вместо этого используйте подклассы tf.keras.optimizers.Optimizer в TF2. Пожалуйста, обратитесь к основным циклам обучения или созданию пользовательского цикла обучения для примеров.
Если ваш код TF1 содержит символ tf.compat.v1.train.Optimizer, вы не можете просто заменить его соответствующим tf.keras.optimizers.Optimizer в TF2. Для миграции в 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
tf.keras.optimizers.Optimizer в TF2 не предоставляет метод 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: Tensor, содержащий значение для минимизации, или вызываемый объект без аргументов, возвращающий значение для минимизации. При включённом режиме выполнения 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: Необязательно. A Tensor, содержащий градиент, вычисленный для loss.
Возвращаемое значение: Список пар (градиент, переменная). Переменная всегда присутствует, но градиент может быть None.
Исключения: TypeError: Если var_list содержит что-либо кроме объектов Variable. ValueError: Если некоторые аргументы неверны. RuntimeError: Если вызов осуществляется с включённым режимом eager и loss не является вызываемым объектом.
@совместимость(eager) При включённом режиме eager execution, 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 | Необязательно. A Tensor, содержащий градиент, вычисленный для loss. |
| Возвращаемое значение | |
|---|---|
Операция, обновляющая переменные в var_list. Если global_step не был None, эта операция также увеличивает global_step. |
| Исключения | |
|---|---|
ValueError | Если некоторые переменные не являются объектами Variable. |
совместимость с eager
При включённом режиме eager execution, loss должен быть Python-функцией без аргументов, вычисляющей значение для минимизации. Минимизация (и вычисление градиента) выполняется относительно элементов var_list, если он не None, иначе относительно всех обучаемых переменных, созданных во время выполнения функции loss. gate_gradients, aggregation_method, colocate_gradients_with_ops и grad_loss игнорируются при включённом eager execution.
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