发布于 2020-05-27 11:46:02
它们支持设置和获取Python文字(int、str等)、可调用项和张量。使用是为了方便和一致:通过_set_hyper设置的任何东西都可以通过_get_hyper检索,避免重复样板代码。我已经在所有主要的TF & Keras版本中实现了Keras AdamW,并将使用它作为参考。
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都允许对属性进行编程处理--例如,我们可以使用_get_hyper和_set_hyper创建一个包含要获取或设置的属性名称列表的for-循环,而否则我们需要编写条件符和类型代码。另外,_get_hyper(name)要求以前通过set_hyper设置name。_get_hyper支持通过dtype=进行类型转换。例:默认情况下,beta_1_t被转换为与var相同的数值类型(例如层重),这是某些操作所必需的。同样是一种方便,因为我们可以手动键入类型(math_ops.cast)。_set_hyper允许使用_serialize_hyperparameter,它检索可调用、张量或已经- Python值的Python值(int、float等)。名称源于需要将张量和调用转换为Pythonics,以便进行酸洗或json序列化,但可以用作查看图形执行中的张量值的方便。_set_hyper实例化的所有内容都分配给optimizer._hyper字典,然后在_create_hypers中迭代。循环中的else将所有Python数字转换为张量,因此_set_hyper不会创建int、float等属性。值得注意的是aggregation= kwarg,其文档中写道:“指示如何聚合分布式变量”。这部分比“为了方便”(需要复制的代码很多)要多一点。- `_set_hyper` has a _limitation_: does not allow instantiating `dtype`. If [`add_weight`](https://github.com/tensorflow/tensorflow/blob/r2.2/tensorflow/python/keras/optimizer_v2/optimizer_v2.py#L960) approach in `_create_hypers` is desired with dtype, then it should be called directly.
何时使用与不使用:如果属性通过TensorFlow操作被优化器使用,即如果它需要是一个tf.Variable。例如,epsilon是定期设置的,因为它从来不需要作为张量变量。
https://stackoverflow.com/questions/62042342
复制相似问题