第一:我和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
| 归档时间: |
|
| 查看次数: |
5995 次 |
| 最近记录: |