private static ModelProto ConvertToOnnxProtobufCore(IHostEnvironment env, OnnxContextImpl ctx, ITransformer transform, IDataView inputData) { var outputData = transform.Transform(inputData); LinkedList <ITransformCanSaveOnnx> transforms = null; using (var ch = env.Start("ONNX conversion")) { SaveOnnxCommand.GetPipe(ctx, ch, outputData, out IDataView root, out IDataView sink, out transforms); return(SaveOnnxCommand.ConvertTransformListToOnnxModel(ctx, ch, root, sink, transforms, null, null)); } }
internal static ModelProto ConvertToOnnxProtobuf(this ModelOperationsCatalog catalog, ITransformer transform, IDataView inputData) { var env = catalog.Environment; var ctx = new OnnxContextImpl(env, "model", "ML.NET", "0", 0, "machinelearning.dotnet", OnnxVersion.Stable); var outputData = transform.Transform(inputData); LinkedList <ITransformCanSaveOnnx> transforms = null; using (var ch = env.Start("ONNX conversion")) { SaveOnnxCommand.GetPipe(ctx, ch, outputData, out IDataView root, out IDataView sink, out transforms); return(SaveOnnxCommand.ConvertTransformListToOnnxModel(ctx, ch, root, sink, transforms, null, null)); } }
public void RemoveVariablesInPipelineTest() { var mlContext = new MLContext(seed: 1); string dataPath = GetDataPath("breast-cancer.txt"); var data = mlContext.Data.LoadFromTextFile <BreastCancerCatFeatureExample>(dataPath, separatorChar: '\t', hasHeader: true); var pipeline = mlContext.Transforms.Categorical.OneHotEncoding("F2", "F2", Transforms.OneHotEncodingTransformer.OutputKind.Bag) .Append(mlContext.Transforms.ReplaceMissingValues(new MissingValueReplacingEstimator.ColumnOptions("F2"))) .Append(mlContext.Transforms.Concatenate("Features", "F1", "F2")) .Append(mlContext.Transforms.Normalize("Features")) .Append(mlContext.BinaryClassification.Trainers.FastTree(labelColumnName: "Label", featureColumnName: "Features", numberOfLeaves: 2, numberOfTrees: 1, minimumExampleCountPerLeaf: 2)); var model = pipeline.Fit(data); var transformedData = model.Transform(data); var onnxConversionContext = new OnnxContextImpl(mlContext, "A Simple Pipeline", "ML.NET", "0", 0, "machinelearning.dotnet", OnnxVersion.Stable); LinkedList <ITransformCanSaveOnnx> transforms = null; using (var conversionChannel = (mlContext as IChannelProvider).Start("ONNX conversion")) { SaveOnnxCommand.GetPipe(onnxConversionContext, conversionChannel, transformedData, out IDataView root, out IDataView sink, out transforms); // Input columns' names to be excluded in the resulted ONNX model. var redundantInputColumnNames = new HashSet <string> { "Label" }; // Output columns' names to be excluded in the resulted ONNX model. var redundantOutputColumnNames = new HashSet <string> { "Label", "F1", "F2", "Features" }; var onnxModel = SaveOnnxCommand.ConvertTransformListToOnnxModel(onnxConversionContext, conversionChannel, root, sink, transforms, redundantInputColumnNames, redundantOutputColumnNames); // Check ONNX model's text format. We save the produced ONNX model as a text file and compare it against // the associated file in ML.NET repo. Such a comparison can be retired if ONNXRuntime ported to ML.NET // can support Linux and Mac. var subDir = Path.Combine("..", "..", "BaselineOutput", "Common", "Onnx", "BinaryClassification", "BreastCancer"); var onnxTextName = "ExcludeVariablesInOnnxConversion.txt"; var onnxFileName = "ExcludeVariablesInOnnxConversion.onnx"; var onnxTextPath = GetOutputPath(subDir, onnxTextName); var onnxFilePath = GetOutputPath(subDir, onnxFileName); SaveOnnxModel(onnxModel, onnxFilePath, onnxTextPath); CheckEquality(subDir, onnxTextName, digitsOfPrecision: 3); } Done(); }
private static ModelProto ConvertToOnnxProtobufCore(IHostEnvironment env, OnnxContextImpl ctx, ITransformer transform, IDataView inputData, string[] outputColumnNamesToKeep = null) { var outputData = transform.Transform(inputData); LinkedList <ITransformCanSaveOnnx> transforms = null; using (var ch = env.Start("ONNX conversion")) { SaveOnnxCommand.GetPipe(ctx, ch, outputData, out IDataView root, out IDataView sink, out transforms); // We pass in the output names to keep, but this next call expects a list of ones to drop. Invert the list. var outputColumnNamesToDrop = new HashSet <string>(); if (outputColumnNamesToKeep != null) { for (int i = 0; i < sink.Schema.Count; ++i) { if (!outputColumnNamesToKeep.Contains(sink.Schema[i].Name)) { outputColumnNamesToDrop.Add(sink.Schema[i].Name); } } } return(SaveOnnxCommand.ConvertTransformListToOnnxModel(ctx, ch, root, sink, transforms, null, outputColumnNamesToDrop)); } }