Suponha que eu queira escrever uma classe de otimizador personalizada que esteja em conformidade com a tf.kerasAPI (usando a versão TensorFlow> = 2.0). Estou confuso sobre a maneira documentada de fazer isso versus o que é feito nas implementações.
A documentação para 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)
No entanto, a atual tf.keras.optimizers.Optimizerimplementação não definir um resource_apply_densemétodo, mas não definir uma procura privada- _resource_apply_densestub método . Da mesma forma, não há resource_apply_sparseou create_slotsmétodos, mas há um _resource_apply_sparsestub de método e uma _create_slotschamada de método .
Em oficiais tf.keras.optimizers.Optimizersubclasses (utilizando tf.keras.optimizers.Adamcomo exemplo), existem _resource_apply_dense, _resource_apply_sparsee _create_slotsmétodos, e não existem tais métodos sem o sublinhado.
Existem métodos similares-sublinhado em ligeiramente-menos-oficiais tf.keras.optimizers.Optimizersubclasses (por exemplo, tfa.optimizers.MovingAveragea partir de TensorFlow Complementos: _resource_apply_dense, _resource_apply_sparse, _create_slots).
Outro ponto de confusão para mim é que alguns dos otimizadores do TensorFlow Addons também substituem o apply_gradientsmétodo (por exemplo, tfa.optimizers.MovingAverage), enquanto os tf.keras.optimizersotimizadores não.
Além disso, notei que o apply_gradientsmétodo do tf.keras.optimizers.Optimizermétodo chama_create_slots , mas a tf.keras.optimizers.Optimizerclasse base não possui um _create_slotsmétodo. Portanto, parece que um _create_slotsmétodo deve ser definido em uma subclasse do otimizador se essa subclasse não for substituída apply_gradients.
Questões
Qual é a maneira correta de subclassificar a tf.keras.optimizers.Optimizer? Especificamente,
- A
tf.keras.optimizers.Optimizerdocumentação listada na parte superior significa simplesmente substituir as versões com sublinhado dos métodos mencionados (por exemplo, em_resource_apply_densevez deresource_apply_dense)? Em caso afirmativo, existem garantias de API sobre esses métodos de aparência privada que não alterem seu comportamento em versões futuras do TensorFlow? Quais são as assinaturas desses métodos? - Quando alguém substituiria
apply_gradientsalém dos_apply_resource_[dense|sparse]métodos?
Editar. Problema aberto no GitHub: # 36449
_resource_apply_denseou _resource_apply_sparsee ver seu uso nos otimizadores implementados. Embora possa não ser, penso eu, API pública com garantias de estabilidade, eu diria que é bastante seguro usá-las. Eles apenas devem fornecer uma melhor orientação nesse aspecto.
get_config), mas ainda não devem aparecer na documentação pública .