private static void DiamondML() { var mlContext = new MLContext(); DataRelativePath = $"{BaseDatasetsRelativePath}/diamond_data.csv"; DataPath = GetAbsolutePath(DataRelativePath); ModelRelativePath = $"{BaseModelsRelativePath}/whitediamondModel.zip"; ModelPath = GetAbsolutePath(ModelRelativePath); // STEP 1: Common data loading configuration IDataView dataView = mlContext.Data.LoadFromTextFile <DiamondData>(DataPath, separatorChar: ',', hasHeader: true); DataOperationsCatalog.TrainTestData trainTestSplit = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2); IDataView trainingData = trainTestSplit.TrainSet; IDataView testData = trainTestSplit.TestSet; // STEP 2: Common data process configuration with pipeline data transformations //var dataProcessPipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Features", inputColumnName: nameof(DiamondData.LumiStdHueMean)); var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", "LumiStd", "HueMean"); // STEP 3: Set the training algorithm, then create and config the modelBuilder var trainer = mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"); var trainingPipeline = dataProcessPipeline.Append(trainer); // STEP 4: Train the model fitting to the DataSet ITransformer trainedModel = trainingPipeline.Fit(trainingData); // STEP 5: Evaluate the model and show accuracy stats var predictions = trainedModel.Transform(testData); var metrics = mlContext.BinaryClassification.Evaluate(data: predictions, labelColumnName: "Label", scoreColumnName: "Score"); ConsoleHelper.PrintBinaryClassificationMetrics(trainer.ToString(), metrics); // STEP 6: Save/persist the trained model to a .ZIP file mlContext.Model.Save(trainedModel, trainingData.Schema, ModelPath); Console.WriteLine("The model is saved to {0}", ModelPath); // TRY IT: Make a single test prediction, loading the model from .ZIP file DiamondData sampleDiamond = new DiamondData { LumiStd = 0.1169f, HueMean = 0.13599f }; // Create prediction engine related to the loaded trained model var predEngine = mlContext.Model.CreatePredictionEngine <DiamondData, DiamondPrediction>(trainedModel); // Score var resultprediction = predEngine.Predict(sampleDiamond); Console.WriteLine($"=============== Single Prediction ==============="); Console.WriteLine($"{sampleDiamond.LumiStd}, {sampleDiamond.HueMean} | Prediction: {(Convert.ToBoolean(resultprediction.Prediction) ? "white diamond" : "Non white diamond")} Probability of being white diamond: {resultprediction.Probability} "); Console.WriteLine($"================End of Process.Hit any key to exit=================================="); }
void FillDiamond(ref Mesh diamond, ref DiamondData data) { _vertices[0].pos.x = data.pt1.x; _vertices[0].pos.y = data.pt1.y; _vertices[0].uv.x = data.uv1.x; _vertices[0].uv.y = data.uv1.y; _vertices[1].pos.x = data.pt2.x; _vertices[1].pos.y = data.pt2.y; _vertices[1].uv.x = data.uv2.x; _vertices[1].uv.y = data.uv2.y; _vertices[2].pos.x = data.pt3.x; _vertices[2].pos.y = data.pt3.y; _vertices[2].uv.x = data.uv3.x; _vertices[2].uv.y = data.uv3.y; _vertices[3].pos.x = data.pt4.x; _vertices[3].pos.y = data.pt4.y; _vertices[3].uv.x = data.uv4.x; _vertices[3].uv.y = data.uv4.y; _vertices[4].pos.x = data.pt5.x; _vertices[4].pos.y = data.pt5.y; _vertices[4].uv.x = data.uv5.x; _vertices[4].uv.y = data.uv5.y; MeshUpdateFlags flag = GetMeshUpdateFlags(); const int indexCount = 9; const int vertexCount = 5; // 設定 Mesh Topologiy SubMeshDescriptor desc = new SubMeshDescriptor(0, indexCount, MeshTopology.Triangles); diamond.SetSubMesh(0, desc, flag); // 宣告 index buffer 結構 diamond.SetIndexBufferParams(indexCount, IndexFormat.UInt16); // 宣告 vertex buffer 結構 diamond.SetVertexBufferParams(vertexCount, _layouts); diamond.SetVertexBufferData(_vertices, 0, 0, vertexCount, 0, flag); diamond.SetIndexBufferData(_indices, 0, 0, indexCount, flag); }