【发布时间】:2016-04-06 16:03:48
【问题描述】:
首先:我才刚接触 Tensorflow 几天,所以请多多包涵。
我从 cifar10 教程代码开始,现在我使用卷积和特征值分解的组合来打破符号微分。 IE。图表被构建,然后在调用train() 时,脚本以“没有为操作定义梯度[...](操作类型:SelfAdjointEig)”而停止。这并不奇怪。
有问题的子图的输入仍然只是输入特征图和正在使用的过滤器,我手头有梯度公式,考虑到子图的输入和相对于其输出的梯度。
根据我在文档中看到的内容,我可以使用 RegisterGradient 为自定义 Ops 注册渐变方法,或者使用实验性 gradient_override_map 覆盖它们。
这两个都应该让我可以访问我需要的东西。例如,searching on Github 我发现很多示例都以op.input[0] 或诸如此类的形式访问操作的输入。
我遇到的问题是我想从本质上“捷径”整个子图,而不是单个操作,所以我没有单个操作可以装饰。 由于这发生在 cifar 示例的卷积层之一中,我尝试使用该层的范围对象。 从概念上讲,进入和退出该范围图形的内容正是我想要的,所以如果我能以某种方式覆盖整个范围的渐变,那将“已经”做到这一点。
我看到tf.Graph.create_op(我认为)我可以使用它来注册一种新的操作类型,然后我可以使用上述方法覆盖该操作类型的梯度计算。但是我没有看到一种方法来定义该操作的 forward 传递而不用 C++ 编写它......
也许我完全以错误的方式接近这个? 由于我所有的前向或后向操作都可以使用 python 接口来实现,我显然希望避免在 C++ 中实现任何东西。
【问题讨论】:
-
也许您可以覆盖不可微图顶部单个操作的梯度,然后使用
tf.stop_gradient()来阻止该子图的梯度构造? stackoverflow.com/questions/33727935/… -
我可以想象在本地定义一个梯度函数,然后在其中使用仍在范围内的输入。但是我如何告诉 tf 我将哪些节点的梯度作为梯度计算的输入?这对我来说感觉就像我从根本上滥用了框架:P
标签: tensorflow