首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tf.contrib.eager.custom_gradient的实现中,tensorflow.python.eager.tape做了什么?

在tf.contrib.eager.custom_gradient的实现中,tensorflow.python.eager.tape做了什么?
EN

Stack Overflow用户
提问于 2018-03-22 05:37:02
回答 1查看 392关注 0票数 1

我正在经历here中的TensorFlow Eager,我发现很难理解定制渐变的部分。

代码语言:javascript
复制
@tfe.custom_gradient
def logexp(x):
    e = tf.exp(x)
    def grad(dy):
        return dy * (1 - 1/(1 + e))
    return tf.log(1 + e), grad

首先,很难理解dy在梯度函数中做了什么。

当我读到tf.contrib.eager.custom_gradient的实现时。我真的不能理解磁带背后的工作机制。下面是我从tf.contrib.eager.custom_gradient实现中借用的代码。有人能解释一下磁带在这里是做什么的吗?

代码语言:javascript
复制
from tensorflow.python.eager import tape
from tensorflow.python.ops import array_ops
from tensorflow.python.ops import gen_array_ops
from tensorflow.python.util import nest
from tensorflow.python.framework import ops as tf_ops

def my_custom_gradient(f):
    def decorated(*args, **kwargs):
        for x in args:
            print('args {0}'.format(x))
        input_tensors = [tf_ops.convert_to_tensor(x) for x in args]

        with tape.stop_recording():
            result, grad_fn = f(*args, **kwargs)
            flat_result = nest.flatten(result)
            flat_result = [gen_array_ops.identity(x) for x in flat_result]

        def actual_grad_fn(*outputs):
            print(*outputs)
            return nest.flatten(grad_fn(*outputs))

       tape.record_operation(
            f.__name__, # the name of f, in this case logexp
            flat_result,
            input_tensors,
            actual_grad_fn) # backward_function
       flat_result = list(flat_result)
       return nest.pack_sequence_as(result, flat_result)
return decorated 

即使我在here上找到了磁带的实现。但是,由于文档很差,我不能从中获得太多信息。

EN

回答 1

Stack Overflow用户

发布于 2018-03-28 07:54:17

我将分别回答每个子问题:

Re:在反向传播期间,梯度函数的 dy:主要用例是什么。在反向传播期间,每个op的梯度必须取其输出的梯度并产生其输入的梯度。这实际上是微积分链式法则的结果。对于简单的操作,最终的梯度只是dy与操作的梯度的乘积(同样来自链式规则)。在本例中,您可以看到dy * (1 - 1/(1 + e))

Re: custom_gradient 很复杂:是的。渐变磁带的公共API是tfe.GradientTape,它应该更容易理解和使用。你可以在它的规范和tests中找到简单的例子。可以在here中找到一个更复杂的“真实世界”示例。如果其基本工作原理不清楚,请提出具体问题。此外,我们将很快发布一份更详细的指南,用于在急切执行时使用渐变。

用于实现custom_gradientGradientTapetape是一个包装了一些C++代码的低级概念。最终用户不应该关心它(它不会在tfe命名空间中公开)。它用于构建已执行操作的“磁带”。磁带类似于常规TF图,但比常规TF图更简单。它允许计算它记录的两个张量之间的梯度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49416931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档