首页 文章

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

提问于
浏览
14

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

我从cifar10教程代码开始,我现在使用卷积和特征值分解的组合来打破符号区分 . 即图形生成,然后在调用 train() 时脚本停止"No gradient defined for operation [...] (op type: SelfAdjointEig)" . 这并不奇怪 .

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

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

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

我看到tf.Graph.create_op(我认为)我可以使用它来注册一种新类型的操作然后我可以覆盖该操作类型's gradient computation with aforementioned methods. But I don' t看到一种定义该操作的前向传递的方法而不用在C中编写它...

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

2 回答

  • 28

    这是Sergey Ioffe的一招:

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

    t = g(x)
    y = t + tf.stop_gradient(f(x) - t)
    

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

  • 0

    如何乘法和除法,而不是加减t?

    t = g(x)
    y = tf.stop_gradient(f(x) / t) * t
    

相关问题