Что такое _get_hyper и _set_hyper в оптимизаторах TensorFlow?
1 ответ
Они позволяют устанавливать и получать литералы Python (int
, str
и т. д.), вызываемые объекты и тензоры. Используется для удобства и согласованности: все, что установлено через_set_hyper
можно получить через _get_hyper
, избегая повторения шаблонного кода. Я реализовал Keras AdamW во всех основных версиях TF и Keras и буду использовать его в качестве справочника.
-
t_cur
этоtf.Variable
. Каждый раз, когда мы "устанавливаем" его, мы должны вызыватьK.set_value
; если мы сделаемself.t_cur=5
, это уничтожитtf.Variable
и функциональность оптимизатора крушения. Если бы вместо этого мы использовалиmodel.optimizer._set_hyper('t_cur', 5)
, он установил бы его соответствующим образом, но для этого необходимо, чтобы он был определен черезset_hyper
ранее. И то и другое
_get_hyper
&_set_hyper
включить программную обработку атрибутов - например, мы можем создать цикл for со списком имен атрибутов для получения или установки, используя только_get_hyper
а также_set_hyper
, тогда как в противном случае нам пришлось бы кодировать условные выражения и проверки типов. Также,_get_hyper(name)
требует, чтобыname
был ранее установлен черезset_hyper
._get_hyper
позволяет приведение типов черезdtype=
. Пример:beta_1_t
по умолчанию Адам приводится к тому же числовому типу, что иvar
(например, вес слоя), который требуется для некоторых операций. Снова удобство, так как мы можем вручную привести тип (math_ops.cast
)._set_hyper
позволяет использовать_serialize_hyperparameter
, который извлекает значения Python (int
,float
и т. д.) вызываемых, тензоров или уже значений Python. Название проистекает из необходимости преобразовывать тензоры и вызываемые объекты в Pythonics, например, для травления или json-сериализации, но его можно использовать как удобство для просмотра значений тензора в исполнении Graph.Наконец; все создано через
_set_hyper
назначается наoptimizer._hyper
словарь, который затем повторяется в_create_hypers
. Вelse
в цикле переводит все числа Python в тензоры - так_set_hyper
не создастint
,float
и т. д. атрибуты. Стоит отметитьaggregation=
kwarg, документация которого гласит: "Указывает, как будет агрегироваться распределенная переменная". Это часть немного больше, чем просто "для удобства" (много кода для копирования)._set_hyper
имеет ограничение: не позволяет создавать экземплярыdtype
. Еслиadd_weight
подход в_create_hypers
желательно с dtype, тогда он должен вызываться напрямую.
Когда использовать или не использовать: используйте, если атрибут используется оптимизатором через операции TensorFlow, т.е. если он должен бытьtf.Variable
. Например, epsilon
устанавливается регулярно, так как никогда не требуется в качестве тензорной переменной.