读取张量流的源代码我发现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
您是否意味着我们只是在构建图形阶段定义一个新节点,以及何时调用sess.run(),tensorflow会优化它? – Keith
是的,确切地说。它是在评估之前动态完成的。 – user1735003
谢谢。我还有一个问题,为什么我们要定义一个节点'{“y”},“Sigmoid”,{“x”}而不是直接使用context-> output来获取FDH中的sigmoid输出? – Keith