Spec-Zone.ru › TensorFlow 2.9

tf.keras.optimizers.legacy.Optimizer

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

Наследуется от: Optimizer

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

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

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

tf.compat.v1.keras.optimizers.legacy.Optimizer

tf.keras.optimizers.legacy.Optimizer(
    name, gradient_aggregator=None, gradient_transformers=None, **kwargs
)

Вы не должны использовать этот класс напрямую, а вместо этого создать экземпляр одного из его подклассов, таких как tf.keras.optimizers.SGD, tf.keras.optimizers.Adam и т. д.

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

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda: 3 * var1 * var1 + 2 * var2 * var2
# In graph mode, returns op that minimizes the loss by updating the listed
# variables.
opt_op = opt.minimize(loss, var_list=[var1, var2])
opt_op.run()
# In eager mode, simply call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])

Использование в пользовательских циклах обучения

В моделях Keras иногда переменные создаются при первом вызове модели, а не во время её создания. Примеры включают 1) последовательные модели без предварительно определённой формы входных данных или 2) модели, созданные с помощью подклассов. В этих случаях передайте var_list как вызываемый объект.

Пример:

opt = tf.keras.optimizers.SGD(learning_rate=0.1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(num_hidden, activation='relu'))
model.add(tf.keras.layers.Dense(num_classes, activation='sigmoid'))
loss_fn = lambda: tf.keras.losses.mse(model(input), output)
var_list_fn = lambda: model.trainable_weights
for input, output in data:
  opt.minimize(loss_fn, var_list_fn)

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

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

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

Пример:

# Create an optimizer.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)

# Compute the gradients for a list of variables.
with tf.GradientTape() as tape:
  loss = <call_loss_function>
vars = <list_of_variables>
grads = tape.gradient(loss, vars)

# Process the gradients, for example cap them, etc.
# capped_grads = [MyCapper(g) for g in grads]
processed_grads = [process_gradient(g) for g in grads]

# Ask the optimizer to apply the processed gradients.
opt.apply_gradients(zip(processed_grads, var_list))

Использование с tf.distribute.Strategy

Этот класс оптимизатора tf.distribute.Strategy -осознающий, что означает автоматическое суммирование градиентов по всем репликам. Для усреднения градиентов разделите свою функцию потерь на глобальный размер пакета, что делается автоматически, если вы используете встроенные в tf.keras циклы обучения или оценки. Обратитесь к аргументу reduction вашей функции потерь, который должен быть установлен на tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE для усреднения или tf.keras.losses.Reduction.SUM для отсутствия усреднения.

Для самостоятельной агрегации градиентов вызовите apply_gradients с experimental_aggregate_gradients установленным в False. Это полезно, если вам нужно обработать агрегированные градиенты.

Если вы этого не делаете и хотите усреднить градиенты, вы должны использовать tf.math.reduce_sum для суммирования потерь по каждому примеру, а затем разделить на глобальный размер пакета. Обратите внимание, что при использовании tf.distribute.Strategy первый компонент формы тензора является *локальным* размером пакета реплики, что отличается на множитель, равный количеству реплик, используемых для вычисления одного шага. В результате использование tf.math.reduce_mean даст неправильный ответ, что приведёт к градиентам, которые могут быть во много раз слишком большими.

Ограничения переменных

Все оптимизаторы Keras учитывают ограничения переменных. Если функция ограничения передана для любой переменной, ограничение будет применено к переменной после применения градиента к этой переменной. Важно: если градиент является разреженным тензором, ограничение переменной не поддерживается.

Совместимость с потоками

Весь оптимизатор в настоящее время совместим с потоками, но не потокобезопасен. Пользователь должен выполнить синхронизацию при необходимости.

Слот

Многие подклассы оптимизаторов, такие как Adam и Adagrad, выделяют и управляют дополнительными переменными, связанными с переменными для обучения. Они называются слотами. Слот имеет имя, и вы можете запросить у оптимизатора имена слотов, которые он использует. После того, как у вас есть имя слота, вы можете запросить у оптимизатора переменную, созданную для хранения значения слота.

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

Гиперпараметры

Это аргументы, передаваемые в конструктор подкласса оптимизатора (метод __init__), а затем передаваемые в self._set_hyper(). Они могут быть обычными значениями Python (например, 1.0), тензорами или вызываемыми объектами. Если это вызываемый объект, вызываемый объект будет вызван во время apply_gradients() для получения значения для гиперпараметра.

Гиперпараметры можно переопределить через пользовательский код:

Пример:

# Create an optimizer with the desired parameters.
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
# `loss` is a callable that takes no argument and returns the value
# to minimize.
loss = lambda: 3 * var1 + 2 * var2
# In eager mode, simply call minimize to update the list of variables.
opt.minimize(loss, var_list=[var1, var2])
# update learning rate
opt.learning_rate = 0.05
opt.minimize(loss, var_list=[var1, var2])

Вызываемая функция скорости обучения

Оптимизатор принимает вызываемую функцию скорости обучения двумя способами. Первый способ — через встроенную или настраиваемую tf.keras.optimizers.schedules.LearningRateSchedule. Расписание будет вызываться на каждой итерации с schedule(iteration), переменной, принадлежащей оптимизатору.

Пример:

var = tf.Variable(np.random.random(size=(1,)))
learning_rate = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=.01, decay_steps=20, decay_rate=.1)
opt = tf.keras.optimizers.SGD(learning_rate=learning_rate)
loss = lambda: 3 * var
opt.minimize(loss, var_list=[var])
<tf.Variable...

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

Пример:

var = tf.Variable(np.random.random(size=(1,)))
def lr_callable():
  return .1
opt = tf.keras.optimizers.SGD(learning_rate=lr_callable)
loss = lambda: 3 * var
opt.minimize(loss, var_list=[var])
<tf.Variable...

Создание пользовательского оптимизатора

Если вы хотите создать собственный алгоритм оптимизации, просто унаследуйте от этого класса и переопределите следующие методы:

  • _resource_apply_dense (обновление переменной, учитывая тензор градиента является плотным tf.Tensor)
  • _resource_apply_sparse (обновление переменной, учитывая тензор градиента является разреженным tf.IndexedSlices. Наиболее распространённым способом этого является взятие градиента через tf.gather.)
  • _create_slots (если вашему алгоритму оптимизатора требуются дополнительные переменные)
  • get_config (сериализация оптимизатора, включая все гиперпараметры)
Аргументы
name Строка. Имя для использования в качестве накопителей импульса весов, созданных оптимизатором.
gradient_aggregator Функция для агрегирования градиентов по устройствам (при использовании tf.distribute.Strategy). Если None, по умолчанию суммирует градиенты по устройствам. Функция должна принимать и возвращать список кортежей (gradient, variable).
gradient_transformers Необязательно. Список функций для преобразования градиентов перед применением обновлений к переменным. Функции применяются после gradient_aggregator. Функции должны принимать и возвращать список кортежей (gradient, variable).
**kwargs ключевые аргументы. Разрешенные аргументы: clipvalue, clipnorm, global_clipnorm. Если clipvalue (число с плавающей запятой) установлено, градиент каждого веса ограничивается значением не выше этого значения. Если clipnorm (число с плавающей запятой) установлено, градиент каждого веса индивидуально ограничен таким образом, что его норма не превышает это значение. Если global_clipnorm (число с плавающей запятой) установлено, градиент всех весов ограничивается таким образом, что их глобальная норма не превышает этого значения.
Исключения
ValueError в случае каких-либо неверных аргументов.

© 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/versions/r2.9/api_docs/python/tf/keras/optimizers/legacy/Optimizer

Spec-Zone.ru

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