def validator_classifier_converter(scope, operator, container): outputs = operator.outputs # outputs in ONNX graph op = operator.raw_operator # scikit-learn model (mmust be fitted) # We reuse existing converter and declare it # as a local operator. model = op.estimator_ alias = get_model_alias(type(model)) val_op = scope.declare_local_operator(alias, model) val_op.inputs = operator.inputs # We add an intermediate outputs. val_label = scope.declare_local_variable('val_label', Int64TensorType()) val_prob = scope.declare_local_variable('val_prob', FloatTensorType()) val_op.outputs.append(val_label) val_op.outputs.append(val_prob) # We adjust the output of the submodel. shape_calc = get_shape_calculator(alias) shape_calc(val_op) # We now handle the validation. val_max = scope.get_unique_variable_name('val_max') container.add_node('ReduceMax', val_prob.full_name, val_max, name=scope.get_unique_operator_name('ReduceMax'), axes=[1], keepdims=0) th_name = scope.get_unique_variable_name('threshold') container.add_initializer(th_name, onnx_proto.TensorProto.FLOAT, [1], [op.threshold]) val_bin = scope.get_unique_variable_name('val_bin') apply_greater(scope, [val_max, th_name], val_bin, container) val_val = scope.get_unique_variable_name('validate') apply_cast(scope, val_bin, val_val, container, to=onnx_proto.TensorProto.INT64) # We finally link the intermediate output to the shared converter. apply_identity(scope, val_label.full_name, outputs[0].full_name, container) apply_identity(scope, val_prob.full_name, outputs[1].full_name, container) apply_identity(scope, val_val, outputs[2].full_name, container)
def discretizer_transformer_converter(scope, operator, container): op = operator.raw_operator # We convert the discretizer into a tree. model = op.astree() # We add a placeholder to call the converter for # this model. alias = get_model_alias(type(model)) op = scope.declare_local_operator(alias) op.inputs = operator.inputs op.raw_operator = model tree_out = scope.declare_local_variable( 'treeout', operator.inputs[0].type.__class__()) op.outputs.append(tree_out) out_name = operator.outputs[0].full_name apply_cast(scope, tree_out.full_name, out_name, container, to=onnx_proto.TensorProto.INT64)