diff --git a/doc/fluid/dev/op_notes.md b/doc/fluid/dev/op_notes.md index 646ec8f3d1b767e1758050aa48a4a065b97b8e5b..e450ea760833437df8e037067b884a491ce1b40b 100644 --- a/doc/fluid/dev/op_notes.md +++ b/doc/fluid/dev/op_notes.md @@ -49,7 +49,7 @@ Operator继承关系图: GradOpMakerFN Functor -返回当前Op对应的反向Op:std::vector< std::unique_ptr< OpDesc>>,因为正向Op的反向可能有多个Op构成 +返回当前Op对应的反向Op的一组OpDesc,因为正向Op的反向可能有多个Op构成 编译时调用 @@ -92,15 +92,12 @@ Operator继承关系图: **注意:** 1. 对于所有Op,前三个参数是必须的,op_type指明op的名字,OperatorBase是该Op的对象,op_maker_and_checker_maker是op的maker和op中attr的checker。 - 2. 如果该Op有反向,则必须要有op_grad_opmaker,因为在backward会根据正向的Op中获取反向Op的Maker。 - 3. 框架提供了一个默认的op_grad_opmaker:`DefaultGradOpDescMaker`,这个Maker会将前向Op的输入和输出都作为反向Op的输入,将前向Op的输入的梯度作为反向Op的输出,并将前向Op的属性拷贝过来。**注意:**DefaultGradOpDescMaker会将前向Op的所有输入输出都做反向Op的输入,即使这个输入是没有必要的,这将会导致无法对没有用到的变量做内存优化。 - 4. 框架没有提供默认的op_infer_var_shape方法。如果该Op是无OpKernel的,通常需要用户添加对应的op_infer_var_shape方法;如果该Op是有OpKernel的,需要实现`OperatorWithKernel`中的`InferShape`方法,此时不需要提供op_infer_var_shape方法。具体实现可参考[while_op.cc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/controlflow/while_op.cc),[conv_op.cc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/conv_op.cc)。 - 5. 框架没有提供默认的op_infer_var_type方法,用户需要根据实际情况添加op_infer_var_shape。严格来说每个Op都应该注册一个InferVarType,op_infer_var_type根据输入的Var的type和dtype推断输出Var的type和dtype。**注意:**在Python端的LayerHelper中create_variable_for_type_inference操作返回的Variable里面是LoDTensor,C++端的InferVarType可以修改`Variable`的type和dtype。 + 更多内容请参考: - [如何写新的Op](http://paddlepaddle.org/documentation/docs/zh/1.1/advanced_usage/development/new_op.html)