Supposons que je veuille écrire une classe d'optimiseur personnalisée conforme à l' tf.keras
API (en utilisant la version TensorFlow> = 2.0). Je suis confus quant à la façon documentée de le faire par rapport à ce qui est fait dans les implémentations.
La documentation pour les tf.keras.optimizers.Optimizer
états ,
### 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)
Cependant, le courant tf.keras.optimizers.Optimizer
mise en œuvre ne définit pas une resource_apply_dense
méthode, mais elle ne définit un privé à la recherche _resource_apply_dense
stub de la méthode . De même, il n'y a pas resource_apply_sparse
ou create_slots
méthodes, mais il y a un _resource_apply_sparse
bout de méthode et un _create_slots
appel de méthode .
Dans officielles tf.keras.optimizers.Optimizer
sous - classes ( en utilisant tf.keras.optimizers.Adam
comme exemple), il existe _resource_apply_dense
, _resource_apply_sparse
et les _create_slots
méthodes, et il n'y a pas de telles méthodes sans le trait de soulignement de premier plan.
Il existe des méthodes d' avant-underscore similaires légèrement moins officielles tf.keras.optimizers.Optimizer
sous - classes (par exemple, tfa.optimizers.MovingAverage
de tensorflow addons: _resource_apply_dense
, _resource_apply_sparse
, _create_slots
).
Un autre point de confusion pour moi est que certains des optimiseurs TensorFlow Addons remplacent également la apply_gradients
méthode (par exemple, tfa.optimizers.MovingAverage
), contrairement aux tf.keras.optimizers
optimiseurs.
De plus, j'ai remarqué que la apply_gradients
méthode des appels de tf.keras.optimizers.Optimizer
méthode , mais la classe de base n'a pas de méthode. Il semble donc qu'une méthode doit être définie dans une sous-classe d'optimiseur si cette sous-classe ne remplace pas ._create_slots
tf.keras.optimizers.Optimizer
_create_slots
_create_slots
apply_gradients
Des questions
Quelle est la bonne façon de sous-classer a tf.keras.optimizers.Optimizer
? Plus précisément,
- La
tf.keras.optimizers.Optimizer
documentation répertoriée en haut signifie-t-elle simplement remplacer les versions de soulignement principal des méthodes qu'elles mentionnent (par exemple,_resource_apply_dense
au lieu deresource_apply_dense
)? Dans l'affirmative, existe-t-il des garanties API quant à ces méthodes d'apparence privée ne modifiant pas leur comportement dans les futures versions de TensorFlow? Quelles sont les signatures de ces méthodes? - Quand remplacerait-on
apply_gradients
en plus des_apply_resource_[dense|sparse]
méthodes?
_resource_apply_dense
ou _resource_apply_sparse
, et voir leur utilisation dans les optimiseurs implémentés. Bien que ce ne soit pas, je pense, une API publique avec des garanties de stabilité, je dirais que c'est assez sûr de les utiliser. Ils devraient juste fournir une meilleure orientation à cet égard.
get_config
), mais ils ne devraient pas encore apparaître dans la documentation publique .