如何仅为Tensorflow子图定义渐变?

bla*_*dog 17 tensorflow

第一:我和Tensorflow只有几天了,所以请耐心等待.

我从cifar10教程代码开始,我现在使用卷积和特征值分解的组合来打破符号差异.即图形构建,然后在调用train()脚本时停止"没有为操作定义梯度[...](操作类型:SelfAdjointEig)".这并不奇怪.

有问题的子图的输入仍然只是输入要素图和正在使用的过滤器,我有手头的渐变公式,它们应该是直接实现的,给定子图的输入和梯度到它的输出.

从我在文档中看到的内容,我可以为自定义Ops注册渐变方法,RegisterGradient或者使用实验来覆盖它们gradient_override_map.这两个应该让我访问我需要的东西.例如,在Github上搜索我发现了很多访问op的输入的例子op.input[0].

我的问题是我想基本上"快捷"整个子图,而不是单个操作,所以我没有单一的操作来装饰.由于这发生在cifar示例的一个卷积层中,我尝试使用该层的范围对象.从概念上讲,进入和退出该范围图形的内容正是我想要的,如果我能以某种方式覆盖整个范围的"已经"执行它的渐变.

我看到tf.Graph.create_op了(我认为)我可以用来注册一种新类型的操作,然后我可以用上述方法覆盖该操作类型的梯度计算.但我没有看到一种方法来定义该操作的前向传递而不用C++编写它...

也许我完全接近这个错误的方式?由于我的所有前向或后向操作都可以使用python接口实现,因此我显然希望避免在C++中实现任何内容.

Yar*_*tov 31

这是Sergey Ioffe的一招:

假设你想要一组ops在前进模式下表现为f(x),但在后向模式下表现为g(x).你实现它

t = g(x)
y = t + tf.stop_gradient(f(x) - t)
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,您的g(x)可以是一个标识操作,使用自定义渐变 gradient_override_map

  • "t + f(x)-t"的值等于"f(x)".它在当前版本中具有计算上的等效性,但在将来的版本中它可能会被优化掉 (3认同)
  • 为了理解:`stop_gradient`调用处理自动渐变位,覆盖`g`的渐变使我能够插入我自己的,并且`t + f(x) - t`将被最小化? (2认同)
  • 终于能够应用这个,尽管不是为了相同的功能.但这并不能很好地概括为具有多个输入的"复合操作",因为"加减法"不起作用,是吗?我能想到的最好(但毕竟不必尝试)是以某种方式使用元组而不是身份操作.但我对后续图表的外观有点不清楚.无论如何,非常感谢你:) (2认同)