Closed
Description
很多Operator
中都会用到一些中间输出
变量,它们被声明为AsIntermediate()
类型。根据输入的情况不同,有些中间输出
变量实际不会被用到,比如在FCOp
中:
- 当输入变量
X
和W
包含多组数据时,计算的过程为MulOut[i] = X[i] * W[i]
SumOut = MulOut[0] + ... + MulOut[n-1]
此时需要用到MulOut
和SumOut
两个中间输出
变量。
- 当输入变量
X
和W
只包含一组数据时,计算的过程为MulOut[0] = X[0] * W[0]
此时,我们不再需要使用SumOut
。
因此在单测中,这些不被用到的中间输出
变量应该允许不指定,并且不进行检查。
单测中,Op
的输入输出都通过self.inputs
和self.outputs
指定。在创建Op
的输入输出
变量时,会遍历当前Op
的Proto
中所指定的输入输出
变量,如果这些变量被self.inputs
和self.outputs
指定了,则创建对应的Variable
。
for out_name, out_dup in Operator.get_op_outputs(op_type):
if out_name in outputs:
kwargs[out_name] = []
if out_dup:
sub_out = outputs[out_name]
for sub_out_name, _ in sub_out:
var = scope.new_var(sub_out_name)
kwargs[out_name].append(sub_out_name)
else:
var = scope.new_var(out_name)
kwargs[out_name].append(out_name)
因此,在取输出变量
校对结果时,也需要检查输出变量
是否被self.outputs
,因为没有被self.outputs
指定的变量,很有可能是不需要的中间输出
变量。至于Op
计算实际需要,但是没有在self.outputs
中指定的变量,则应由Op
实现的C++代码实现检查和报错。
Metadata
Metadata
Assignees
Labels
No labels