Spec-Zone.ru › TensorFlow 2.3

tf.keras.optimizers.Optimizer

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

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

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

Основные псевдонимы

tf.optimizers.Optimizer

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

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

tf.compat.v1.keras.optimizers.Optimizer

tf.keras.optimizers.Optimizer(
    name, **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), принадлежащей tf.Variable оптимизатора.

Пример:

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 (обновить переменную, если тензор градиента плотный)
  • _resource_apply_sparse (обновить переменную, если тензор градиента разреженный)
  • _create_slots (если ваш алгоритм оптимизации требует дополнительных переменных)
  • get_config (сериализация оптимизатора, включая все гиперпараметры)
Args
name Непустая строка. Имя для накопителей, созданных для оптимизатора.
**kwargs аргументы ключевых слов. Разрешено {clipnorm, clipvalue, lr, decay}. clipnorm — ограничение градиентов по норме; clipvalue — ограничение градиентов по значению, decay — включено для обратной совместимости, чтобы разрешить обратное обратное затухание скорости обучения. lr — включено для обратной совместимости, рекомендуется использовать learning_rate вместо этого.
Raises
ValueError Если имя имеет неправильный формат.
Атрибуты
iterations Переменная. Количество шагов обучения, выполненных этим оптимизатором.
weights Возвращает переменные этого оптимизатора в порядке их создания.

Методы

add_slot

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

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

Добавить новую переменную-слот для var.

add_weight

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

add_weight(
    name, shape, dtype=None, initializer='zeros', trainable=None,
    synchronization=tf.VariableSynchronization.AUTO,
    aggregation=tf.compat.v1.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)

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

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.

Аргументы
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 для этой простой модели возвращает список из трёх значений: счётчик итераций, а также корневое среднеквадратическое значение ядра и смещения единственного слоя 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)
print('Training'); results = m.fit(data, labels)
Training ...
len(opt.get_weights())
3
Возвращает
Значения весов в виде списка массивов NumPy.

minimize

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

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

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

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

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

set_weights

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

set_weights(
    weights
)

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

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

Например, оптимизатор RMSprop для этой простой модели принимает список из трёх значений: счётчик итераций, а также корневое среднеквадратическое значение ядра и смещения единственного слоя 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)
print('Training'); 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()

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

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/keras/optimizers/Optimizer

Spec-Zone.ru

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