Предположим, я хочу написать собственный класс оптимизатора, соответствующий tf.kerasAPI (используя версию 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_slotstf.keras.optimizers.Optimizer_create_slots_create_slotsapply_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), но тогда они еще не должны появляться в общедоступной документации .