Что такое _get_hyper и _set_hyper в оптимизаторах TensorFlow? - PullRequest
2 голосов
/ 27 мая 2020

Я вижу это в __init__ например, Adam optimizer: self._set_hyper('beta_1', beta_1). Также в коде встречаются _get_hyper и _serialize_hyperparameter. Я не вижу их в оптимизаторах Keras - они необязательны? Когда их следует или не следует использовать при создании собственных оптимизаторов?

1 Ответ

2 голосов
/ 27 мая 2020

Они позволяют устанавливать и получать 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 устанавливается регулярно, поскольку он никогда не нужен в качестве тензорной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...