假设我想编写一个符合tf.keras
API 的自定义优化器类(使用 TensorFlow 版本>=2.0)。我对记录在案的方法与在实现中所做的事情感到困惑。
tf.keras.optimizers.Optimizer
状态的文档,
### 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
方法 stub。同样,没有resource_apply_sparse
orcreate_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
(例如,tfa.optimizers.MovingAverage
来自 TensorFlow Addons:_resource_apply_dense
、、、_resource_apply_sparse
)_create_slots
。
另一个让我困惑的点是,一些 TensorFlow Addons 优化器也覆盖了该apply_gradients
方法(例如,tfa.optimizers.MovingAverage
),而tf.keras.optimizers
优化器没有。
此外,我注意到方法调用apply_gradients
的方法,但基类没有方法。因此,如果子类不覆盖,则似乎必须在优化器子类中定义方法。tf.keras.optimizers.Optimizer
_create_slots
tf.keras.optimizers.Optimizer
_create_slots
_create_slots
apply_gradients
问题
子类 a 的正确方法是tf.keras.optimizers.Optimizer
什么?具体来说,
tf.keras.optimizers.Optimizer
顶部列出的文档是否只是意味着覆盖他们提到的方法的前导下划线版本(例如,_resource_apply_dense
而不是resource_apply_dense
)?如果是这样,是否有任何 API 保证这些看起来私有的方法在未来版本的 TensorFlow 中不会改变它们的行为?这些方法的签名是什么?apply_gradients
除了方法之外,什么时候会覆盖_apply_resource_[dense|sparse]
?
编辑。在 GitHub 上打开的问题:#36449