Angenommen, ich möchte eine benutzerdefinierte Optimierungsklasse schreiben, die der tf.keras
API entspricht (mit TensorFlow-Version> = 2.0). Ich bin verwirrt über die dokumentierte Vorgehensweise im Vergleich zu den Implementierungen.
Die Dokumentation für tf.keras.optimizers.Optimizer
Staaten ,
### 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)
Doch die aktuelle tf.keras.optimizers.Optimizer
ist die Umsetzung eine nicht definieren resource_apply_dense
Methode, aber es hat definiert einen privaten aussehende _resource_apply_dense
Methode Stummel . Ebenso gibt es keine resource_apply_sparse
oder create_slots
Methoden, aber es gibt einen _resource_apply_sparse
Methodenstub und einen _create_slots
Methodenaufruf .
In offiziellen tf.keras.optimizers.Optimizer
Unterklassen (unter Verwendung tf.keras.optimizers.Adam
als ein Beispiel), gibt es _resource_apply_dense
, _resource_apply_sparse
und _create_slots
Methoden, und es gibt keine solche Methoden ohne den führenden Unterstrich.
Es gibt ähnliche leading-Unterstreichungsverfahren in etwas weniger amtlichen tf.keras.optimizers.Optimizer
Subklassen (zB tfa.optimizers.MovingAverage
von TensorFlow Addons: _resource_apply_dense
, _resource_apply_sparse
, _create_slots
).
Ein weiterer verwirrender Punkt für mich ist, dass einige der TensorFlow Addons-Optimierer die Methode ebenfalls überschreiben apply_gradients
(z. B. tfa.optimizers.MovingAverage
), während die tf.keras.optimizers
Optimierer dies nicht tun.
Außerdem bemerkte ich , dass die apply_gradients
Methode der tf.keras.optimizers.Optimizer
Methode Anrufe_create_slots
, aber die tf.keras.optimizers.Optimizer
Basisklasse keine hat _create_slots
Methode. Es scheint also, dass eine _create_slots
Methode in einer Optimierer-Unterklasse definiert werden muss , wenn diese Unterklasse nicht überschreibt apply_gradients
.
Fragen
Was ist der richtige Weg, um eine Unterklasse a tf.keras.optimizers.Optimizer
? Speziell,
- Bedeutet die oben
tf.keras.optimizers.Optimizer
aufgeführte Dokumentation lediglich, die führenden Unterstrichversionen der von ihnen erwähnten Methoden zu überschreiben (z. B._resource_apply_dense
anstelle vonresource_apply_dense
)? Wenn ja, gibt es API-Garantien dafür, dass diese privat aussehenden Methoden ihr Verhalten in zukünftigen Versionen von TensorFlow nicht ändern? Was sind die Signaturen dieser Methoden? - Wann würde man
apply_gradients
zusätzlich zu den_apply_resource_[dense|sparse]
Methoden überschreiben ?
Bearbeiten. Geöffnetes Problem auf GitHub: # 36449
_resource_apply_dense
oder _resource_apply_sparse
einsehen und deren Verwendung in implementierten Optimierern sehen. Ich denke, es ist zwar keine öffentliche API mit Stabilitätsgarantien, aber ich würde sagen, es ist ziemlich sicher, sie zu verwenden. Sie sollten in dieser Hinsicht nur eine bessere Anleitung geben.
get_config
), aber dann sollten sie noch nicht in der öffentlichen Dokumentation erscheinen .