Spec-Zone.ru › TensorFlow 2.9

tf.keras.optimizers.Optimizer

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

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

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

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

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

tf.compat.v1.keras.optimizers.Optimizer

tf.keras.optimizers.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 учитывает, что автоматически суммирует градиенты по всем репликам. Для усреднения градиентов разделите вашу функцию потерь на глобальный размер пакета, что выполняется автоматически, если вы используете встроенные циклы обучения или оценки 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 в случае некорректных аргументов.
Атрибуты
clipnorm float или None. Если установлено, градиенты ограничиваются максимальной нормой.
clipvalue float или None. Если установлено, градиенты ограничиваются максимальным значением.
global_clipnorm float или None.

Если установлено, градиенты ограничиваются максимальной нормой.

См. tf.clip_by_global_norm для получения дополнительной информации.

iterations Переменная. Количество шагов обучения, выполненных этим оптимизатором.
weights Возвращает переменные этого оптимизатора в порядке их создания.

Методы

add_slot

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

add_slot(
    var, slot_name, initializer='zeros', shape=None
)

Добавление новой слотовой переменной для var.

Слотовая переменная — это дополнительная переменная, связанная с var для обучения. Она выделяется и управляется оптимизаторами, например, Adam.

Аргументы
var объект Variable .
slot_name имя слотовой переменной.
initializer инициализатор слотовой переменной
shape (Необязательно) форма слотовой переменной. Если не установлено, по умолчанию будет использована форма var.
Возвращаемое значение
Слотовая переменная.

add_weight

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

add_weight(
    name,
    shape,
    dtype=None,
    initializer='zeros',
    trainable=None,
    synchronization=tf.VariableSynchronization.AUTO,
    aggregation=tf.VariableAggregation.NONE
)

apply_gradients

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

apply_gradients(
    grads_and_vars, name=None, experimental_aggregate_gradients=True
)

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

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

Метод по умолчанию суммирует градиенты со всех реплик при использовании tf.distribute.Strategy. Вы можете самостоятельно агрегировать градиенты, передав experimental_aggregate_gradients=False.

Пример:

grads = tape.gradient(loss, vars)
grads = tf.distribute.get_replica_context().all_reduce('sum', grads)
# Processing aggregated gradients.
optimizer.apply_gradients(zip(grads, vars),
    experimental_aggregate_gradients=False)

Аргументы
grads_and_vars Список пар (градиент, переменная).
name Необязательное имя для возвращаемой операции. По умолчанию используется имя, переданное конструктору Optimizer.
experimental_aggregate_gradients Нужно ли суммировать градиенты с разных реплик при наличии tf.distribute.Strategy. Если False, ответственность за агрегацию градиентов лежит на пользователе. По умолчанию True.
Возвращаемое значение
Объект Operation, применяющий указанные градиенты. Счётчик iterations автоматически увеличится на 1.
Исключения
TypeError Если grads_and_vars имеет неправильный формат.
ValueError Если ни у одной из переменных нет градиентов.
RuntimeError Если вызов происходит в контексте кросс-репликации.

from_config

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

@classmethod
from_config(
    config, custom_objects=None
)

Создаёт оптимизатор из его конфигурации.

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

Аргументы
config Словарь Python, обычно результат вызова get_config.
custom_objects Словарь Python, сопоставляющий имена с дополнительными объектами Python, используемыми для создания этого оптимизатора, например, функцией, используемой для гиперпараметра.
Возвращаемое значение
Экземпляр оптимизатора.

get_config

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

@abc.abstractmethod
get_config()

Возвращает конфигурацию оптимизатора.

Конфигурация оптимизатора — это словарь Python (сериализуемый), содержащий конфигурацию оптимизатора. Тот же оптимизатор можно повторно создать позже (без сохранения состояния) из этой конфигурации.

Возвращаемое значение
Словарь Python.

get_gradients

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

get_gradients(
    loss, params
)

Возвращает градиенты loss по отношению к params.

