2017-07-09 45 views
1

读取张量流的源代码我发现Sigmoid梯度计算定义如下。为什么tensorflow在计算Sigmod的梯度时再次计算Sigmoid的输出?

Status SigmoidGrad(const AttrSlice& attrs, FunctionDef* g) { 
// clang-format off 
return GradForUnaryCwise(g, { 
    {{"y"}, "Sigmoid", {"x"}}, 
    FDH::Const("const", 1.0f), 
    {{"one"}, "Cast", {"const"}, {{"SrcT", DT_FLOAT}, {"DstT", "$T"}}}, 
    {{"a"}, "Sub", {"one", "y"}, {}, {"dy"}}, 
    {{"b"}, "Mul", {"y", "a"}},    // y * (1 - y) 
    {{"dx"}, "Mul", {"dy", "b"}},   // dy * y * (1 - y) 
}); 
// clang-format on 
} 

我的问题是,为什么tensorflow重新计算Sigmoid的输出来计算它的渐变。它不是存储在op的上下文中?

的代码块来自github

回答

0

为什么tensorflow重新计算乙状结肠的输出的梯度?

它没有 - 这就是像tensorflow这样的框架之美。 Tensorflow will reuse nodes that can be reused.因此,渐变中的S形节点将自动重用S形计算。

请注意,节点重用比每个操作优化功能强大得多,因为优化可以发生在图中任何位置,在不同操作之间进行。乙状结肠

+0

您是否意味着我们只是在构建图形阶段定义一个新节点,以及何时调用sess.run(),tensorflow会优化它? – Keith

+0

是的,确切地说。它是在评估之前动态完成的。 – user1735003

+0

谢谢。我还有一个问题,为什么我们要定义一个节点'{“y”},“Sigmoid”,{“x”}而不是直接使用context-> output来获取FDH中的sigmoid输出? – Keith

0

衍生物为乙状结肠的角度来计算:

enter image description here

因此TF可以重用一些以前的笔记来计算结果。