Они позволяют устанавливать и получать Python литералы (int
, str
, et c), вызываемые объекты и тензоры. Используется для удобства и согласованности : все, что установлено через _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
enable programmati c обработка атрибутов - например, мы можем создать for-l oop со списком имен атрибутов, которые нужно получить или установить, используя только _get_hyper
и _set_hyper
, тогда как в противном случае нам нужно было бы кодировать условные выражения и проверки типов. Кроме того, _get_hyper(name)
требует, чтобы name
был предварительно установлен через set_hyper
.
_get_hyper
включает приведение типов через dtype=
. Пример: beta_1_t
по умолчанию Адам приводится к тому же типу numeri c, что и var
(например, вес слоя), что требуется для некоторых операций. Снова удобство, так как мы можем привести тип вручную (math_ops.cast
).
_set_hyper
позволяет использовать _serialize_hyperparameter
, который возвращает Python values (int
, float
, et c) вызываемых, тензоров или уже- Python значений. Название проистекает из необходимости преобразовывать тензоры и вызываемые объекты в Pythonics, например, для травления или json -сериализации - но может использоваться как удобство для просмотра значений тензора при выполнении Graph.
Наконец; все, что создано через _set_hyper
, присваивается словарю optimizer._hyper
, который затем повторяется в _create_hypers
. else
в l oop преобразует все Python числовые значения в тензоры - поэтому _set_hyper
не будет создавать атрибуты int
, float
, et c. Стоит отметить aggregation=
kwarg, документация которого гласит: «Указывает, как будет агрегироваться распределенная переменная». Эта часть немного больше, чем «для удобства» (много кода для репликации).
_set_hyper
имеет ограничение : не позволяет создавать экземпляры dtype
. Если подход add_weight
в _create_hypers
желателен с dtype, его следует вызывать напрямую.
Когда использовать vs. not use : используйте, если атрибут используется оптимизатором через TensorFlow ops, то есть если он должен быть tf.Variable
. Например, epsilon
устанавливается регулярно, поскольку он никогда не нужен в качестве тензорной переменной.