如何解决`tensorflow.keras.optimizers.Optimizer` 中的方法 `_resource_apply_gradient` 应该返回什么类型?
creating custom optimizers 上的文档指出,需要实现以下方法:
-
_resource_apply_dense
(更新变量给定梯度张量是一个密集的 tf.Tensor) -
_resource_apply_sparse
(给定梯度张量的更新变量是一个稀疏的tf.IndexedSlices
。发生这种情况的最常见方式是通过 tf.gather 获取梯度。) -
_create_slots
(如果您的优化器算法需要额外的变量) -
get_config
(优化器的序列化,包括所有超参数)
现在,如果我们看一下 SGD Optimizer,那么 _resource_apply_dense
返回 gen_training_ops.ResourceApplyGradientDescent
的返回值,它似乎是 tf.raw_ops.ResourceApplyGradientDescent
的别名,它返回“Created操作”。
现在我不确定那是什么意思,我尝试了:
>>> x = tf.Variable(initial_value=3,trainable=True,name="x",dtype=tf.float32)
>>> y = tf.raw_ops.ResourceApplyGradientDescent(var=x.handle,alpha=tf.constant(1.0),delta=tf.constant(2.2))
>>> print(y)
None
现在我不确定应该返回什么。我怀疑这可能与 tensorflow 2.0 默认情况下会立即执行有关,但我仍然不太确定在这种情况下这对我意味着什么。我是说会
return var.assign_sub(alpha*delta)
相当于
return tf.raw_ops.ResourceApplyGradientDecent(var=var.handle,alpha=alpha,delta=delta)
还是有区别?有没有办法找出执行不急切时会发生什么?
通过 gen_training_ops.ResourcApplyGradientDecent
的定义遵循 vscodes Pylance 我最终在一些机器生成的文件 resource_apply_gradient_descent
中得到了 gen_training_ops.py
的定义,这对我来说是不可读的胡言乱语。如果我点击 GitHub 中的函数,它会将我定向到一个 go 文件,该文件由于太大而未展开,因此这似乎是一个死胡同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。