Załóżmy, że chcę napisać niestandardową klasę optymalizatora zgodną z tf.keras
interfejsem 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.Optimizer
implementacja nie definiuje resource_apply_dense
metody, ale nie definiują prywatną wyglądające _resource_apply_dense
metody niedopałek . Podobnie nie ma metod resource_apply_sparse
ani create_slots
metod, ale istnieją kody pośredniczące _resource_apply_sparse
metod i _create_slots
wywołanie metod .
Oficjalnych tf.keras.optimizers.Optimizer
podklasy (stosując tf.keras.optimizers.Adam
jako przykład), są _resource_apply_dense
, _resource_apply_sparse
, i _create_slots
sposobó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.Optimizer
podklasy (np tfa.optimizers.MovingAverage
z 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_gradients
metodę (np. tfa.optimizers.MovingAverage
), Podczas gdy tf.keras.optimizers
optymalizatory nie.
Ponadto zauważyłem, że apply_gradients
metody tf.keras.optimizers.Optimizer
metody połączeń_create_slots
, ale podstawa tf.keras.optimizers.Optimizer
klasa nie ma _create_slots
metody. Wygląda więc na to, że należy zdefiniować _create_slots
metodę 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.Optimizer
dokumentacja wymieniona u góry oznacza po prostu zastąpienie wiodących wersji podkreślonych metod, o których wspominają (np._resource_apply_dense
Zamiastresource_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_gradients
oprócz_apply_resource_[dense|sparse]
metod?
Edytować. Otwarty problem w GitHub: # 36449
_resource_apply_dense
lub _resource_apply_sparse
i 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 .