Angenommen, ich möchte eine benutzerdefinierte Optimierungsklasse schreiben, die der tf.kerasAPI 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.Optimizerist die Umsetzung eine nicht definieren resource_apply_denseMethode, aber es hat definiert einen privaten aussehende _resource_apply_denseMethode Stummel . Ebenso gibt es keine resource_apply_sparseoder create_slotsMethoden, aber es gibt einen _resource_apply_sparseMethodenstub und einen _create_slotsMethodenaufruf .
In offiziellen tf.keras.optimizers.OptimizerUnterklassen (unter Verwendung tf.keras.optimizers.Adamals ein Beispiel), gibt es _resource_apply_dense, _resource_apply_sparseund _create_slotsMethoden, und es gibt keine solche Methoden ohne den führenden Unterstrich.
Es gibt ähnliche leading-Unterstreichungsverfahren in etwas weniger amtlichen tf.keras.optimizers.OptimizerSubklassen (zB tfa.optimizers.MovingAveragevon 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.optimizersOptimierer dies nicht tun.
Außerdem bemerkte ich , dass die apply_gradientsMethode der tf.keras.optimizers.OptimizerMethode Anrufe_create_slots , aber die tf.keras.optimizers.OptimizerBasisklasse keine hat _create_slotsMethode. Es scheint also, dass eine _create_slotsMethode 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.Optimizeraufgeführte Dokumentation lediglich, die führenden Unterstrichversionen der von ihnen erwähnten Methoden zu überschreiben (z. B._resource_apply_denseanstelle 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_gradientszusätzlich zu den_apply_resource_[dense|sparse]Methoden überschreiben ?
Bearbeiten. Geöffnetes Problem auf GitHub: # 36449
_resource_apply_denseoder _resource_apply_sparseeinsehen 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 .