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