-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Closed
Description
The following code snippet automatically exports operators into Python layer functions:
Paddle/python/paddle/v2/framework/layers.py
Lines 111 to 179 in 6d649d9
def _create_op_func_(op_type): | |
op_proto = OpProtoHolder.instance().get_op_proto(op_type) | |
not_intermediate_outputs = \ | |
filter(lambda output: not output.intermediate, op_proto.outputs) | |
intermediate_outputs = \ | |
filter(lambda output: output.intermediate, op_proto.outputs) | |
if len(not_intermediate_outputs) != 1: | |
raise ValueError( | |
"Only one not intermediate output operator can be automatically generated" | |
) | |
if not_intermediate_outputs[0].duplicable: | |
raise ValueError( | |
"Only not duplicable op can be automatically generated") | |
for output in intermediate_outputs: | |
if output.duplicable: | |
raise ValueError( | |
"Only when all intermediate ops are not duplicable, " | |
"this op can be automatically generated") | |
o_name = not_intermediate_outputs[0].name | |
intermediate_output_names = [output.name for output in intermediate_outputs] | |
def func(**kwargs): | |
helper = LayerHelper(op_type, **kwargs) | |
inputs = dict() | |
dtype = None | |
for ipt in op_proto.inputs: | |
name = _convert_(ipt.name) | |
val = kwargs.pop(name, []) | |
if not isinstance(val, list) and not isinstance(val, tuple): | |
val = [val] | |
for each in val: | |
if not isinstance(each, Variable): | |
raise ValueError("input of {0} must be variable".format( | |
op_type)) | |
if dtype is None: | |
dtype = each.data_type | |
elif dtype != each.data_type: | |
raise ValueError( | |
"operator {0} must input same dtype".format(op_type)) | |
inputs[ipt.name] = val | |
outputs = dict() | |
out = helper.create_tmp_variable(dtype=dtype) | |
outputs[o_name] = [out] | |
for name in intermediate_output_names: | |
outputs[name] = [helper.create_tmp_variable(dtype=dtype)] | |
helper.append_op( | |
type=op_type, inputs=inputs, outputs=outputs, attrs=kwargs) | |
return helper.append_activation(out) | |
func.__name__ = op_type | |
globals()[op_type] = func | |
global __all__ | |
__all__.append(op_type) | |
_create_op_func_('mean') | |
_create_op_func_('mul') | |
_create_op_func_('elementwise_add') | |
_create_op_func_('dropout') | |
_create_op_func_('reshape') | |
_create_op_func_('elementwise_add') | |
_create_op_func_('sigmoid') | |
_create_op_func_('scale') |
We need to improve it so that users can use Python's help
function to retrieve the document of the layer/operator.
Metadata
Metadata
Assignees
Labels
No labels