This is a project for machine learning study, especially for deep learning.
I love C# so I write it by pure C#, no 3rd part dependency. It is easy to rewrite to Python or other language.
//create a fully connected neural network var nn = new NeuralNetwork() .AddFullLayer(100) //fully connected layer with 100 units .AddReLU() //ReLU activation .AddFullLayer(10) .AddSoftmax() //softmax output .UseAdam() //use Adam optimizer .UseCrossEntropyLoss(); //use cross entropy loss function //create a Trainer to train the model var trainer = new Trainer(nn, batchSize = 64, epoch = 10, randomBatch = true) { LabelCodec = codec, //set label codec Normalizer = norm, //set normalizer }; trainer.StartTrain(trainX, trainY, testX, testY); //get the machine after train trainer.GetClassificationMachine(); //you can also save the training result to a file Storage.Save(trainer, "filename"); //and load it from file var trainer = Storage.Load<Trainer>("filename"); //you can save and load models also Storage.Save(nn, "filename"); var model = Storage.Load<NeuralNetwork>("filename");
There're a lot of objects can be stored.
The storage file is xml format:
<?xml version="1.0" encoding="utf-8"?> <Trainer> <Mission>MNIST</Mission> <BatchSize>64</BatchSize> <Epoch>10</Epoch> <RandomBatch>False</RandomBatch> <PrintSteps>10</PrintSteps> <LastTrainLoss>0</LastTrainLoss> <LastTrainAccuracy>0</LastTrainAccuracy> <LastTestLoss>0</LastTestLoss> <LastTestAccuracy>0</LastTestAccuracy> <PreProcessor /> <LabelCodec> <OneHotCodec>a,b,c</OneHotCodec> </LabelCodec> <Normalizer /> <Model> <NeuralNetwork> <LossFunction> <CrossEntropy /> </LossFunction> <Optimizer> <Adam> <Alpha>0.001</Alpha> <Beta1>0.9</Beta1> <Beta2>0.999</Beta2> </Adam> </Optimizer> <Regularizer /> <Layers> <FullLayer> <UnitCount>10</UnitCount> <Weights /> <Bias /> </FullLayer> <Sigmoid /> <FullLayer> <UnitCount>6</UnitCount> <Weights /> <Bias /> </FullLayer> <Sigmoid /> <FullLayer> <UnitCount>3</UnitCount> <Weights /> <Bias /> </FullLayer> <Softmax /> </Layers> </NeuralNetwork> </Model> </Trainer>
of cause you can write a xml file directly and use Storage.Load("filename") to load it, as long as you like, but personally i don't like this way ;)
I trained a handwriting network use MNIST dataset, and save the machine to a xml file, then write a WPF desktop application and load the network to recognize the new handwriting digit from user.
The project is: https://github.com/durow/MLStudy.NET/tree/master/MNISTDemo