Supponiamo di voler scrivere una classe di ottimizzazione personalizzata conforme tf.kerasall'API (utilizzando la versione TensorFlow> = 2.0). Sono confuso sul modo documentato di farlo rispetto a ciò che viene fatto nelle implementazioni.
La documentazione per gli tf.keras.optimizers.Optimizer stati ,
### 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)
Tuttavia, l'attuale tf.keras.optimizers.Optimizerimplementazione non definisce un resource_apply_densemetodo, ma non definiscono un privato dall'aspetto _resource_apply_densestub . Allo stesso modo, non ci sono resource_apply_sparseo create_slotsmetodi, ma ci sono uno _resource_apply_sparsestub di metodo e una _create_slotschiamata di metodo .
In ufficiali tf.keras.optimizers.Optimizersottoclassi (utilizzando tf.keras.optimizers.Adamcome esempio), ci sono _resource_apply_dense, _resource_apply_sparsee _create_slotsmetodi, e non ci sono tali metodi senza la sottolineatura che porta.
Ci sono simili metodi leader di sottolineatura in leggermente meno ufficiali tf.keras.optimizers.Optimizersottoclassi (ad esempio, tfa.optimizers.MovingAverageda tensorflow Addons: _resource_apply_dense, _resource_apply_sparse, _create_slots).
Un altro punto di confusione per me è che alcuni degli ottimizzatori TensorFlow Addons hanno la precedenza sul apply_gradientsmetodo (ad es. tfa.optimizers.MovingAverage), Mentre gli tf.keras.optimizersottimizzatori no.
Inoltre, ho notato che il apply_gradientsmetodo di tf.keras.optimizers.Optimizermetodo chiama_create_slots , ma la tf.keras.optimizers.Optimizerclasse base non ha un _create_slotsmetodo. Quindi, sembra che un _create_slotsmetodo debba essere definito in una sottoclasse di ottimizzatore se quella sottoclasse non ha la precedenza apply_gradients.
Domande
Qual è il modo corretto di sottoclasse un tf.keras.optimizers.Optimizer? In particolare,
- La
tf.keras.optimizers.Optimizerdocumentazione elencata in alto significa semplicemente sovrascrivere le versioni di sottolineatura dei metodi che menzionano (ad esempio,_resource_apply_denseinvece diresource_apply_dense)? In tal caso, esistono garanzie API su questi metodi dall'aspetto privato che non cambiano il loro comportamento nelle versioni future di TensorFlow? Quali sono le firme di questi metodi? - Quando si scavalcherebbe
apply_gradientsoltre ai_apply_resource_[dense|sparse]metodi?
Modificare. Problema aperto su GitHub: # 36449
_resource_apply_denseo _resource_apply_sparsee vederne l'utilizzo negli ottimizzatori implementati. Sebbene possa non essere, penso, un'API pubblica con garanzie di stabilità, direi che è abbastanza sicuro usarli. Dovrebbero solo fornire una migliore guida in questo aspetto.
get_config), ma non dovrebbero ancora apparire nella documentazione pubblica .