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
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
)。
私にとってもう1つの混乱点は、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
です。
ご質問
aをサブクラス化する正しい方法は何tf.keras.optimizers.Optimizer
ですか?具体的には
tf.keras.optimizers.Optimizer
上部にリストされているドキュメントは、それらが言及するメソッドの先頭のアンダースコアバージョンをオーバーライドすることを単に意味しますか(たとえば、_resource_apply_dense
ではなくresource_apply_dense
)?もしそうなら、これらのプライベートに見えるメソッドがTensorFlowの将来のバージョンでそれらの振る舞いを変更しないことについてのAPI保証はありますか?これらのメソッドのシグネチャは何ですか?- メソッド
apply_gradients
に加えていつオーバーライド_apply_resource_[dense|sparse]
するのですか?
_resource_apply_dense
またはの宣言を_resource_apply_sparse
確認し、実装されたオプティマイザでの使用法を確認できます。安定性が保証されたパブリックAPIではないかもしれませんが、それらを使用することはかなり安全だと思います。彼らはこの面でより良いガイダンスを提供するべきです。
get_config
)追加される予定である場合もありますが、それらはまだパブリックドキュメントに表示されません。