Beispiel #1
0
        public static async Task Main()
        {
            // Create the network
            INeuralNetwork network = NetworkManager.NewSequential(TensorInfo.Image <Alpha8>(28, 28),
                                                                  NetworkLayers.Convolutional((5, 5), 20, ActivationType.Identity),
                                                                  NetworkLayers.Pooling(ActivationType.LeakyReLU),
                                                                  NetworkLayers.FullyConnected(100, ActivationType.LeCunTanh),
                                                                  NetworkLayers.Softmax(10));

            // Prepare the dataset
            ITrainingDataset trainingData = await Mnist.GetTrainingDatasetAsync(100); // Batches of 100 samples

            ITestDataset testData = await Mnist.GetTestDatasetAsync(p => Printf($"Epoch {p.Iteration}, cost: {p.Result.Cost}, accuracy: {p.Result.Accuracy}"));

            if (trainingData == null || testData == null)
            {
                Printf("Error downloading the datasets");
                Console.ReadKey();
                return;
            }

            // Train the network
            TrainingSessionResult result = await NetworkManager.TrainNetworkAsync(network,
                                                                                  trainingData,
                                                                                  TrainingAlgorithms.AdaDelta(),
                                                                                  60, 0.5f,
                                                                                  TrackBatchProgress,
                                                                                  testDataset : testData);

            Printf($"Stop reason: {result.StopReason}, elapsed time: {result.TrainingTime}");
            Console.ReadKey();
        }