Должен использоваться только в режиме v1 графиков.

Аргументы
loss Тензор потери.
params Список переменных.
Возвращаемое значение
Список тензоров градиента.
Исключения
ValueError В случае, если градиент не может быть вычислен (например, если функция градиента не реализована).

get_slot

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

get_slot(
    var, slot_name
)

get_slot_names

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

get_slot_names()

Список имён слотов этого оптимизатора.

get_updates

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

get_updates(
    loss, params
)

get_weights

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

get_weights()

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

Веса оптимизатора — это его состояние (т.е. переменные). Эта функция возвращает значения весов, связанные с этим оптимизатором, как список массивов NumPy. Первое значение всегда — счётчик итераций оптимизатора, за которым следуют переменные состояния оптимизатора в порядке их создания. Возвращаемый список можно использовать для загрузки состояния в аналогичные параметризованные оптимизаторы.

Например, оптимизатор RMSprop для этой простой модели возвращает список из трёх значений — счётчик итераций, а затем среднеквадратичное значение (RMS) для ядра и смещения единственного слоя Dense:

opt = tf.keras.optimizers.RMSprop()
m = tf.keras.models.Sequential([tf.keras.layers.Dense(10)])
m.compile(opt, loss='mse')
data = np.arange(100).reshape(5, 20)
labels = np.zeros(5)
results = m.fit(data, labels)  # Training.
len(opt.get_weights())
3
Возвращаемое значение
Значения весов как список массивов NumPy.

minimize

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

minimize(
    loss, var_list, grad_loss=None, name=None, tape=None
)

Минимизирует loss обновляя var_list.

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

Аргументы
loss Значение для минимизации или вызываемая функция. Если вызываемая функция, она должна не принимать аргументы и возвращать значение для минимизации. Если значение, аргумент tape должен быть передан.
var_list Список или кортеж объектов Variable, которые нужно обновить для минимизации loss, или вызываемая функция, возвращающая список или кортеж объектов Variable. Используйте вызываемую функцию, когда список переменных в противном случае будет неполным до minimize, так как переменные создаются в первый раз, когда вызывается loss.
grad_loss (Необязательно). Объект Tensor, содержащий градиент, вычисленный для loss.
name (Необязательно) str. Имя для возвращаемой операции.
tape (Необязательно) tf.GradientTape. Если loss предоставляется как вызываемая функция, должна быть предоставлена лента, которая вычислила loss .
Возвращаемое значение
Объект Operation, обновляющий переменные в var_list. Счётчик iterations автоматически увеличится на 1.
Исключения
ValueError Если некоторые из переменных не являются объектами Variable .

set_weights

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

set_weights(
    weights
)

Устанавливает веса оптимизатора.

Веса оптимизатора — это его состояние (т.е. переменные). Эта функция принимает значения весов, связанные с этим оптимизатором, как список массивов NumPy. Первое значение всегда — счётчик итераций оптимизатора, за которым следуют переменные состояния оптимизатора в порядке их создания. Переданные значения используются для установки нового состояния оптимизатора.

Например, оптимизатор RMSprop для этой простой модели принимает список из трёх значений — счётчик итераций, а затем среднеквадратичное значение (RMS) для ядра и смещения единственного слоя Dense:

opt = tf.keras.optimizers.RMSprop()
m = tf.keras.models.Sequential([tf.keras.layers.Dense(10)])
m.compile(opt, loss='mse')
data = np.arange(100).reshape(5, 20)
labels = np.zeros(5)
results = m.fit(data, labels)  # Training.
new_weights = [np.array(10), np.ones([20, 10]), np.zeros([10])]
opt.set_weights(new_weights)
opt.iterations
<tf.Variable 'RMSprop/iter:0' shape=() dtype=int64, numpy=10>
Аргументы
weights Значения весов как список массивов NumPy.

variables

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

variables()

Возвращает переменные этого оптимизатора в порядке их создания.

© 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/Optimizer

Spec-Zone.ru

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