Предположим, я хочу написать собственный класс оптимизатора, соответствующий tf.keras
API (используя версию TensorFlow> = 2.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)
Однако, текущая tf.keras.optimizers.Optimizer
реализация не определяет resource_apply_dense
метод, но он делает определение частного вида _resource_apply_dense
метода заглушки . Не Аналогичным образом , не существует никаких resource_apply_sparse
или create_slots
методы, но есть _resource_apply_sparse
метод заглушки и _create_slots
вызов метода .
В официальных 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: _resource_apply_dense
, _resource_apply_sparse
, _create_slots
).
Еще один неприятный момент для меня заключается в том, что некоторые оптимизаторы аддонов TensorFlow также переопределяют apply_gradients
метод (например, tfa.optimizers.MovingAverage
), а 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]
методам?
Редактировать. Открытый вопрос на GitHub: # 36449
_resource_apply_dense
или _resource_apply_sparse
, и увидеть их использование в реализованных оптимизаторах. Я думаю, что публичного API с гарантиями стабильности может и не быть, я бы сказал, что использовать его довольно безопасно. Они просто должны дать лучшее руководство в этом аспекте.
get_config
), но тогда они еще не должны появляться в общедоступной документации .