tf.keras.optimizers.Optimizer
| Просмотреть исходный код на GitHub |
Базовый класс для оптимизаторов Keras.
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() обрабатывает вычисление градиентов и их применение к переменным. Если вы хотите обработать градиенты перед их применением, вы можете использовать оптимизатор в три шага:
- Вычислите градиенты с помощью
tf.GradientTape. - Обработайте градиенты по своему желанию.
- Примените обработанные градиенты с помощью
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