Предположим, я хочу написать собственный класс оптимизатора, соответствующий API tf.keras
(обратите внимание, что в настоящее время я использую TensorFlow 2.0.0). Меня смущает документированный способ сделать это по сравнению с тем, что сделано в реализациях.
Документация для tf.keras.optimizers.Optimizer
состояний ,
### Write a customized optimizer.
If you intend to create your own optimization algorithm, simply inherit from
this class and override the following methods:
- resource_apply_dense (update variable given gradient tensor is dense)
- resource_apply_sparse (update variable given gradient tensor is sparse)
- create_slots (if your optimizer algorithm requires additional variables)
Однако текущий *Реализация 1010 * не определяет метод resource_apply_dense
, но действительно определяет приватный метод-заглушку _resource_apply_dense
. Аналогично, нет методов resource_apply_sparse
или create_slots
, но есть заглушка метода _resource_apply_sparse
и вызов метода _create_slots
.
Inофициальные tf.keras.optimizers.Optimizer
подклассы (используя tf.keras.optimizers.Adam
в качестве примера), существуют методы _resource_apply_dense
, _resource_apply_sparse
и _create_slots
, инет таких методов без начального подчеркивания.
Существуют похожие методы подчеркивания с начальным подчеркиванием в чуть менее официальных подклассах tf.keras.optimizers.Optimizer
(например, tfa.optimizers.MovingAverage
из TensorFlow Addons).
Еще один неприятный момент для меня заключается в том, что оптимизаторы аддонов TensorFlow также переопределяют метод apply_gradients
, тогда как оптимизаторы tf.keras.optimizers
нет.
Более того, я заметилчто метод apply_gradients
метода tf.keras.optimizers.Optimizer
вызывает _create_slots
, но базовый класс tf.keras.optimizers.Optimizer
не имеет метода _create_slots
. Итак, кажется, что _create_slots
метод должен быть определен в подклассе оптимизатора, если этот подкласс не переопределяет apply_gradients
.
Вопросы
Чтоправильный способ подкласса tf.keras.optimizers.Optimizer
? В частности,
- Указывает ли перечисленная вверху документация
tf.keras.optimizers.Optimizer
просто на переопределение версий методов, которые они упоминают (например, _resource_apply_dense
вместо resource_apply_dense
)? Если да, то есть ли какие-либо гарантии API относительно того, что эти приватно выглядящие методы не изменят своего поведения в будущих версиях TensorFlow? - Когда можно переопределить
apply_gradients
в дополнение к _apply_resource_[dense|sparse]
методам?