ML.netでModel Builderを使ってみる その8 例外処理を入れる
過去の記事でも書いていますが、ロギングとコメントと例外処理はお金の発生するプログラムには必須です。
ロギングとコメントは、前回のソースコードで実際に書きました。
では、残る例外処理をどうするかが今日の課題です。
サンプルプログラム等では、例外ごとに処理を分けて行う等も書いていますが面倒です。
私の場合、例外が発生したらロギングだけして、プログラムは異常終了させます。
異常復帰させる事が出来ても、以降の処理で何かしらの矛盾が生まれ、その矛盾がもっと面倒な例外エラーを発生させるからです。
安定したプログラムであれば、プログラムを使っている人が意図しない事を行わない限り、めったに例外エラーが発生しません。
その代わり、プログラムに問題があれば例外エラーが沢山発生します。
これはプログラムの動作を確認したり、評価する時に修正するだけです。
とにかくプログラムに慣れない間は、自分が原因になる例外エラーが沢山出ます。
このため、例外処理が無ければ安定したプログラムは作れません。
なお、例外を発生させるソースコードを掲載しますが、このソースコードには問題が残っています。
このコード、以下のWebアドレスに掲載されているものを基本にしています。
https://docs.microsoft.com/ja-jp/dotnet/machine-learning/
印刷して学びたい場合もPDFファイルがあるので参考になります。
https://docs.microsoft.com/ja-jp/dotnet/opbuildpdf/machine-learning/toc.pdf?branch=live
#学習 #勉強 #AI #機械学習 #プログラミング #Visual #CSharp #BASIC #ソースコード #Windows #自動判定
#画像 #判定 #検査
C#で書いたクラスライブラリーのソースコードです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Microsoft.ML;
using static Microsoft.ML.DataOperationsCatalog;
using Microsoft.ML.Vision;
using System.Reflection;
using log4net;
namespace ClassLibrary1
{
public class Class1
{
public void SampleMachineLearning(string SpecifyFileToInputPhoto,ref string JudgmentResult, ref float Probability,string LocationOfLearningData)
{
//ロギングを開始する
var logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
//関数の起動時の引数を保存する
logger.Info("起動時引数一覧");
logger.Info("SpecifyFileToInputPhoto:" + SpecifyFileToInputPhoto);
logger.Info("LocationOfLearningData:" + LocationOfLearningData);
try
{
//例外エラー発生します
int abc = 0;
abc = 10 / abc;
// Create single instance of sample data from first line of dataset for model input
MlTestML.Model.ModelInput sampleData = new MlTestML.Model.ModelInput()
{
ImageSource = SpecifyFileToInputPhoto,
};
//学習データの位置を指定する
MlTestML.Model.ConsumeModel.modelPath = LocationOfLearningData;
// Make a single prediction on the sample data and print results
var predictionResult = MlTestML.Model.ConsumeModel.Predict(sampleData);
Console.WriteLine("Using model to make single prediction -- Comparing actual Label with predicted Label from sample data...\n\n");
Console.WriteLine($"ImageSource: {sampleData.ImageSource}");
Console.WriteLine($"\n\nPredicted Label value {predictionResult.Prediction} \nPredicted Label scores: [{String.Join(",", predictionResult.Score)}]\n\n");
Console.WriteLine("=============== End of process, hit any key to finish ===============");
//Console.ReadKey();
JudgmentResult = predictionResult.Prediction;
Probability = 0;
for (int i = 0; i < predictionResult.Score.Length; i++)
{
if (Probability < predictionResult.Score[i])
{
Probability = predictionResult.Score[i];
}
}
//関数の終了時の戻り値を保存する
logger.Info("終了時引数一覧");
logger.Info("JudgmentResult:" + JudgmentResult);
logger.Info("Probability:" + Probability);
}
catch (System.Exception ex)
{
logger.Error("HResult:" + ex.HResult);
logger.Error("Exception:"+ex.Message);
}
}
}
}