Что такое _get_hyper и _set_hyper в оптимизаторах TensorFlow?

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

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

Другие вопросы по тегам