假设我想编写一个符合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
或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
的子类(例如,tfa.optimizers.MovingAverage
从TensorFlow扩展中心:_resource_apply_dense
,_resource_apply_sparse
,_create_slots
)。
对我而言,另一个令人困惑的点是,某些TensorFlow插件优化程序也覆盖了该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
问题
子类化的正确方法是tf.keras.optimizers.Optimizer
什么?特别,
tf.keras.optimizers.Optimizer
顶部列出的文档是否只是意味着要覆盖他们提到的方法的前导下划线版本(例如,_resource_apply_dense
代替resource_apply_dense
)?如果是这样,是否有关于这些私有方法的API保证不会在TensorFlow的未来版本中更改其行为?这些方法的签名是什么?apply_gradients
除了这些_apply_resource_[dense|sparse]
方法之外,何时还能覆盖?
_resource_apply_dense
或的声明_resource_apply_sparse
,并查看其在已实现的优化器中的用法。我认为,虽然可能不是,但带有稳定性保证的公共API,我想说使用它们很安全。他们只是应该在这方面提供更好的指导。
get_config
),但那时它们还不应出现在公共文档中。