tf.keras.optimizers.Optimizer
| Просмотреть исходный код на GitHub |
Базовый класс для оптимизаторов.
Наследуется от: CheckpointableBase
tf.keras.optimizers.Optimizer(
name, **kwargs
)
Этот класс определяет API для добавления операций для обучения модели. Вы никогда не используете этот класс напрямую, а вместо этого создаёте экземпляр одного из его подклассов, таких как 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
В моделях 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 для не усреднения.
Если вы не используете это и хотите усреднить градиенты, вы должны использовать 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])
Написание настраиваемого оптимизатора.
Если вы намерены создать свой собственный алгоритм оптимизации, просто унаследуйте от этого класса и переопределите следующие методы:
- resource_apply_dense (обновление переменной, если тензор градиента плотный)
- resource_apply_sparse (обновление переменной, если тензор градиента разреженный)
- create_slots (если ваш алгоритм оптимизации требует дополнительных переменных)
- get_config (сериализация оптимизатора, включая все гиперпараметры)
| Аргументы | |
|---|---|
name | Непустая строка. Имя, используемое для созданных для оптимизатора аккумуляторов. |
**kwargs | ключевые аргументы. Допускается {clipnorm, clipvalue, lr, decay}. clipnorm - ограничение градиентов по норме; clipvalue - ограничение градиентов по значению, decay включено для обратной совместимости, чтобы разрешить обратное обратное затухание скорости обучения. lr включено для обратной совместимости, рекомендуется использовать learning_rate вместо него. |
| Исключения | |
|---|---|
ValueError | Если имя имеет неправильный формат. |
RuntimeError | Если _create_slots был переопределён вместо _create_vars. |
| Атрибуты | |
|---|---|
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.VariableAggregation.NONE
)
apply_gradients
apply_gradients(
grads_and_vars, name=None
)
Применить градиенты к переменным.
Это вторая часть minimize(). Она возвращает Operation, который применяет градиенты.
| Аргументы | |
|---|---|
grads_and_vars | Список пар (градиент, переменная). |
name | Необязательное имя возвращаемой операции. По умолчанию принимает имя, переданное конструктору Optimizer. |
| Возвращаемое значение | |
|---|---|
Operation, который применяет указанные градиенты. iterations будет автоматически увеличен на 1. |
| Исключения | |
|---|---|
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()
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 | Необязательное имя для возвращаемой операции. |
| Возвращаемое значение | |
|---|---|
Операция, обновляющая переменные в var_list. Если global_step не был None, эта операция также увеличивает global_step. |
| Исключения | |
|---|---|
ValueError | Если некоторые переменные не являются объектами Variable. |
set_weights
set_weights(
weights
)
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/r1.15/api_docs/python/tf/keras/optimizers/Optimizer