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