Suponha que eu queira escrever uma classe de otimizador personalizada que esteja em conformidade com a tf.keras
API (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.Optimizer
implementação não definir um resource_apply_dense
método, mas não definir uma procura privada- _resource_apply_dense
stub método . Da mesma forma, não há resource_apply_sparse
ou create_slots
métodos, mas há um _resource_apply_sparse
stub de método e uma _create_slots
chamada de método .
Em oficiais tf.keras.optimizers.Optimizer
subclasses (utilizando tf.keras.optimizers.Adam
como exemplo), existem _resource_apply_dense
, _resource_apply_sparse
e _create_slots
métodos, e não existem tais métodos sem o sublinhado.
Existem métodos similares-sublinhado em ligeiramente-menos-oficiais tf.keras.optimizers.Optimizer
subclasses (por exemplo, tfa.optimizers.MovingAverage
a 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_gradients
método (por exemplo, tfa.optimizers.MovingAverage
), enquanto os tf.keras.optimizers
otimizadores não.
Além disso, notei que o apply_gradients
método do tf.keras.optimizers.Optimizer
método chama_create_slots
, mas a tf.keras.optimizers.Optimizer
classe base não possui um _create_slots
método. Portanto, parece que um _create_slots
mé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.Optimizer
documentação listada na parte superior significa simplesmente substituir as versões com sublinhado dos métodos mencionados (por exemplo, em_resource_apply_dense
vez 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_gradients
além dos_apply_resource_[dense|sparse]
métodos?
Editar. Problema aberto no GitHub: # 36449
_resource_apply_dense
ou _resource_apply_sparse
e 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 .