假设我想编写一个符合tf.keras
API的自定义优化器类(请注意,我当前正在使用TensorFlow 2.0.0)。我对记录下来的实现方式与实现中的实现方式感到困惑。
tf.keras.optimizers.Optimizer
states的文档,
### 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)
但是,当前的tf.keras.optimizers.Optimizer
实现并没有定义resource_apply_dense
方法,但是它确实定义了一个看起来很私密的_resource_apply_dense
方法存根。同样,没有resource_apply_sparse
或create_slots
方法,但是有一个_resource_apply_sparse
方法存根和一个_create_slots
方法调用。
在正式的tf.keras.optimizers.Optimizer
子类中(以tf.keras.optimizers.Adam
为例),有_resource_apply_dense
,_resource_apply_sparse
和_create_slots
方法,没有这样的方法没有下划线的方法。
非正式程度较低的tf.keras.optimizers.Optimizer
子类(例如,来自TensorFlow Addons的tfa.optimizers.MovingAverage
)中也有类似的前导下划线方法。
对我来说,另一个困惑点是TensorFlow Addons优化器也覆盖了apply_gradients
方法,而tf.keras.optimizers
优化器却没有。
此外,我注意到apply_gradients
方法calls _create_slots
的tf.keras.optimizers.Optimizer
方法,但是基tf.keras.optimizers.Optimizer
类没有_create_slots
方法。
因此,似乎_create_slots
方法 必须在优化器子类中定义,如果该子类未覆盖apply_gradients
。
问题
继承tf.keras.optimizers.Optimizer
的正确方法是什么?具体来说,
- 顶部列出的
tf.keras.optimizers.Optimizer
文档只是意味着要覆盖他们提到的方法的前导下划线版本(例如,_resource_apply_dense
而不是resource_apply_dense
)吗?如果是这样,是否有关于这些私有方法的API保证不会在TensorFlow的未来版本中更改其行为? - 除了
apply_gradients
方法之外,何时还能覆盖_apply_resource_[dense|sparse]
?