第一:我和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 回答
这是Sergey Ioffe的一招:
假设你想要一组ops在前进模式下表现为f(x),但在后向模式下表现为g(x) . 你实现它
所以在你的情况下,你的g(x)可以是一个标识操作,使用
gradient_override_map
自定义渐变如何乘法和除法,而不是加减t?