Spec-Zone.ru › TensorFlow 2.4

tf.keras.optimizers.Optimizer

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

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

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

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

tf.optimizers.Optimizer

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

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

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 -aware, что означает, что он автоматически суммирует градиенты по всем репликам. Для усреднения градиентов разделите свою функцию потерь на общий размер пакета, что делается автоматически, если вы используете встроенные в 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 (обновить переменную, если тензор градиента плотный)
  • _resource_apply_sparse (обновить переменную, если тензор градиента разреженный)
  • _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. Если установлено, градиенты ограничиваются максимальной нормой.
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)

Аргументы
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.

Следует использовать только в режиме графа legacy 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 для этой простой модели возвращает список из трёх значений — счётчик итераций, а затем среднеквадратичные значения ядра и смещения единственного слоя 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, tape=None
)

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

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

Аргументы
loss Tensor или вызываемый объект. Если вызываемый объект, loss не должен принимать аргументы и возвращать значение для минимизации. Если Tensor, аргумент tape должен быть передан.
var_list список или кортеж объектов Variable для обновления, чтобы минимизировать loss, или вызываемый объект, возвращающий список или кортеж объектов Variable . Используйте вызываемый объект, когда список переменных в противном случае будет неполным до вызова minimize, так как переменные создаются в первый раз, когда вызывается loss.
grad_loss (Необязательно). Tensor, содержащий градиент, вычисленный для loss.
name (Необязательно) строка. Имя возвращаемой операции.
tape (Необязательно) tf.GradientTape. Если loss предоставлен как вызываемый объект, необходимо предоставить ленту, которая вычислила loss .
Возвращаемое значение
Операция 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.4/api_docs/python/tf/keras/optimizers/Optimizer

Spec-Zone.ru

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