tensorflow 自定义 op
可能需要新定义 c++ operation 的几种情况:现有的 operation 组合不出来你想要的 op
现有的 operation 组合 出来的 operation 十分低效
如果你想要手动融合一些操作。
为了实现你的自定义操作,你需要做一下几件事:在 c++ 文件中注册一个新op: Op registration 定义了 op 的功能接口,它和 op 的实现是独立的。例如:op registration 定义了 op 的名字和 op的输出输出。它同时也定义了 shape 方法,被用于 tensor 的 shape 接口。
在 c++ 中实现 op:op 的实现称之为 kernel ,它是op 的一个具体实现。对于不同的输入输出类型或者 架构(CPUs,GPUs)可以有不同的 kernel 实现 。
创建一个 python wrapper(可选的): 这个 wrapper 是一个 公开的 API,用来在 python中创建 op。 op registration 会生成一个默认的 wrapper,我们可以直接使用或者自己添加一个。
写一个计算 op 梯度的方法(可选)。
测试 op:为了方便,我们通常在 python 中测试 op,但是你也可以在 c++ 中进行测试。如果你定义了 gradients,你可以 通过 Python 的 gradient checker 验证他们。 这里有个例子relu_op_test.py ,测试 ReLU-like 的 op 的 前向和梯度过程。
Define the op’s interface
You define the interface of an op by registering it with the TensorFlow system.
在注册 op 的时候,你需要指定:op 的名字
op 的输入(名字,类型),op 的输出(名字,类型)
docstrings
op 可能需要的 一些 attrs
为了演示这个到底怎么工作的,我们来看一个简单的例子:定义一个 op :输入是一个 int32 的 tensor ,输出是输入的 拷贝,除了第一个元素保留,其它全都置零。
为了创建这个 op 的接口, 我们需要:创建一个文件,名字为 zero_out.cc. 然后调用 REGISTER_OP 宏,使用这个宏来定义 op 的接口 :#include "tensorflow/core/framework/op.h"#include "tensor