TensorFlow 优化器中的 _get_hyper 和 _set_hyper 是什么?

2024-03-25

我看到它在__init__例如Adam https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/adam.py#L145优化器:self._set_hyper('beta_1', beta_1)。还有_get_hyper and _serialize_hyperparameter贯穿整个代码。我没有看到这些Keras https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L487优化器 - 它们是可选的吗?创建自定义优化器时何时应该或不应该使用它们?


它们允许设置和获取 Python 文字(int, str, etc), 可调用对象和张量。用途是为了方便 and 一致性:通过任何设置_set_hyper可以通过检索_get_hyper,避免重复样板代码。我已经实施了凯拉斯·亚当W https://github.com/OverLordGoldDragon/keras-adamw在所有主要的 TF 和 Keras 版本中,并将使用它作为参考。

  • t_cur https://github.com/OverLordGoldDragon/keras-adamw/blob/v1.30/keras_adamw/optimizers_v2.py#L110 is a tf.Variable。每次我们“设置”它时,我们都必须调用K.set_value;如果我们这样做self.t_cur=5,这会破坏tf.Variable并破坏优化器的功能。如果我们使用model.optimizer._set_hyper('t_cur', 5),它会适当地设置它 - 但这需要它已经通过定义set_hyper 之前 https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/optimizer_v2.py#L619.
  • Both _get_hyper & _set_hyper enable 程序化的属性的处理 - 例如,我们可以使用属性名称列表创建一个 for 循环,以便仅使用_get_hyper and _set_hyper,否则我们需要编写条件和类型检查代码。还,_get_hyper(name)要求name之前通过设置set_hyper.

  • _get_hyper通过以下方式启用类型转换dtype=. Ex: beta_1_t默认情况下,Adam 被转换为与以下相同的数字类型var(例如层权重),这是某些操作所必需的。再次方便,因为我们可以手动输入(math_ops.cast).

  • _set_hyper允许使用_serialize_hyperparameter https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/optimizer_v2.py#L861,它检索 Python 值 (int, float等)的可调用对象、张量或已有的 Python 值。名称源于将张量和可调用对象转换为 Pythonics 的需要,例如pickling 或 json-serializing - 但可以方便地在图形执行中查看张量值。

  • 最后;一切都通过实例化_set_hyper被分配给optimizer._hyper字典,然后迭代_create_hypers https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/optimizer_v2.py#L767. The else在循环将所有 Python 数字转换为张量 - so _set_hyper不会创建int, float等属性。值得注意的是aggregation= https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/optimizer_v2.py#L781kwarg,其文档如下:“指示如何聚合分布式变量”。这部分不仅仅是“为了方便”(需要复制大量代码)。

    • _set_hyper has a 局限性: 不允许实例化dtype. If add_weight https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/optimizer_v2.py#L960接近于_create_hypers如果需要 dtype,则应直接调用。

何时使用与不使用:如果优化器通过 TensorFlow 操作使用该属性,则使用 - 即如果它需要是tf.Variable。例如,epsilon https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/adam.py#L149定期设置,因为它永远不需要作为张量变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow 优化器中的 _get_hyper 和 _set_hyper 是什么? 的相关文章

随机推荐