Supongamos que quiero escribir una clase optimizadora personalizada que se ajuste a la tf.kerasAPI (usando la versión TensorFlow> = 2.0). Estoy confundido acerca de la forma documentada de hacer esto frente a lo que se hace en las implementaciones.
La documentación para los tf.keras.optimizers.Optimizer estados ,
### 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)
Sin embargo, la tf.keras.optimizers.Optimizerimplementación actual no define un resource_apply_densemétodo, pero sí define un _resource_apply_densecódigo auxiliar de aspecto privado . Del mismo modo, no hay resource_apply_sparseo create_slotsmétodos, pero hay un _resource_apply_sparsecódigo auxiliar de método y una _create_slotsllamada a método .
En oficiales tf.keras.optimizers.Optimizersubclases (utilizando tf.keras.optimizers.Adamcomo ejemplo), hay _resource_apply_dense, _resource_apply_sparsey _create_slotsmétodos, y no hay tales métodos sin el carácter de subrayado líder.
Existen métodos similares líder-subrayado en ligeramente menos oficiales tf.keras.optimizers.Optimizersubclases (por ejemplo, tfa.optimizers.MovingAveragedesde TensorFlow Addons: _resource_apply_dense, _resource_apply_sparse, _create_slots).
Otro punto de confusión para mí es que algunos de los optimizadores de complementos de TensorFlow también anulan el apply_gradientsmétodo (por ejemplo, tfa.optimizers.MovingAverage), mientras que los tf.keras.optimizersoptimizadores no.
Además, noté que el apply_gradientsmétodo de tf.keras.optimizers.Optimizermétodo llama_create_slots , pero la tf.keras.optimizers.Optimizerclase base no tiene un _create_slotsmétodo. Entonces, parece que un _create_slotsmétodo debe definirse en una subclase de optimizador si esa subclase no anula apply_gradients.
Preguntas
¿Cuál es la forma correcta de subclase a tf.keras.optimizers.Optimizer? Específicamente,
- ¿La
tf.keras.optimizers.Optimizerdocumentación enumerada en la parte superior simplemente significa anular las versiones de guión bajo de los métodos que mencionan (por ejemplo, en_resource_apply_denselugar deresource_apply_dense)? Si es así, ¿hay alguna garantía API sobre estos métodos de aspecto privado que no cambian su comportamiento en futuras versiones de TensorFlow? ¿Cuáles son las firmas de estos métodos? - ¿Cuándo se anularía
apply_gradientsademás de los_apply_resource_[dense|sparse]métodos?
_resource_apply_denseo _resource_apply_sparse, y ver su uso en optimizadores implementados. Si bien puede no ser, creo, una API pública con garantías de estabilidad, diría que es bastante seguro usarlas. Simplemente deberían proporcionar una mejor orientación en este aspecto.
get_config), pero que aún no deberían aparecer en la documentación pública .