Operators 输入输出在OpProtoMaker 类中如何命名
Created by: lcy-seso
为了解决此 issue 中提出的问题:https://github.com/PaddlePaddle/Paddle/issues/3899 这里先汇总一些大家的讨论意见。
关于命名
- 单输入单输出激活和纯数学运算,统一改成X,Y。
- 目前代码中已经命名为Out的,统一重命名为Y。
- 避免组合 Op 出现硬编码判断名字。
- 这里最好可以整理出一个表格,供大家速查。
- 复杂Op,CRF,NCE,图像操作,输入本身有固定名字的,使用有意义的名字。
- 一个字母的名字大写,多余一个字母的小写。
- 损失函数的输出命名为 loss,ground-truth 命名为 label。
命名引起的问题
- 按照目前创建 Op 的方式,如果ProtoMaker中输入输出名不统一,会导致组合 Op 的编写可能由于输入Op 命名风格不统一,出现
if-else
硬编码处理命名。 - 未来新加入一个op,却因为名字风格比较特殊(在合理范围内),导致之前的写过的组合op潜在出问题,也非常容易出bug。考虑到, Op由不同开发者开发,很难注意到别人编写的Op也需要修改。若单测未覆盖到会非常危险。
- 应该给一个Op可以包含的Op加一个约束。
-
一种解决方案:
XXX_OP( input=[ ["input1_a", "input1_b"], [...] ], output=[ ["output1"], ["output2"] ] )
- 在C++或者在Python端,都加上一个wrapper,用数组中的顺序来表明是哪个输入或输出。
- 自动生成代码。现在的op方法都在cpp里边,自动生成一个比较好的python Operator代码,用户可以通过查看python源代码来了解参数列表的情况。