Załóżmy, że chcę napisać niestandardową klasę optymalizatora zgodną z tf.kerasinterfejsem API (używając wersji TensorFlow> = 2.0). Jestem zdezorientowany co do udokumentowanego sposobu wykonania tej czynności w porównaniu z tym, co zostało zrobione we wdrożeniach.
Dokumentacja tf.keras.optimizers.Optimizer stanów ,
### 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)
Jednak obecna tf.keras.optimizers.Optimizerimplementacja nie definiuje resource_apply_densemetody, ale nie definiują prywatną wyglądające _resource_apply_densemetody niedopałek . Podobnie nie ma metod resource_apply_sparseani create_slotsmetod, ale istnieją kody pośredniczące _resource_apply_sparsemetod i _create_slotswywołanie metod .
Oficjalnych tf.keras.optimizers.Optimizerpodklasy (stosując tf.keras.optimizers.Adamjako przykład), są _resource_apply_dense, _resource_apply_sparse, i _create_slotssposobów, i nie ma takiej metody bez początkowego podkreślenia.
Istnieją podobne metody wiodące podkreślenia w nieznacznie mniej oficjalnych tf.keras.optimizers.Optimizerpodklasy (np tfa.optimizers.MovingAveragez TensorFlow dodatki: _resource_apply_dense, _resource_apply_sparse, _create_slots).
Innym mylącym dla mnie punktem jest to, że niektóre optymalizatory TensorFlow Addons również zastępują apply_gradientsmetodę (np. tfa.optimizers.MovingAverage), Podczas gdy tf.keras.optimizersoptymalizatory nie.
Ponadto zauważyłem, że apply_gradientsmetody tf.keras.optimizers.Optimizermetody połączeń_create_slots , ale podstawa tf.keras.optimizers.Optimizerklasa nie ma _create_slotsmetody. Wygląda więc na to, że należy zdefiniować _create_slotsmetodę w podklasie optymalizatora, jeśli ta podklasa się nie przesłoni .apply_gradients
pytania
Jaki jest prawidłowy sposób na podklasę a tf.keras.optimizers.Optimizer? Konkretnie,
- Czy
tf.keras.optimizers.Optimizerdokumentacja wymieniona u góry oznacza po prostu zastąpienie wiodących wersji podkreślonych metod, o których wspominają (np._resource_apply_denseZamiastresource_apply_dense)? Jeśli tak, to czy są jakieś gwarancje API, że te prywatne metody nie zmieniają swojego zachowania w przyszłych wersjach TensorFlow? Jakie są podpisy tych metod? - Kiedy można zastąpić metody
apply_gradientsoprócz_apply_resource_[dense|sparse]metod?
Edytować. Otwarty problem w GitHub: # 36449
_resource_apply_denselub _resource_apply_sparsei zobaczyć ich użycie w zaimplementowanych optymalizatorach. Wydaje mi się, że nie może to być publiczny interfejs API z gwarancjami stabilności, ale powiedziałbym, że korzystanie z nich jest całkiem bezpieczne. Powinny po prostu zapewnić lepsze wytyczne w tym zakresie.
get_config), ale wtedy nie powinny jeszcze pojawić się w dokumentacji publicznej .