Припустимо, я хочу написати спеціальний клас оптимізатора, який відповідає стандарту 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 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
_resource_apply_denseабо _resource_apply_sparseта побачити їх використання в реалізованих оптимізаторах. Хоча це може бути, я думаю, публічний API з гарантіями стабільності, я б сказав, що їх досить безпечно використовувати. Вони просто повинні дати кращі вказівки в цьому аспекті.
get_config), але вони ще не повинні з'являтися в публічній документації .