Supponiamo di voler scrivere una classe di ottimizzazione personalizzata conforme tf.keras
all'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.Optimizer
implementazione non definisce un resource_apply_dense
metodo, ma non definiscono un privato dall'aspetto _resource_apply_dense
stub . Allo stesso modo, non ci sono resource_apply_sparse
o create_slots
metodi, ma ci sono uno _resource_apply_sparse
stub di metodo e una _create_slots
chiamata di metodo .
In ufficiali tf.keras.optimizers.Optimizer
sottoclassi (utilizzando tf.keras.optimizers.Adam
come esempio), ci sono _resource_apply_dense
, _resource_apply_sparse
e _create_slots
metodi, 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.Optimizer
sottoclassi (ad esempio, tfa.optimizers.MovingAverage
da 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_gradients
metodo (ad es. tfa.optimizers.MovingAverage
), Mentre gli tf.keras.optimizers
ottimizzatori no.
Inoltre, ho notato che il apply_gradients
metodo di tf.keras.optimizers.Optimizer
metodo chiama_create_slots
, ma la tf.keras.optimizers.Optimizer
classe base non ha un _create_slots
metodo. Quindi, sembra che un _create_slots
metodo 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.Optimizer
documentazione elencata in alto significa semplicemente sovrascrivere le versioni di sottolineatura dei metodi che menzionano (ad esempio,_resource_apply_dense
invece 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_gradients
oltre ai_apply_resource_[dense|sparse]
metodi?
Modificare. Problema aperto su GitHub: # 36449
_resource_apply_dense
o _resource_apply_sparse
e 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 .