我看到它在__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(使用前将#替换为@)