Beispiel #2
0
        public static void MNISTConvolutional(string dataFilesPath)
        {
            Console.Write("Loading training data...");
            var trainingData = Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte", dataFilesPath + "train-images.idx3-ubyte");
            var testData     = Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte", dataFilesPath + "t10k-images.idx3-ubyte");

            Console.WriteLine($"done - found {trainingData.Count} training samples and {testData.Count} test samples");

            var convolutionDescriptor = new ConvolutionDescriptor(0.1f)
            {
                Stride               = 1,
                Padding              = 1,
                FilterDepth          = 4,
                FilterHeight         = 3,
                FilterWidth          = 3,
                WeightInitialisation = WeightInitialisationType.Xavier,
                WeightUpdate         = WeightUpdateType.RMSprop,
                Activation           = ActivationType.LeakyRelu
            };
            const int   BATCH_SIZE = 128, NUM_EPOCHS = 2;
            const float TRAINING_RATE = 0.03f;
            var         errorMetric   = ErrorMetricType.OneHot.Create();
            var         layerTemplate = new LayerDescriptor(0.1f)
            {
                WeightUpdate = WeightUpdateType.RMSprop,
                Activation   = ActivationType.LeakyRelu
            };

            using (var lap = Provider.CreateLinearAlgebra(false)) {
                var trainingSamples = trainingData.Shuffle(0).Take(1000).Select(d => d.AsVolume).Select(d => Tuple.Create(d.AsTensor(lap), d.ExpectedOutput)).ToList();
                var testSamples     = testData.Shuffle(0).Take(100).Select(d => d.AsVolume).Select(d => Tuple.Create(d.AsTensor(lap), d.ExpectedOutput)).ToList();

                // create a network with two convolutional layers
                // the first takes the input image of depth 1
                // and the second expects of tensor with depth equal to the output of the first layer
                var layer = new IConvolutionalLayer[] {
                    lap.NN.CreateConvolutionalLayer(convolutionDescriptor, 1, 28),
                    lap.NN.CreateConvolutionalLayer(convolutionDescriptor, convolutionDescriptor.FilterDepth, 28)
                };
                var trainingDataProvider = lap.NN.CreateConvolutionalTrainingProvider(convolutionDescriptor, trainingSamples, layer, true);
                var testDataProvider     = lap.NN.CreateConvolutionalTrainingProvider(convolutionDescriptor, testSamples, layer, false);

                using (var trainer = lap.NN.CreateBatchTrainer(layerTemplate, trainingDataProvider.InputSize, 128, trainingDataProvider.OutputSize)) {
                    var trainingContext = lap.NN.CreateTrainingContext(errorMetric, TRAINING_RATE, BATCH_SIZE);
                    trainingContext.EpochComplete += c => {
                        var output    = trainer.Execute(testDataProvider.TrainingDataProvider);
                        var testError = output.Select(d => errorMetric.Compute(d.Output, d.ExpectedOutput)).Average();
                        trainingContext.WriteScore(testError, errorMetric.DisplayAsPercentage);
                    };
                    trainingContext.ScheduleTrainingRateChange(50, TRAINING_RATE / 3f);
                    trainingContext.ScheduleTrainingRateChange(100, TRAINING_RATE / 9f);
                    trainingContext.ScheduleTrainingRateChange(150, TRAINING_RATE / 27f);
                    trainer.Train(trainingDataProvider.TrainingDataProvider, NUM_EPOCHS, trainingContext);
                }
                foreach (var item in layer)
                {
                    item.Dispose();
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Trains a neural net on the MNIST database (digit recognition)
        /// The data files can be downloaded from http://yann.lecun.com/exdb/mnist/
        /// </summary>
        /// <param name="dataFilesPath">The path to a directory with the four extracted data files</param>
        public static void MNIST(string dataFilesPath, string outputModelPath)
        {
            // neural network hyper parameters
            const int   HIDDEN_SIZE = 1024, BATCH_SIZE = 128, NUM_EPOCHS = 40;
            const float TRAINING_RATE = 0.03f;
            var         errorMetric   = ErrorMetricType.OneHot.Create();
            var         layerTemplate = new LayerDescriptor(0f)
            {
                WeightUpdate = WeightUpdateType.RMSprop,
                Activation   = ActivationType.LeakyRelu
            };

            Console.Write("Loading training data...");
            var trainingData = Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte", dataFilesPath + "train-images.idx3-ubyte");
            var testData     = Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte", dataFilesPath + "t10k-images.idx3-ubyte");

            Console.WriteLine("done");

            Console.WriteLine("Starting training...");
            using (var lap = GPUProvider.CreateLinearAlgebra()) {
                var trainingSet = lap.NN.CreateTrainingDataProvider(trainingData.Select(d => d.Sample).ToList());
                var testSet     = lap.NN.CreateTrainingDataProvider(testData.Select(d => d.Sample).ToList());

                using (var trainer = lap.NN.CreateBatchTrainer(layerTemplate, Mnist.INPUT_SIZE, HIDDEN_SIZE, Mnist.OUTPUT_SIZE)) {
                    var trainingManager = lap.NN.CreateFeedForwardManager(trainer, outputModelPath, testSet);
                    var trainingContext = lap.NN.CreateTrainingContext(errorMetric, TRAINING_RATE, BATCH_SIZE);
                    trainingContext.ScheduleTrainingRateChange(NUM_EPOCHS / 2, TRAINING_RATE / 3);
                    trainingManager.Train(trainingSet, NUM_EPOCHS, trainingContext);
                }
            }
        }
Beispiel #4
0
        public void DevicePlacementTest()
        {
            using (var graph = new TFGraph())
                using (var session = new TFSession(graph))
                {
                    var X = graph.Placeholder(TFDataType.Float, new TFShape(-1, 784));
                    var Y = graph.Placeholder(TFDataType.Float, new TFShape(-1, 10));

                    int numGPUs  = 4;
                    var Xs       = graph.Split(graph.Const(0), X, numGPUs);
                    var Ys       = graph.Split(graph.Const(0), Y, numGPUs);
                    var products = new TFOutput[numGPUs];
                    for (int i = 0; i < numGPUs; i++)
                    {
                        using (var device = graph.WithDevice("/device:GPU:" + i))
                        {
                            var W = graph.Constant(0.1f, new TFShape(784, 500), TFDataType.Float);
                            var b = graph.Constant(0.1f, new TFShape(500), TFDataType.Float);
                            products[i] = graph.Add(graph.MatMul(Xs[i], W), b);
                        }
                    }
                    var   stacked = graph.Concat(graph.Const(0), products);
                    Mnist mnist   = new Mnist();
                    mnist.ReadDataSets("/tmp");
                    int batchSize = 1000;
                    for (int i = 0; i < 100; i++)
                    {
                        var reader = mnist.GetTrainReader();
                        (var trainX, var trainY) = reader.NextBatch(batchSize);
                        var outputTensors = session.Run(new TFOutput[] { X }, new TFTensor[] { new TFTensor(trainX) }, new TFOutput[] { stacked });
                        Assert.Equal(1000, outputTensors[0].Shape[0]);
                        Assert.Equal(500, outputTensors[0].Shape[1]);
                    }
                }
        }
Beispiel #5
0
        private Point startPoint;              // coordinate of the start point of the line to be draw

        // Initialize the window, setup all things
        private void Form1_Load(object sender, EventArgs e)
        {
            model           = new Mnist();
            writeArea.Image = new Bitmap(writeArea.Width, writeArea.Height);
            graphics        = Graphics.FromImage(writeArea.Image);
            graphics.Clear(Color.White);
        }
Beispiel #6
0
        public void ImageCut()
        {
            Mnist      model = new Mnist();
            List <int> x_coord = new List <int>();
            List <int> y_coord = new List <int>();
            int        index = 0;
            const int  MnistImageSize = 28, corr = 25;

            CutY(ref x_coord);

            if (x_coord.Count > 1)
            {
                int x_start = x_coord[0];
                int x_end   = x_coord[x_coord.Count - 1];
                int x_index = 0;
                while (x_start != x_end)
                {
                    int Region_Width = x_start;
                    while (x_coord.Contains(Region_Width) && x_index < x_coord.Count)
                    {
                        Region_Width++;
                        x_index++;
                    }
                    int x = x_start;
                    int y = 0;

                    int width  = Region_Width - x_start;
                    int height = img.Height;

                    CutX(img.Clone(new Rectangle(x, y, width, height), img.PixelFormat), ref y_coord);

                    if (y_coord.Count > 1 && y_coord.Count != img.Height)
                    {
                        int y1 = y_coord[0];
                        int y2 = y_coord[y_coord.Count - 1];
                        if (y1 != 1)
                        {
                            y = y1 - 1;
                        }
                        height = y2 - y1 + 1;
                    }

                    Bitmap temp = img.Clone(new Rectangle(x - corr, y - corr, width + 2 * corr, height + 2 * corr),
                                            img.PixelFormat);
                    TextInfer(temp, model, MnistImageSize);
                    temp.Dispose();

                    if (x_index < x_coord.Count)
                    {
                        x_start = x_coord[x_index];
                    }
                    else
                    {
                        x_start = x_end;
                    }
                }
            }
        }
Beispiel #7
0
        static void Main(string[] args)
        {
            // 加载手写数字资源
            var mnist = Mnist.Load();

            // 训练次数和测试次数
            var trainCount = 5000;
            var testCount  = 200;

            // 获取训练图片、训练图片标签、测试图片、测试图片标签
            float[,] trainingImages, trainingLabels, testImages, testLabels;
            mnist.GetTrainReader().NextBatch(trainCount, out trainingImages, out trainingLabels);
            mnist.GetTestReader().NextBatch(testCount, out testImages, out testLabels);

            // 创建图
            var g = new TFGraph();

            // 训练图片占位符和训练标签占位符
            var trainingInput = g.Placeholder(TFDataType.Float, new TFShape(-1, 784)); // 不定数量的像素为24*24的图片
            var xte           = g.Placeholder(TFDataType.Float, new TFShape(784));

            // 创建计算误差和预测的图
            var distance = g.ReduceSum(g.Abs(g.Add(trainingInput, g.Neg(xte))), axis: g.Const(1));
            var pred     = g.ArgMin(distance, g.Const(0));

            // 创建会话
            var sess = new TFSession(g);

            // 精度
            var accuracy = 0.0f;

            // 进行迭代训练,并且每次都输出预测值
            for (int i = 0; i < testCount; i++)
            {
                var runner = sess.GetRunner();

                // 计算并且获取误差和预测值
                var result = runner.
                             Fetch(pred).
                             Fetch(distance).
                             AddInput(trainingInput, trainingImages).
                             AddInput(xte, Extract(testImages, i)).Run();
                var r  = result[0].GetValue();
                var tr = result[1].GetValue();

                var nn_index = (int)(long)result[0].GetValue();

                Console.WriteLine($"训练次数 {i}: 预测: { ArgMax(trainingLabels, nn_index) } 真实值: { ArgMax(testLabels, i)} (nn_index= { nn_index })");
                if (ArgMax(trainingLabels, nn_index) == ArgMax(testLabels, i))
                {
                    accuracy += 1f / testImages.Length;
                }
            }

            // 精确度
            Console.WriteLine("精度:" + accuracy);
        }
Beispiel #8
0
        private const int MnistImageSize = 28; //Mnist模型所需的输入图片大小

        private void Form1_Load(object sender, EventArgs e)
        {
            //当窗口加载时,绘制一个白色方框
            model      = new Mnist();
            digitImage = new Bitmap(picturebox1.Width, picturebox1.Height);
            Graphics g = Graphics.FromImage(digitImage);

            g.Clear(Color.White);
            picturebox1.Image = digitImage;
        }
        // This sample has a bug, I suspect the data loaded is incorrect, because the returned
        // values in distance is wrong, and so is the prediction computed from it.
        void NearestNeighbor()
        {
            // Get the Mnist data

            var mnist = Mnist.Load();

            // 5000 for training
            const int trainCount = 5000;
            const int testCount  = 200;
            var       Xtr        = mnist.GetBatchReader(mnist.TrainImages).ReadAsTensor(trainCount);
            var       Ytr        = mnist.OneHotTrainLabels;
            var       Xte        = mnist.GetBatchReader(mnist.TestImages).Read(testCount);
            var       Yte        = mnist.OneHotTestLabels;



            Console.WriteLine("Nearest neighbor on Mnist images");
            using (var g = new TFGraph()) {
                var s = new TFSession(g);


                TFOutput xtr = g.Placeholder(TFDataType.Float, new TFShape(-1, 784));

                TFOutput xte = g.Placeholder(TFDataType.Float, new TFShape(784));

                // Nearest Neighbor calculation using L1 Distance
                // Calculate L1 Distance
                TFOutput distance = g.ReduceSum(g.Abs(g.Add(xtr, g.Neg(xte))), axis: g.Const(1));

                // Prediction: Get min distance index (Nearest neighbor)
                TFOutput pred = g.ArgMin(distance, g.Const(0));

                var accuracy = 0f;
                // Loop over the test data
                for (int i = 0; i < testCount; i++)
                {
                    var runner = s.GetRunner();

                    // Get nearest neighbor

                    var result   = runner.Fetch(pred).Fetch(distance).AddInput(xtr, Xtr).AddInput(xte, Xte [i].DataFloat).Run();
                    var r        = result [0].GetValue();
                    var tr       = result [1].GetValue();
                    var nn_index = (int)(long)result [0].GetValue();

                    // Get nearest neighbor class label and compare it to its true label
                    Console.WriteLine($"Test {i}: Prediction: {ArgMax (Ytr, nn_index)} True class: {ArgMax (Yte, i)} (nn_index={nn_index})");
                    if (ArgMax(Ytr, nn_index) == ArgMax(Yte, i))
                    {
                        accuracy += 1f / Xte.Length;
                    }
                }
                Console.WriteLine("Accuracy: " + accuracy);
            }
        }
Beispiel #10
0
        /// <summary>
        /// 窗体的加载事件,在窗体显示时只执行一次。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // 新建模型
            model = new Mnist();
            // 初始化手写区为其大小的位图,以便进行操作。
            writeArea.Image = new Bitmap(writeArea.Width, writeArea.Height);
            // 获取手写区位图的绘图类,以便以后重置图像。
            graphics = Graphics.FromImage(writeArea.Image);

            // 清除图像及文字。
            clear();
        }
        public static async Task Main()
        {
            // Create the network
            INeuralNetwork network = NetworkManager.NewSequential(TensorInfo.Image <Alpha8>(28, 28),
                                                                  CuDnnNetworkLayers.Convolutional((5, 5), 20, ActivationType.Identity),
                                                                  CuDnnNetworkLayers.Pooling(ActivationType.LeakyReLU),
                                                                  CuDnnNetworkLayers.Convolutional((3, 3), 40, ActivationType.Identity),
                                                                  CuDnnNetworkLayers.Pooling(ActivationType.LeakyReLU),
                                                                  CuDnnNetworkLayers.FullyConnected(125, ActivationType.LeCunTanh),
                                                                  CuDnnNetworkLayers.Softmax(10));

            // Prepare the dataset
            ITrainingDataset trainingData = await Mnist.GetTrainingDatasetAsync(400); // Batches of 400 samples

            ITestDataset testData = await Mnist.GetTestDatasetAsync(p => Printf($"Epoch {p.Iteration}, cost: {p.Result.Cost}, accuracy: {p.Result.Accuracy}"));

            if (trainingData == null || testData == null)
            {
                Printf("Error downloading the datasets");
                Console.ReadKey();
                return;
            }

            // Setup and network training
            CancellationTokenSource cts = new CancellationTokenSource();

            Console.CancelKeyPress += (s, e) => cts.Cancel();
            TrainingSessionResult result = await NetworkManager.TrainNetworkAsync(network,
                                                                                  trainingData,
                                                                                  TrainingAlgorithms.AdaDelta(),
                                                                                  20, 0.5f,
                                                                                  TrackBatchProgress,
                                                                                  testDataset : testData, token : cts.Token);

            // Save the training reports
            string
                timestamp = DateTime.Now.ToString("yy-MM-dd-hh-mm-ss"),
                path      = Path.GetDirectoryName(Path.GetFullPath(Assembly.GetExecutingAssembly().Location)),
                dir       = Path.Combine(path ?? throw new InvalidOperationException("The dll path can't be null"), "TrainingResults", timestamp);

            Directory.CreateDirectory(dir);
            File.WriteAllText(Path.Combine(dir, $"{timestamp}_cost.py"), result.TestReports.AsPythonMatplotlibChart(TrainingReportType.Cost));
            File.WriteAllText(Path.Combine(dir, $"{timestamp}_accuracy.py"), result.TestReports.AsPythonMatplotlibChart(TrainingReportType.Accuracy));
            network.Save(new FileInfo(Path.Combine(dir, $"{timestamp}{NetworkLoader.NetworkFileExtension}")));
            File.WriteAllText(Path.Combine(dir, $"{timestamp}.json"), network.SerializeMetadataAsJson());
            File.WriteAllText(Path.Combine(dir, $"{timestamp}_report.json"), result.SerializeAsJson());
            Printf($"Stop reason: {result.StopReason}, elapsed time: {result.TrainingTime}");
            Console.ReadKey();
        }
Beispiel #12
0
        static void MNISTConvolutional(string dataFilesPath)
        {
            using (var lap = BrightWireGpuProvider.CreateLinearAlgebra()) {
                var graph = new GraphFactory(lap);

                Console.Write("Loading training data...");
                var trainingData = _BuildTensors(graph, null, Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte", dataFilesPath + "train-images.idx3-ubyte"));
                var testData     = _BuildTensors(graph, trainingData, Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte", dataFilesPath + "t10k-images.idx3-ubyte"));
                Console.WriteLine($"done - {trainingData.RowCount} training images and {testData.RowCount} test images loaded");

                var errorMetric = graph.ErrorMetric.OneHotEncoding;
                var propertySet = graph.CurrentPropertySet
                                  .Use(graph.GradientDescent.RmsProp)
                                  .Use(graph.WeightInitialisation.Xavier)
                ;

                // create the network
                const int   HIDDEN_LAYER_SIZE = 1024;
                const float LEARNING_RATE     = 0.05f;
                var         engine            = graph.CreateTrainingEngine(trainingData, LEARNING_RATE, 32);
                engine.LearningContext.ScheduleLearningRate(15, LEARNING_RATE / 3);
                graph.Connect(engine)
                .AddConvolutional(8, 2, 5, 5, 1, false)
                .Add(graph.ReluActivation())
                .AddDropOut(0.5f)
                .AddMaxPooling(2, 2, 2)
                .AddConvolutional(16, 2, 5, 5, 1)
                .Add(graph.ReluActivation())
                .AddMaxPooling(2, 2, 2)
                .Transpose()
                .AddFeedForward(HIDDEN_LAYER_SIZE)
                .Add(graph.ReluActivation())
                .AddDropOut(0.5f)
                .AddFeedForward(trainingData.OutputSize)
                .Add(graph.SoftMaxActivation())
                .AddBackpropagation(errorMetric)
                ;

                engine.Train(20, testData, errorMetric);

                // export the graph and verify that the error is the same
                var networkGraph    = engine.Graph;
                var executionEngine = graph.CreateEngine(networkGraph);
                var output          = executionEngine.Execute(testData);
                Console.WriteLine(output.Average(o => o.CalculateError(errorMetric)));
            }
        }
Beispiel #13
0
        public static DataSet CreateDataset(GraphFactory graph, string folderPath)
        {
            var trainLabelPath = Path.Combine(folderPath, "train-labels.idx1-ubyte");
            var trainDataPath  = Path.Combine(folderPath, "train-images.idx3-ubyte");
            var testLabelPath  = Path.Combine(folderPath, "t10k-labels.idx1-ubyte");
            var testDataPath   = Path.Combine(folderPath, "t10k-images.idx3-ubyte");
            var trainingData   = BuildTensors(graph, null, Mnist.Load(trainLabelPath, trainDataPath));
            var testData       = BuildTensors(graph, trainingData, Mnist.Load(testLabelPath, testDataPath));

            return(new DataSet()
            {
                TestData = testData,
                TrainData = trainingData,
                TrainingRowCount = trainingData.RowCount,
                TestRowCount = testData.RowCount
            });
        }
Beispiel #14
0
        static void Main(string[] args)
        {
            var separator = DirectorySeparatorChar.ToString();
            var mnistPath = $".{separator}mnist-fashion{separator}";
            var mnist     = new Mnist(mnistPath);
            var xor       = new XorDataSet();

            //var imagePath = $"{mnistPath}png{separator}";
            //mnist.OutputImages(imagePath);

            //Trainer.DefaultOptimizer = new AdaDelta();
            //Trainer.DefaultOptimizer = new RMSProp();
            //Trainer.DefaultOptimizer = new NAG();
            Trainer.DefaultOptimizer = new Adam();

            Network.Factory.New();
            Network.Factory.AddLayer(xor.InputDataSize, Identity);
            Network.Factory.AddLayer(100, ReLU);
            Network.Factory.AddConnection(He);
            Network.Factory.AddLayer(xor.OutputDataSize, Identity, false);
            Network.Factory.AddConnection(He);
            Network.Factory.SetErrorFunction(MeanSquared);
            Network.Factory.Create(out var network);

            Trainer.Training(network, xor, limitError: 1e-10f, printLog: true);
            Trainer.RegressionTest(network, xor);

            Network.Factory.New();
            Network.Factory.AddLayer(mnist.InputDataSize, Identity);
            Network.Factory.AddLayer(400, ReLU);
            Network.Factory.AddConnection(He);
            Network.Factory.AddLayer(100, ReLU);
            Network.Factory.AddConnection(He);
            Network.Factory.AddLayer(50, ReLU);
            Network.Factory.AddConnection(He);
            Network.Factory.AddLayer(10, ReLU);
            Network.Factory.AddConnection(He);
            Network.Factory.AddLayer(mnist.OutputDataSize, Softmax, false);
            Network.Factory.AddConnection(He);
            Network.Factory.SetErrorFunction(CrossEntropy);
            Network.Factory.Create(out network);

            //Trainer.PreTraining(network, mnist, epoch: 4, batchSize: 30, printLog: true);
            Trainer.Training(network, mnist, epoch: 5, batchSize: 50, printLog: true);
            Trainer.ClusteringTest(network, mnist);
        }
Beispiel #15
0
        static int Main(string[] args)
        {
            // get the config in the following order:
            //   file specified by the first command line argument
            //   "default.json"
            //   defaults
            Config conf;

            if (args.Length > 0)
            {
                if (File.Exists(args[0]))
                {
                    conf = Config.ReadFromJson(args[0]);
                }
                else
                {
                    return(-1);
                }
            }
            else if (File.Exists("default.json"))
            {
                conf = Config.ReadFromJson("default.json");
            }
            else
            {
                conf = new Config();
            }

            //conf.WriteToJson("default.json");
            // init logger
            Global.Logger = new Logger(true);
            Global.Logger.SetAppName(conf.Name());

            // print the config
            Global.Logger.WriteLine($"{Config.Sep}{Config.Sep}");
            Global.Logger.Write(conf.ToString());
            Global.Logger.WriteLine($"{Config.Sep}{Config.Sep}");

            // run the application
            var mnist = new Mnist(conf);

            mnist.Run();
            return(0);
        }
        public void MNISTTwoHiddenLayerNetworkGPUTest()
        {
            // Parameters
            var learningRate = 0.1f;
            var epochs       = 5;
            var numGPUs      = 4;

            var mnist = new Mnist();

            mnist.ReadDataSets("/tmp");
            int batchSize  = 400;
            int numBatches = mnist.TrainImages.Length / batchSize;

            using (var graph = new TFGraph())
            {
                var X = graph.Placeholder(TFDataType.Float, new TFShape(-1, 784));
                var Y = graph.Placeholder(TFDataType.Float, new TFShape(-1, 10));

                var Xs = graph.Split(graph.Const(0), X, numGPUs);
                var Ys = graph.Split(graph.Const(0), Y, numGPUs);

                var        sgd                   = new SGD(graph, learningRate, 0.9f);
                TFOutput[] costs                 = new TFOutput[numGPUs];
                TFOutput[] accuracys             = new TFOutput[numGPUs];
                var        variablesAndGradients = new Dictionary <Variable, List <TFOutput> >();
                for (int i = 0; i < numGPUs; i++)
                {
                    using (var device = graph.WithDevice("/GPU:" + i))
                    {
                        (costs[i], _, accuracys[i]) = CreateNetwork(graph, Xs[i], Ys[i], variablesAndGradients);
                        foreach (var gv in sgd.ComputeGradient(costs[i], colocateGradientsWithOps: true))
                        {
                            if (!variablesAndGradients.ContainsKey(gv.variable))
                            {
                                variablesAndGradients[gv.variable] = new List <TFOutput>();
                            }
                            variablesAndGradients[gv.variable].Add(gv.gradient);
                        }
                    }
                }
                var cost     = graph.ReduceMean(graph.Stack(costs));
                var accuracy = graph.ReduceMean(graph.Stack(accuracys));

                var gradientsAndVariables = new (TFOutput gradient, Variable variable)[variablesAndGradients.Count];
Beispiel #17
0
        /// <summary>
        /// Trains a feed forward neural net on the MNIST data set (handwritten digit recognition)
        /// The data files can be downloaded from http://yann.lecun.com/exdb/mnist/
        /// </summary>
        /// <param name="dataFilesPath">The path to a directory with the four extracted data files</param>
        public static void MNIST(string dataFilesPath)
        {
            using (var lap = BrightWireGpuProvider.CreateLinearAlgebra()) {
                var graph = new GraphFactory(lap);

                Console.Write("Loading training data...");
                var trainingData = _BuildVectors(null, graph, Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte", dataFilesPath + "train-images.idx3-ubyte"));
                var testData     = _BuildVectors(trainingData, graph, Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte", dataFilesPath + "t10k-images.idx3-ubyte"));
                Console.WriteLine($"done - {trainingData.RowCount} training images and {testData.RowCount} test images loaded");

                // one hot encoding uses the index of the output vector's maximum value as the classification label
                var errorMetric = graph.ErrorMetric.OneHotEncoding;

                // configure the network properties
                graph.CurrentPropertySet
                .Use(graph.GradientDescent.RmsProp)
                .Use(graph.WeightInitialisation.Xavier)
                ;

                // create the training engine and schedule a training rate change
                const float TRAINING_RATE = 0.1f;
                var         engine        = graph.CreateTrainingEngine(trainingData, TRAINING_RATE, 128);
                engine.LearningContext.ScheduleLearningRate(15, TRAINING_RATE / 3);

                // create the network
                graph.Connect(engine)
                .AddFeedForward(outputSize: 1024)
                .Add(graph.LeakyReluActivation())
                .AddDropOut(dropOutPercentage: 0.5f)
                .AddFeedForward(outputSize: trainingData.OutputSize)
                .Add(graph.SigmoidActivation())
                .AddBackpropagation(errorMetric)
                ;

                // train the network for twenty iterations, saving the model on each improvement
                Models.ExecutionGraph bestGraph = null;
                engine.Train(20, testData, errorMetric, model => bestGraph = model.Graph);

                // export the final model and execute it on the training set
                var executionEngine = graph.CreateEngine(bestGraph ?? engine.Graph);
                var output          = executionEngine.Execute(testData);
                Console.WriteLine($"Final accuracy: {output.Average(o => o.CalculateError(errorMetric)):P2}");
            }
        }
Beispiel #18
0
        /// <summary>
        /// Trains a neural net on the MNIST database (digit recognition)
        /// The data files can be downloaded from http://yann.lecun.com/exdb/mnist/
        /// </summary>
        /// <param name="dataFilesPath">The path to a directory with the four extracted data files</param>
        public static void MNIST(string dataFilesPath)
        {
            using (var lap = BrightWireGpuProvider.CreateLinearAlgebra()) {
                var graph = new GraphFactory(lap);

                Console.Write("Loading training data...");
                var trainingData = _BuildVectors(null, graph, Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte", dataFilesPath + "train-images.idx3-ubyte"));
                var testData     = _BuildVectors(trainingData, graph, Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte", dataFilesPath + "t10k-images.idx3-ubyte"));
                Console.WriteLine($"done - {trainingData.RowCount} training images and {testData.RowCount} test images loaded");

                // use a one hot encoding error metric, rmsprop gradient descent and xavier weight initialisation
                var errorMetric = graph.ErrorMetric.OneHotEncoding;
                var propertySet = graph.CurrentPropertySet
                                  //.Use(graph.Regularisation.L2)
                                  .Use(graph.GradientDescent.RmsProp)
                                  .Use(graph.WeightInitialisation.Xavier)
                ;

                // create the training engine and schedule a training rate change
                const float TRAINING_RATE = 0.1f;
                var         engine        = graph.CreateTrainingEngine(trainingData, TRAINING_RATE, 128);
                engine.LearningContext.ScheduleLearningRate(15, TRAINING_RATE / 3);

                // create the network
                graph.Connect(engine)
                .AddFeedForward(1024)
                .Add(graph.LeakyReluActivation())
                .AddDropOut(0.5f)
                .AddFeedForward(trainingData.OutputSize)
                .Add(graph.SigmoidActivation())
                .AddBackpropagation(errorMetric)
                ;

                // train the network
                engine.Train(20, testData, errorMetric);

                // export the graph and verify that the error is the same
                var networkGraph    = engine.Graph;
                var executionEngine = graph.CreateEngine(networkGraph);
                var output          = executionEngine.Execute(testData);
                Console.WriteLine(output.Average(o => o.CalculateError(errorMetric)));
            }
        }
Beispiel #19
0
        private void TextInfer(Bitmap img, Mnist model, int MnistImageSize)
        {
            Graphics gNormalized = Graphics.FromImage(img);

            gNormalized.DrawImage(img, 0, 0, MnistImageSize, MnistImageSize);

            var image = new List <float>(MnistImageSize * MnistImageSize);

            for (var x = 0; x < MnistImageSize; x++)
            {
                for (var y = 0; y < MnistImageSize; y++)
                {
                    var color = img.GetPixel(y, x);
                    image.Add((float)(0.5 - (color.R + color.G + color.B) / (3.0 * 255)));
                }
            }
            string str_temp = (model.Infer(new List <IEnumerable <float> > {
                image
            })).First().First().ToString();

            if (str_temp == "43")
            {
                str_temp = "+";
            }
            else if (str_temp == "42")
            {
                str_temp = "*";
            }
            else if (str_temp == "45")
            {
                str_temp = "-";
            }
            else if (str_temp == "47")
            {
                str_temp = "/";
            }
            DispText.Add(str_temp);
        }
Beispiel #20
0
        static void MNIST()
        {
            Console.WriteLine("Parsing data -------------------");
            List <Mnist> TrainingList = new List <Mnist>();
            StreamReader sw           = new StreamReader(@"E:\Music\training.txt");

            List <string> charstr = new List <string>();
            string        build   = "";
            int           index   = -1;
            int           label   = 0;

            double[] data = new double[28 * 28];
            while (!sw.EndOfStream)
            {
                int next = sw.Read() - 48;
                if (next == -4)
                {
                    if (index == -1)
                    {
                        label = Convert.ToInt32(build);
                        index++;
                    }
                    else
                    {
                        data[index] = Convert.ToInt32(build);
                        index++;
                    }

                    if (index == (28 * 28) - 1)
                    {
                        TrainingList.Add(new Mnist(data, label));
                        index = -1;
                        data  = new double[28 * 28];
                        build = "";
                        sw.Read();
                        sw.Read();
                    }

                    build = "";
                }
                else
                {
                    //check for line breaks & spaces
                    if (build.Contains(@"\"))
                    {
                        build = build.Remove(build.IndexOf(@"\"));
                    }
                    if (build.Contains(@"n"))
                    {
                        build = build.Remove(build.IndexOf(@"n"));
                    }
                    build += next;
                }
            }

            sw.Close();



            Random random = new Random();

            //choose random object
            for (int i = 0; i < 50; i++)
            {
                Mnist  mn = TrainingList[random.Next(0, TrainingList.Count - 1)];
                Bitmap bm = new Bitmap(28, 28);

                index = 0;
                for (int x = 0; x < 28; x++)
                {
                    for (int y = 0; y < 28; y++)
                    {
                        int bright = Convert.ToInt32(mn.Data[index]);
                        bm.SetPixel(y, x, Color.FromArgb(255, bright, bright, bright));
                        index++;
                    }
                }

                string filename = @"E:\Music\Imagetest" + i + " " + mn.Label + ".png";
                bm.Save(filename);
            }


            Console.WriteLine("Files output | press enter to continue");
            Console.ReadLine();



            var tempList = new List <Mnist>();
            int count2   = 0;

            foreach (Mnist nn in TrainingList)
            {
                tempList.Add(nn);
                if (count2 > 15000)
                {
                    break;
                }
                count2++;
            }

            TrainingList = tempList;

            int isn = 0;

            Console.WriteLine("Checking data -------------------");
            foreach (Mnist mn in TrainingList)
            {
                int value = Convert.ToInt32(mn.Label);
                if (value > 9 || value < 0)
                {
                    Console.WriteLine("error at {0}", isn);

                    Console.ReadLine();
                }
                isn++;
            }



            var LMM = new LMMCNet(28 * 28, 1, new int[] { 10 }, 10, new Random());

            Console.WriteLine("Training-------------------");
            int count = 0;
            int total = TrainingList.Count;

            foreach (Mnist mn in TrainingList)
            {
                count++;
                Console.WriteLine("Executing {0} of {1}", count, total);

                var ExpectedOut = new double[10];
                ExpectedOut[mn.Label] = 1;

                for (int i = 0; i <= mn.Data.GetUpperBound(0); i++)
                {
                    mn.Data[i] = mn.Data[i] / 255;
                }



                LMM.Train(mn.Data, ExpectedOut);
            }

            int totalSuccesses = 0;
            int totalGuesses   = 0;
            int secondGuesses  = 0;

            Console.WriteLine("Guessing -----------------------");
            foreach (Mnist mn in TrainingList)
            {
                totalGuesses++;
                Console.WriteLine("On guess {0}", totalGuesses);
                Console.WriteLine("{0} success from {1} guesses", totalSuccesses, totalGuesses);
                Console.WriteLine("{0} first successes and {1} second guesses", totalSuccesses, secondGuesses);

                var output = LMM.Predict(mn.Data);
                Hessian(LMM.Net);

                Console.WriteLine("-----------------");
                int    HighestIndex = 0;
                double HighestValue = 0;
                int    secondIndex  = 0;
                double secondValue  = 0;
                for (int i = 0; i <= output.GetUpperBound(0); i++)
                {
                    if (output[i] > HighestValue)
                    {
                        secondIndex  = HighestIndex;
                        secondValue  = HighestValue;
                        HighestIndex = i;
                        HighestValue = output[i];
                    }
                }

                Console.WriteLine("Array is");
                int coun = 0;
                foreach (double d in output)
                {
                    Console.WriteLine("{0} = {1}", coun, d);
                    coun++;
                }
                Console.WriteLine("");
                Console.WriteLine("Highest value is {0}", HighestValue);
                Console.WriteLine("Index of highest is {0}", HighestIndex);
                Console.WriteLine("Label is {0}", mn.Label);

                if (mn.Label == HighestIndex)
                {
                    Console.WriteLine("Is matching");
                }
                else if (mn.Label == secondIndex)
                {
                    secondGuesses++;
                }
                else
                {
                    Console.WriteLine("Is not matching");
                }



                if (HighestIndex == (mn.Label))
                {
                    totalSuccesses++;
                }
            }

            Console.WriteLine("{0} successes, {1} failures", totalSuccesses, totalGuesses - totalSuccesses);
            Console.ReadLine();
        }
Beispiel #21
0
        public static void ReducedMNIST(string dataFilesPath)
        {
            Console.Write("Loading training data...");
            var trainingData = Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte", dataFilesPath + "train-images.idx3-ubyte");
            var testData     = Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte", dataFilesPath + "t10k-images.idx3-ubyte");

            Console.WriteLine("done");

            var onesAndZeroesTraining = trainingData.Where(s => s.Label == 0 || s.Label == 1).Shuffle(0).Take(1000).ToList();
            var onesAndZeroesTest     = testData.Where(s => s.Label == 0 || s.Label == 1).Shuffle(0).Take(100).ToList();

            using (var lap = GPUProvider.CreateLinearAlgebra(false)) {
                var convolutionDescriptor = new ConvolutionDescriptor(0.1f)
                {
                    Stride               = 1,
                    Padding              = 1,
                    FilterDepth          = 4,
                    FilterHeight         = 3,
                    FilterWidth          = 3,
                    WeightInitialisation = WeightInitialisationType.Xavier,
                    WeightUpdate         = WeightUpdateType.RMSprop,
                    Activation           = ActivationType.LeakyRelu
                };

                const int   BATCH_SIZE = 128, NUM_EPOCHS = 2, IMAGE_WIDTH = 28;
                const float TRAINING_RATE = 0.03f;
                var         errorMetric   = ErrorMetricType.OneHot.Create();
                var         layerTemplate = new LayerDescriptor(0.1f)
                {
                    WeightUpdate = WeightUpdateType.RMSprop,
                    Activation   = ActivationType.LeakyRelu
                };

                var trainingSamples = onesAndZeroesTraining.Select(d => d.AsVolume).Select(d => Tuple.Create(d.AsTensor(lap), d.ExpectedOutput)).ToList();
                var testSamples     = onesAndZeroesTest.Select(d => d.AsVolume).Select(d => Tuple.Create(d.AsTensor(lap), d.ExpectedOutput)).ToList();

                // create a network with a single convolutional layer followed by a max pooling layer
                var convolutionalLayer = new IConvolutionalLayer [] {
                    lap.NN.CreateConvolutionalLayer(convolutionDescriptor, 1, IMAGE_WIDTH, false),
                    lap.NN.CreateMaxPoolingLayer(2, 2, 2)
                };
                var trainingDataProvider = lap.NN.CreateConvolutionalTrainingProvider(convolutionDescriptor, trainingSamples, convolutionalLayer, true);
                var testDataProvider     = lap.NN.CreateConvolutionalTrainingProvider(convolutionDescriptor, testSamples, convolutionalLayer, false);

                ConvolutionalNetwork network;
                using (var trainer = lap.NN.CreateBatchTrainer(layerTemplate, 784, trainingDataProvider.OutputSize)) {
                    var trainingContext = lap.NN.CreateTrainingContext(errorMetric, TRAINING_RATE, BATCH_SIZE);
                    trainingContext.EpochComplete += c => {
                        var output    = trainer.Execute(testDataProvider.TrainingDataProvider);
                        var testError = output.Select(d => errorMetric.Compute(d.Output, d.ExpectedOutput)).Average();
                        trainingContext.WriteScore(testError, errorMetric.DisplayAsPercentage);
                    };
                    trainer.Train(trainingDataProvider.TrainingDataProvider, NUM_EPOCHS, trainingContext);

                    network = trainingDataProvider.GetCurrentNetwork(trainer);
                }
                foreach (var layer in convolutionalLayer)
                {
                    layer.Dispose();
                }
                foreach (var item in trainingSamples)
                {
                    item.Item1.Dispose();
                }
                foreach (var item in testSamples)
                {
                    item.Item1.Dispose();
                }

                int correct = 0, total = 0;
                using (var execution = lap.NN.CreateConvolutional(network)) {
                    foreach (var item in onesAndZeroesTest)
                    {
                        using (var tensor = item.AsVolume.AsTensor(lap)) {
                            using (var output = execution.Execute(tensor)) {
                                var maxIndex = output.MaximumIndex();
                                if (maxIndex == item.Label)
                                {
                                    ++correct;
                                }
                                ++total;
                            }
                        }
                    }
                }
                Console.WriteLine($"Execution results: {(double)correct / total:P0} correct");
            }
        }
        public void MNISTTwoHiddenLayerNetworkTest()
        {
            // Parameters
            var learningRate = 0.1f;
            var epochs       = 5;


            var mnist = new Mnist();

            mnist.ReadDataSets("/tmp");
            int batchSize  = 100;
            int numBatches = mnist.TrainImages.Length / batchSize;

            using (var graph = new TFGraph())
            {
                var X = graph.Placeholder(TFDataType.Float, new TFShape(-1, 784));
                var Y = graph.Placeholder(TFDataType.Float, new TFShape(-1, 10));

                graph.Seed = 1;
                var initB  = (float)(4 * Math.Sqrt(6) / Math.Sqrt(784 + 500));
                var W1     = graph.Variable(graph.RandomUniform(new TFShape(784, 500), minval: -initB, maxval: initB), operName: "W1");
                var b1     = graph.Variable(graph.Constant(0f, new TFShape(500), TFDataType.Float), operName: "b1");
                var layer1 = graph.Sigmoid(graph.Add(graph.MatMul(X, W1.Read), b1.Read, operName: "layer1"));

                initB = (float)(4 * Math.Sqrt(6) / Math.Sqrt(500 + 100));
                var W2     = graph.Variable(graph.RandomUniform(new TFShape(500, 100), minval: -initB, maxval: initB), operName: "W2");
                var b2     = graph.Variable(graph.Constant(0f, new TFShape(100), TFDataType.Float), operName: "b2");
                var layer2 = graph.Sigmoid(graph.Add(graph.MatMul(layer1, W2.Read), b2.Read, operName: "layer2"));

                initB = (float)(4 * Math.Sqrt(6) / Math.Sqrt(100 + 10));
                var W3     = graph.Variable(graph.RandomUniform(new TFShape(100, 10), minval: -initB, maxval: initB), operName: "W3");
                var b3     = graph.Variable(graph.Constant(0f, new TFShape(10), TFDataType.Float), operName: "b3");
                var layer3 = graph.Add(graph.MatMul(layer2, W3.Read), b3.Read, operName: "layer3");

                // No support for computing gradient for the SparseSoftmaxCrossEntropyWithLogits function
                // instead using SoftmaxCrossEntropyWithLogits
                var cost = graph.ReduceMean(graph.SoftmaxCrossEntropyWithLogits(layer3, Y, "cost").loss);

                var prediction = graph.ArgMax(graph.Softmax(layer3), graph.Const(1));
                var labels     = graph.ArgMax(Y, graph.Const(1));
                var areCorrect = graph.Equal(prediction, labels);
                var accuracy   = graph.ReduceMean(graph.Cast(areCorrect, TFDataType.Float));

                var sgd       = new SGD(graph, learningRate, 0.9f);
                var updateOps = sgd.Minimize(cost);

                using (var sesssion = new TFSession(graph))
                {
                    sesssion.GetRunner().AddTarget(graph.GetGlobalVariablesInitializer()).Run();

                    var expectedLines = File.ReadAllLines(Path.Combine(_testDataPath, "SGDMnist", "expected.txt"));

                    for (int i = 0; i < epochs; i++)
                    {
                        var   reader      = mnist.GetTrainReader();
                        float avgLoss     = 0;
                        float avgAccuracy = 0;
                        for (int j = 0; j < numBatches; j++)
                        {
                            var batch   = reader.NextBatch(batchSize);
                            var tensors = sesssion.GetRunner()
                                          .AddInput(X, batch.Item1)
                                          .AddInput(Y, batch.Item2)
                                          .AddTarget(updateOps).Fetch(cost, accuracy, prediction, labels).Run();

                            avgLoss     += (float)tensors[0].GetValue();
                            avgAccuracy += (float)tensors[1].GetValue();
                        }
                        var output = $"Epoch: {i}, loss(Cross-Entropy): {avgLoss / numBatches:F4}, Accuracy:{avgAccuracy / numBatches:F4}";
                        Assert.Equal(expectedLines[i], output);
                    }
                }
            }
        }
Beispiel #23
0
        /// <summary>
        /// Trains a feed forward neural net on the MNIST data set (handwritten digit recognition)
        /// The data files can be downloaded from http://yann.lecun.com/exdb/mnist/
        /// </summary>
        /// <param name="dataFilesPath">The path to a directory with the four extracted data files</param>
        /// <param name="outputModelPath">Optional path to save the best model to</param>
        static void MNISTConvolutional(string dataFilesPath, string outputModelPath = null)
        {
            using var lap = BrightWireGpuProvider.CreateLinearAlgebra();
            var graph = new GraphFactory(lap);

            Console.Write("Loading training data...");
            var mnistTraining = Mnist.Load(dataFilesPath + "train-labels.idx1-ubyte",
                                           dataFilesPath + "train-images.idx3-ubyte");
            var mnistTest = Mnist.Load(dataFilesPath + "t10k-labels.idx1-ubyte",
                                       dataFilesPath + "t10k-images.idx3-ubyte");
            var trainingData =
                _BuildTensors(graph, null, mnistTraining /*.Where(d => d.Label < 2).ToList()*/);
            var testData = _BuildTensors(graph, trainingData,
                                         mnistTest /*.Where(d => d.Label < 2).ToList()*/);

            Console.WriteLine(
                $"done - {trainingData.RowCount} training images and {testData.RowCount} test images loaded");

            // one hot encoding uses the index of the output vector's maximum value as the classification label
            var errorMetric = graph.ErrorMetric.OneHotEncoding;

            // configure the network properties
            graph.CurrentPropertySet.Use(graph.GradientDescent.Adam).Use(
                graph.GaussianWeightInitialisation(false, 0.1f, GaussianVarianceCalibration.SquareRoot2N));

            // create the network
            const int   HIDDEN_LAYER_SIZE = 1024, TRAINING_ITERATIONS = 20;
            const float LEARNING_RATE = 0.05f;
            var         engine        = graph.CreateTrainingEngine(trainingData, LEARNING_RATE);

            if (!string.IsNullOrWhiteSpace(outputModelPath) && File.Exists(outputModelPath))
            {
                Console.WriteLine("Loading existing model from: " + outputModelPath);
                using var file = new FileStream(outputModelPath, FileMode.Open, FileAccess.Read);
                var model = Serializer.Deserialize <GraphModel>(file);
                engine = graph.CreateTrainingEngine(trainingData, model.Graph, LEARNING_RATE);
            }
            else
            {
                graph.Connect(engine).
                AddConvolutional(filterCount: 16, padding: 2, filterWidth: 5, filterHeight: 5, xStride: 1,
                                 yStride: 1, shouldBackpropagate: false).Add(graph.LeakyReluActivation()).
                AddMaxPooling(filterWidth: 2, filterHeight: 2, xStride: 2, yStride: 2).
                AddConvolutional(filterCount: 32, padding: 2, filterWidth: 5, filterHeight: 5, xStride: 1,
                                 yStride: 1).Add(graph.LeakyReluActivation()).
                AddMaxPooling(filterWidth: 2, filterHeight: 2, xStride: 2, yStride: 2).Transpose().
                AddFeedForward(HIDDEN_LAYER_SIZE).Add(graph.LeakyReluActivation()).
                AddDropOut(dropOutPercentage: 0.5f).AddFeedForward(trainingData.OutputSize).
                Add(graph.SoftMaxActivation()).AddBackpropagation(errorMetric);
            }

            // lower the learning rate over time
            engine.LearningContext.ScheduleLearningRate(15, LEARNING_RATE / 2);

            // train the network for twenty iterations, saving the model on each improvement
            Models.ExecutionGraph bestGraph = null;
            engine.Train(TRAINING_ITERATIONS, testData, errorMetric, model =>
            {
                bestGraph = model.Graph;
                if (!string.IsNullOrWhiteSpace(outputModelPath))
                {
                    using var file = new FileStream(outputModelPath, FileMode.Create, FileAccess.Write);
                    Serializer.Serialize(file, model);
                }
            });

            // export the final model and execute it on the training set
            var executionEngine = graph.CreateEngine(bestGraph ?? engine.Graph);
            var output          = executionEngine.Execute(testData);

            Console.WriteLine($"Final accuracy: {output.Average(o => o.CalculateError(errorMetric)):P2}");

            // execute the model with a single image
            var tensor     = mnistTest.First().AsFloatTensor.Tensor;
            var singleData = graph.CreateDataSource(new[] { tensor });
            var result     = executionEngine.Execute(singleData);
            var prediction = result.Single().Output.Single().MaximumIndex();
        }
Beispiel #24
0
        static void MNISTBinaryNet()
        {
            Console.WriteLine("Parsing data -------------------");
            List <Mnist> TrainingList = new List <Mnist>();
            StreamReader sw           = new StreamReader(@"E:\Music\training.txt");

            List <string> charstr = new List <string>();
            string        build   = "";
            int           index   = -1;
            int           label   = 0;

            double[] data = new double[28 * 28];
            while (!sw.EndOfStream)
            {
                int next = sw.Read() - 48;
                if (next == -4)
                {
                    if (index == -1)
                    {
                        label = Convert.ToInt32(build);
                        index++;
                    }
                    else
                    {
                        data[index] = Convert.ToInt32(build);
                        index++;
                    }

                    if (index == (28 * 28) - 1)
                    {
                        TrainingList.Add(new Mnist(data, label));
                        index = -1;
                        data  = new double[28 * 28];
                        build = "";
                        sw.Read();
                        sw.Read();
                    }

                    build = "";
                }
                else
                {
                    //check for line breaks & spaces
                    if (build.Contains(@"\"))
                    {
                        build = build.Remove(build.IndexOf(@"\"));
                    }
                    if (build.Contains(@"n"))
                    {
                        build = build.Remove(build.IndexOf(@"n"));
                    }
                    build += next;
                }
            }

            sw.Close();



            Random random = new Random();

            //choose random object
            for (int i = 0; i < 50; i++)
            {
                Mnist  mn  = TrainingList[random.Next(0, TrainingList.Count - 1)];
                Bitmap bm1 = new Bitmap(28, 28);

                index = 0;
                for (int x = 0; x < 28; x++)
                {
                    for (int y = 0; y < 28; y++)
                    {
                        int bright = Convert.ToInt32(mn.Data[index]);
                        bm1.SetPixel(y, x, Color.FromArgb(255, bright, bright, bright));
                        index++;
                    }
                }

                string filename = @"E:\Music\Imagetest" + i + " " + mn.Label + ".png";
                bm1.Save(filename);
            }


            Console.WriteLine("Files output | press enter to continue");
            //Console.ReadLine();



            var tempList = new List <Mnist>();
            int count2   = 0;

            foreach (Mnist nn in TrainingList)
            {
                tempList.Add(nn);
                if (count2 > 20000)
                {
                    break;
                }
                count2++;
            }

            TrainingList = tempList;

            int isn = 0;

            Console.WriteLine("Checking data -------------------");
            foreach (Mnist mn in TrainingList)
            {
                int value = Convert.ToInt32(mn.Label);
                if (value > 9 || value < 0)
                {
                    Console.WriteLine("error at {0}", isn);

                    Console.ReadLine();
                }
                isn++;
            }


            var fac = new BinaryNetFactory(new double[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, 28 * 28, new int[] { 10 }, new Random());


            Console.WriteLine("Training-------------------");
            int count = 0;
            int total = TrainingList.Count;

            foreach (Mnist mn in TrainingList)
            {
                count++;
                Console.WriteLine("Executing {0} of {1}", count, total);

                var ExpectedOut = new double[10];
                ExpectedOut[mn.Label] = 1;

                for (int i = 0; i <= mn.Data.GetUpperBound(0); i++)
                {
                    mn.Data[i] = mn.Data[i] / 255;
                }



                fac.Train(mn.Data, mn.Label);
            }

            //load chris' handwriting
            Bitmap bm = new Bitmap(@"E:\music\ChrisWriting.png");

            double[] dataArray = new double[28 * 28];
            int      dataIndex = 0;

            for (int x = 0; x < 28; x++)
            {
                for (int y = 0; y < 28; y++)
                {
                    dataArray[dataIndex] = bm.GetPixel(x, y).GetBrightness() != 0 ? bm.GetPixel(x, y).GetBrightness() : 0;
                    dataIndex++;
                }
            }


            var result = fac.Predict(dataArray);

            Console.WriteLine("Result of Chris' handwriting is {0}", result[0]);
            Console.ReadLine();

            int totalSuccesses = 0;
            int totalGuesses   = 0;
            int secondGuesses  = 0;

            Console.WriteLine("Guessing -----------------------");
            foreach (Mnist mn in TrainingList)
            {
                totalGuesses++;
                Console.WriteLine("On guess {0}", totalGuesses);
                Console.WriteLine("{0} success from {1} guesses", totalSuccesses, totalGuesses);
                Console.WriteLine("{0} first successes and {1} second guesses", totalSuccesses, secondGuesses);

                var output = fac.Predict(mn.Data);

                Console.WriteLine("-----------------");


                if (mn.Label == output[0])
                {
                    Console.WriteLine("Is matching");
                    totalSuccesses++;
                }

                else
                {
                    Console.WriteLine("Is not matching");
                }
            }

            Console.WriteLine("{0} successes, {1} failures", totalSuccesses, totalGuesses - totalSuccesses);
            Console.ReadLine();
        }