コード例 #1
0
        static void Main(string[] args)
        {
            string dirPath = "C:/Users/jacopo/Dropbox/Chalmers/MSc thesis";

            /*****************************************************
             * (0) Setup OpenCL
             ****************************************************/
            Console.WriteLine("\n=========================================");
            Console.WriteLine("    OpenCL setup");
            Console.WriteLine("=========================================\n");

            OpenCLSpace.SetupSpace(4);
            OpenCLSpace.KernelsPath = dirPath + "/ConvDotNet/Kernels";
            OpenCLSpace.LoadKernels();


            /*****************************************************
             * (1) Load data
             ******************************************************/

            Console.WriteLine("\n=========================================");
            Console.WriteLine("    Importing data");
            Console.WriteLine("=========================================\n");


            // GTSRB greyscale test set 1
            DataSet testSetGS1         = new DataSet(43);
            string  GTSRBtestDataGS1   = dirPath + "/GTSRB/Preprocessed/14_test_images.dat";
            string  GTSRBtestLabelsGS1 = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

            Console.WriteLine("Importing test set (grayscale 1)...");
            testSetGS1.ReadData(GTSRBtestDataGS1, GTSRBtestLabelsGS1);

            /*
             * // GTSRB greyscale test set 2
             * DataSet testSetGS2 = new DataSet(43);
             * string GTSRBtestDataGS2 = dirPath + "/GTSRB/Preprocessed/18_test_images.dat";
             * string GTSRBtestLabelsGS2 = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";
             * Console.WriteLine("Importing test set (grayscale 2)...");
             * testSetGS2.ReadData(GTSRBtestDataGS2);
             * testSetGS2.ReadLabels(GTSRBtestLabelsGS2);
             */

            // GTSRB RGB test set 1
            DataSet testSetRGB1         = new DataSet(43);
            string  GTSRBtestDataRGB1   = dirPath + "/GTSRB/Preprocessed/16_test_images.dat";
            string  GTSRBtestLabelsRGB1 = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

            Console.WriteLine("Importing test set (RGB 1)...");
            testSetRGB1.ReadData(GTSRBtestDataRGB1, GTSRBtestLabelsRGB1);

            /*
             * // GTSRB RGB test set 2
             * DataSet testSetRGB2 = new DataSet(43);
             * string GTSRBtestDataRGB2 = dirPath + "/GTSRB/Preprocessed/20_test_images.dat";
             * string GTSRBtestLabelsRGB2 = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";
             * Console.WriteLine("Importing test set (RGB 2)...");
             * testSetRGB2.ReadData(GTSRBtestDataRGB2);
             * testSetRGB2.ReadLabels(GTSRBtestLabelsRGB2);
             */

            /*****************************************************
            * (2) Evaluate ensemble of networks
            *****************************************************/

            List <NeuralNetwork> networkEnsemble = new List <NeuralNetwork>();

            networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "FIXED_LeNet_GS_DropoutFC"));
            networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "FIXED_LeNet_RGB_DropoutFC"));
            //networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "LeNet_GSb_DropoutFC"));
            //networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "LeNet_RGBb_Dropout"));
            networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "FIXED_VGGv2_GS_DropoutFC"));
            networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "FIXED_VGGv2_RGB_DropoutFC"));
            //networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "VGG_GSb_DropoutFC"));
            //networkEnsemble.Add(Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "VGG_RGBb_Dropout"));

            double error = 0.0;

            Console.WriteLine("\nEvaluating an ensemble of {0} networks...", networkEnsemble.Count);
            NetworkEvaluator.EvaluateEnsemble(networkEnsemble, testSetGS1, testSetRGB1, 64, out error);
            Console.WriteLine("\n\tTest set error = {0}\n\tAccuracy = {1}", error, 100 * (1 - error));
        }
コード例 #2
0
        static void Main(string[] args)
        {
            /*****************************************************
             * (0) Setup OpenCL
             ****************************************************/
            Console.WriteLine("\n=========================================");
            Console.WriteLine("    OpenCL setup");
            Console.WriteLine("=========================================\n");

            OpenCLSpace.SetupSpace(4);
            OpenCLSpace.KernelsPath = "../../../Kernels";
            OpenCLSpace.LoadKernels();

            /*****************************************************
             * (2) Load data
             ****************************************************/
            Console.WriteLine("\n=========================================");
            Console.WriteLine("    Importing data");
            Console.WriteLine("=========================================\n");


            // GTSRB training set
            string GTSRBtrainingDataGS   = "../../../../GTSRB/Preprocessed/14_training_images.dat";
            string GTSRBtrainingLabelsGS = "../../../../GTSRB/Preprocessed/14_training_classes.dat";


            // GTSRB validation set (grayscale)

            string GTSRBvalidationDataGS   = "../../../../GTSRB/Preprocessed/14_validation_images.dat";
            string GTSRBvalidationLabelsGS = "../../../../GTSRB/Preprocessed/14_validation_classes.dat";


            // GTSRB test set (grayscale)
            string GTSRBtestDataGS   = "../../../../GTSRB/Preprocessed/14_test_images.dat";
            string GTSRBtestLabelsGS = "../../../../GTSRB/Preprocessed/test_labels_full.dat";


            Console.WriteLine("Importing training set...");
            DataSet trainingSet = new DataSet(43);

            trainingSet.ReadData(GTSRBtrainingDataGS, GTSRBtrainingLabelsGS);

            Console.WriteLine("Importing validation set...");
            DataSet validationSet = new DataSet(43);

            validationSet.ReadData(GTSRBvalidationDataGS, GTSRBvalidationLabelsGS);

            Console.WriteLine("Importing test set...");
            DataSet testSet = new DataSet(43);

            testSet.ReadData(GTSRBtestDataGS, GTSRBtestLabelsGS);

            /*****************************************************
             * (1) Instantiate a neural network and add layers
             *
             * OPTIONS:
             * ConvolutionalLayer(filterSize, numberOfFilters, strideLength, zeroPadding)
             * FullyConnectedLayer(numberOfUnits)
             * MaxPooling(2, 2)
             * ReLU()
             * ELU(alpha)
             * SoftMax()
             ****************************************************/

            double[] eta = { 1e-2, 3e-3, 1e-3, 3e-4, 1e-4, 3e-5, 1e-5, 3e-6, 1e-6, 3e-7, 1e-7 };
            for (int iEta = 0; iEta < eta.Length; iEta++)
            {
                Console.WriteLine("\n\n\n New learning rate = {0}", eta[iEta]);

                Console.WriteLine("\n=========================================");
                Console.WriteLine("    Neural network creation");
                Console.WriteLine("=========================================\n");

                // OPTION 1: Create a new network

                NeuralNetwork network = new NeuralNetwork("EtaTest_VGG_ReLU");

                network.AddLayer(new InputLayer(1, 32, 32));

                network.AddLayer(new ConvolutionalLayer(3, 32, 1, 1));
                network.AddLayer(new ReLU());

                network.AddLayer(new ConvolutionalLayer(3, 32, 1, 1));
                network.AddLayer(new ReLU());

                network.AddLayer(new MaxPooling(2, 2));

                network.AddLayer(new ConvolutionalLayer(3, 64, 1, 1));
                network.AddLayer(new ReLU());

                network.AddLayer(new ConvolutionalLayer(3, 64, 1, 1));
                network.AddLayer(new ReLU());

                network.AddLayer(new MaxPooling(2, 2));

                network.AddLayer(new ConvolutionalLayer(3, 128, 1, 1));
                network.AddLayer(new ReLU());

                network.AddLayer(new ConvolutionalLayer(3, 128, 1, 1));
                network.AddLayer(new ReLU());

                network.AddLayer(new MaxPooling(2, 2));

                network.AddLayer(new FullyConnectedLayer(128));
                network.AddLayer(new ReLU());

                network.AddLayer(new FullyConnectedLayer(128));
                network.AddLayer(new ReLU());

                network.AddLayer(new FullyConnectedLayer(43));
                network.AddLayer(new SoftMax());

                NetworkTrainer.TrainingMode = "new";


                /*****************************************************
                 * (4) Train network
                 ******************************************************/
                Console.WriteLine("\n=========================================");
                Console.WriteLine("    Network training");
                Console.WriteLine("=========================================\n");

                // Set output files save paths
                string trainingSavePath = "../../../../Results/LossError/";
                NetworkTrainer.TrainingEpochSavePath   = trainingSavePath + network.Name + "_trainingEpochs.txt";
                NetworkTrainer.ValidationEpochSavePath = trainingSavePath + network.Name + "_validationEpochs.txt";
                NetworkTrainer.NetworkOutputFilePath   = "../../../../Results/Networks/";

                NetworkTrainer.MomentumMultiplier         = 0.9;
                NetworkTrainer.WeightDecayCoeff           = 0.000;
                NetworkTrainer.MaxTrainingEpochs          = 1;
                NetworkTrainer.EpochsBeforeRegularization = 0;
                NetworkTrainer.MiniBatchSize          = 64;
                NetworkTrainer.ConsoleOutputLag       = 1; // 1 = print every epoch, N = print every N epochs
                NetworkTrainer.EvaluateBeforeTraining = true;
                NetworkTrainer.DropoutFullyConnected  = 1.0;
                NetworkTrainer.DropoutConvolutional   = 1.0;
                NetworkTrainer.DropoutInput           = 1.0;
                NetworkTrainer.Patience = 1000;
                NetworkTrainer.LearningRateDecayFactor  = Math.Sqrt(10.0);
                NetworkTrainer.MaxConsecutiveAnnealings = 3;
                NetworkTrainer.WeightMaxNorm            = Double.PositiveInfinity;

                NetworkTrainer.LearningRate = eta[iEta];
                NetworkTrainer.Train(network, trainingSet, null);

                network = null;
                GC.Collect();
            }



            // VGG_ELU ____________________________________________________________________________________________________

            for (int iEta = 0; iEta < eta.Length; iEta++)
            {
                Console.WriteLine("\n\n\n New learning rate = {0}", eta[iEta]);



                Console.WriteLine("\n=========================================");
                Console.WriteLine("    Neural network creation");
                Console.WriteLine("=========================================\n");

                // OPTION 1: Create a new network

                NeuralNetwork network = new NeuralNetwork("EtaTest_VGG_ELU");

                network.AddLayer(new InputLayer(1, 32, 32));

                network.AddLayer(new ConvolutionalLayer(3, 32, 1, 1));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new ConvolutionalLayer(3, 32, 1, 1));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new MaxPooling(2, 2));

                network.AddLayer(new ConvolutionalLayer(3, 64, 1, 1));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new ConvolutionalLayer(3, 64, 1, 1));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new MaxPooling(2, 2));

                network.AddLayer(new ConvolutionalLayer(3, 128, 1, 1));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new ConvolutionalLayer(3, 128, 1, 1));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new MaxPooling(2, 2));

                network.AddLayer(new FullyConnectedLayer(128));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new FullyConnectedLayer(128));
                network.AddLayer(new ELU(1.0f));

                network.AddLayer(new FullyConnectedLayer(43));
                network.AddLayer(new SoftMax());

                NetworkTrainer.TrainingMode = "new";


                /*****************************************************
                 * (3) Gradient check
                 ****************\*********************************
                 * GradientChecker.Check(network, validationSet);
                 *
                 *
                 *
                 *
                 *
                 * /*****************************************************
                 * (4) Train network
                 *****************************************************
                 *
                 * Console.WriteLine("\n=========================================");
                 * Console.WriteLine("    Network training");
                 * Console.WriteLine("=========================================\n");
                 *
                 * // Set output files save paths
                 * string trainingSavePath = "../../../../Results/LossError/";
                 * NetworkTrainer.TrainingEpochSavePath = trainingSavePath + network.Name + "_trainingEpochs.txt";
                 * NetworkTrainer.ValidationEpochSavePath = trainingSavePath + network.Name + "_validationEpochs.txt";
                 * NetworkTrainer.NetworkOutputFilePath = "../../../../Results/Networks/";
                 *
                 * NetworkTrainer.MomentumMultiplier = 0.9;
                 * NetworkTrainer.WeightDecayCoeff = 0.0;
                 * NetworkTrainer.MaxTrainingEpochs = 1;
                 * NetworkTrainer.EpochsBeforeRegularization = 0;
                 * NetworkTrainer.MiniBatchSize = 64;
                 * NetworkTrainer.ConsoleOutputLag = 1; // 1 = print every epoch, N = print every N epochs
                 * NetworkTrainer.EvaluateBeforeTraining = true;
                 * NetworkTrainer.DropoutFullyConnected = 1.0;
                 * NetworkTrainer.DropoutConvolutional = 1.0;
                 * NetworkTrainer.Patience = 20;
                 *
                 * NetworkTrainer.LearningRate = eta[iEta];
                 * NetworkTrainer.Train(network, trainingSet, null);
                 * }
                 *
                 *
                 *
                 */
                // RESNET_RELU ____________________________________________________________________________________________________

                /*
                 * for (int iEta = 0; iEta < eta.Length; iEta++)
                 * {
                 *  Console.WriteLine("\n\n\n New learning rate = {0}", eta[iEta]);
                 *
                 *
                 *
                 *  Console.WriteLine("\n=========================================");
                 *  Console.WriteLine("    Neural network creation");
                 *  Console.WriteLine("=========================================\n");
                 *
                 *  // OPTION 1: Create a new network
                 *
                 *  NeuralNetwork network = new NeuralNetwork("EtaTest_ResNet_ReLU");
                 *
                 *  network.AddLayer(new InputLayer(1, 32, 32));
                 *
                 *  network.AddLayer(new ConvolutionalLayer(3, 32, 1, 1));
                 *  network.AddLayer(new ReLU());
                 *
                 *  network.AddLayer(new ResidualModule(3, 32, 1, 1, "ReLU"));
                 *  network.AddLayer(new ReLU());
                 *
                 *  network.AddLayer(new ConvolutionalLayer(3, 64, 2, 1)); // downsampling
                 *
                 *  network.AddLayer(new ResidualModule(3, 64, 1, 1, "ReLU"));
                 *  network.AddLayer(new ReLU());
                 *
                 *  network.AddLayer(new ConvolutionalLayer(3, 128, 2, 1)); // downsampling
                 *
                 *  network.AddLayer(new ResidualModule(3, 128, 1, 1, "ReLU"));
                 *  network.AddLayer(new ReLU());
                 *
                 *  network.AddLayer(new AveragePooling());
                 *
                 *  network.AddLayer(new FullyConnectedLayer(43));
                 *  network.AddLayer(new SoftMax());
                 *
                 *  NetworkTrainer.TrainingMode = "new";
                 *
                 *
                 *  /*****************************************************
                 * (3) Gradient check
                 ****************\*********************************
                 *  GradientChecker.Check(network, validationSet);
                 *
                 *
                 *
                 *
                 *
                 *  /*****************************************************
                 * (4) Train network
                 *****************************************************/
                /*
                 *      Console.WriteLine("\n=========================================");
                 *      Console.WriteLine("    Network training");
                 *      Console.WriteLine("=========================================\n");
                 *
                 *      // Set output files save paths
                 *      string trainingSavePath = "../../../../Results/LossError/";
                 *      NetworkTrainer.TrainingEpochSavePath = trainingSavePath + network.Name + "_trainingEpochs.txt";
                 *      NetworkTrainer.ValidationEpochSavePath = trainingSavePath + network.Name + "_validationEpochs.txt";
                 *      NetworkTrainer.NetworkOutputFilePath = "../../../../Results/Networks/";
                 *
                 *      NetworkTrainer.MomentumMultiplier = 0.9;
                 *      NetworkTrainer.WeightDecayCoeff = 0.0;
                 *      NetworkTrainer.MaxTrainingEpochs = 1;
                 *      NetworkTrainer.EpochsBeforeRegularization = 0;
                 *      NetworkTrainer.MiniBatchSize = 64;
                 *      NetworkTrainer.ConsoleOutputLag = 1; // 1 = print every epoch, N = print every N epochs
                 *      NetworkTrainer.EvaluateBeforeTraining = true;
                 *      NetworkTrainer.DropoutFullyConnected = 1.0;
                 *      NetworkTrainer.DropoutConvolutional = 1.0;
                 *      NetworkTrainer.Patience = 20;
                 *
                 *      NetworkTrainer.LearningRate = eta[iEta];
                 *      NetworkTrainer.Train(network, trainingSet, null);
                 *  }
                 *
                 */

                // RESNET_ELU ____________________________________________________________________________________________________

                /*
                 *  for (int iEta = 0; iEta < eta.Length; iEta++)
                 *  {
                 *      Console.WriteLine("\n\n\n New learning rate = {0}", eta[iEta]);
                 *
                 *
                 *
                 *      Console.WriteLine("\n=========================================");
                 *      Console.WriteLine("    Neural network creation");
                 *      Console.WriteLine("=========================================\n");
                 *
                 *      // OPTION 1: Create a new network
                 *
                 *
                 *      NeuralNetwork network = new NeuralNetwork("EtaTest_ResNet_ReLU");
                 *
                 *      network.AddLayer(new InputLayer(1, 32, 32));
                 *
                 *      network.AddLayer(new ConvolutionalLayer(3, 32, 1, 1));
                 *      network.AddLayer(new ELU(1.0f));
                 *
                 *      network.AddLayer(new ResidualModule(3, 32, 1, 1, "ELU"));
                 *      network.AddLayer(new ELU(1.0f));
                 *
                 *      network.AddLayer(new ConvolutionalLayer(3, 64, 2, 1)); // downsampling
                 *
                 *      network.AddLayer(new ResidualModule(3, 64, 1, 1, "ELU"));
                 *      network.AddLayer(new ELU(1.0f));
                 *
                 *      network.AddLayer(new ConvolutionalLayer(3, 128, 2, 1)); // downsampling
                 *
                 *      network.AddLayer(new ResidualModule(3, 128, 1, 1, "ELU"));
                 *      network.AddLayer(new ELU(1.0f));
                 *
                 *      network.AddLayer(new AveragePooling());
                 *
                 *      network.AddLayer(new FullyConnectedLayer(43));
                 *      network.AddLayer(new SoftMax());
                 *
                 *      NetworkTrainer.TrainingMode = "new";
                 *
                 *      /*****************************************************
                 * (3) Gradient check
                 ****************\*********************************
                 *      GradientChecker.Check(network, validationSet);
                 *
                 *
                 *
                 *
                 *
                 *      /*****************************************************
                 * (4) Train network
                 *****************************************************
                 *
                 *
                 *      Console.WriteLine("\n=========================================");
                 *      Console.WriteLine("    Network training");
                 *      Console.WriteLine("=========================================\n");
                 *
                 *      // Set output files save paths
                 *      string trainingSavePath = "../../../../Results/LossError/";
                 *      NetworkTrainer.TrainingEpochSavePath = trainingSavePath + network.Name + "_trainingEpochs.txt";
                 *      NetworkTrainer.ValidationEpochSavePath = trainingSavePath + network.Name + "_validationEpochs.txt";
                 *      NetworkTrainer.NetworkOutputFilePath = "../../../../Results/Networks/";
                 *
                 *      NetworkTrainer.MomentumMultiplier = 0.9;
                 *      NetworkTrainer.WeightDecayCoeff = 0.0;
                 *      NetworkTrainer.MaxTrainingEpochs = 1;
                 *      NetworkTrainer.EpochsBeforeRegularization = 0;
                 *      NetworkTrainer.MiniBatchSize = 64;
                 *      NetworkTrainer.ConsoleOutputLag = 1; // 1 = print every epoch, N = print every N epochs
                 *      NetworkTrainer.EvaluateBeforeTraining = true;
                 *      NetworkTrainer.DropoutFullyConnected = 1.0;
                 *      NetworkTrainer.DropoutConvolutional = 1.0;
                 *      NetworkTrainer.Patience = 20;
                 *
                 *      NetworkTrainer.LearningRate = eta[iEta];
                 *      NetworkTrainer.Train(network, trainingSet, null);
                 *  }
                 *
                 *
                 *
                 *
                 * /*****************************************************
                 * (5) Test network
                 *****************************************************
                 * Console.WriteLine("\nFINAL EVALUATION:");
                 *
                 *
                 * // Load best network from file
                 * NeuralNetwork bestNetwork = Utils.LoadNetworkFromFile("../../../../Results/Networks/", network.Name);
                 * bestNetwork.Set("MiniBatchSize", 64); // this SHOULDN'T matter!
                 * bestNetwork.InitializeParameters("load");
                 * bestNetwork.Set("Inference", true);
                 *
                 * double loss;
                 * double error;
                 *
                 * // Pre-inference pass: Computes cumulative averages in BatchNorm layers (needed for evaluation)
                 * //bestNetwork.Set("PreInference", true);
                 * //networkEvaluator.PreEvaluateNetwork(bestNetwork, testSet);
                 *
                 *
                 *
                 * //networkEvaluator.EvaluateNetwork(bestNetwork, trainingSet, out loss, out error);
                 * //Console.WriteLine("\nTraining set:\n\tLoss = {0}\n\tError = {1}", loss, error);
                 *
                 * NetworkEvaluator.EvaluateNetwork(bestNetwork, validationSet, out loss, out error);
                 * Console.WriteLine("\nValidation set:\n\tLoss = {0}\n\tError = {1}", loss, error);
                 *
                 * NetworkEvaluator.EvaluateNetwork(bestNetwork, testSet, out loss, out error);
                 * Console.WriteLine("\nTest set:\n\tLoss = {0}\n\tError = {1}", loss, error);
                 *
                 * // Save misclassified examples
                 * //NetworkEvaluator.SaveMisclassifiedExamples(bestNetwork, trainingSet, "../../../../Results/MisclassifiedExamples/" + network.Name + "_training.txt");
                 * //NetworkEvaluator.SaveMisclassifiedExamples(bestNetwork, validationSet, "../../../../Results/MisclassifiedExamples/" + network.Name + "_validation.txt");
                 * //NetworkEvaluator.SaveMisclassifiedExamples(bestNetwork, testSet, "../../../../Results/MisclassifiedExamples/" + network.Name + "_test.txt");
                 *
                 * // Save filters of first conv layer
                 * if (bestNetwork.Layers[1].Type == "Convolutional")
                 *  Utils.SaveFilters(bestNetwork, "../../../../Results/Filters/" + network.Name + "_filters.txt");
                 *
                 * /*****************************************************/
            }
        }
コード例 #3
0
        static void Main(string[] args)
        {
            string dirPath = "C:/Users/jacopo/Dropbox/Chalmers/MSc thesis";

            /*****************************************************
             * (0) Setup OpenCL
             ****************************************************/
            Console.WriteLine("\n=========================================");
            Console.WriteLine("    OpenCL setup");
            Console.WriteLine("=========================================\n");

            OpenCLSpace.SetupSpace(4);
            OpenCLSpace.KernelsPath = dirPath + "/ConvDotNet/Kernels";
            OpenCLSpace.LoadKernels();


            /*****************************************************
             * (1) Load data
             ******************************************************/

            string imageColor = "none";

            #region DataImport

            Console.WriteLine("\n=========================================");
            Console.WriteLine("    Importing data");
            Console.WriteLine("=========================================\n");

            DataSet trainingSet   = new DataSet(43);
            DataSet validationSet = new DataSet(43);
            DataSet testSet       = new DataSet(43);

            if (imageColor == "GS1")
            {
                // GTSRB training set (grayscale)
                string GTSRBtrainingDataGS   = dirPath + "/GTSRB/Preprocessed/14_training_images.dat";
                string GTSRBtrainingLabelsGS = dirPath + "/GTSRB/Preprocessed/14_training_classes.dat";


                // GTSRB validation set (grayscale)
                string GTSRBvalidationDataGS   = dirPath + "/GTSRB/Preprocessed/14_validation_images.dat";
                string GTSRBvalidationLabelsGS = dirPath + "/GTSRB/Preprocessed/14_validation_classes.dat";


                // GTSRB test set (grayscale)
                string GTSRBtestDataGS   = dirPath + "/GTSRB/Preprocessed/14_test_images.dat";
                string GTSRBtestLabelsGS = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

                Console.WriteLine("Importing training set...");
                trainingSet.ReadData(GTSRBtrainingDataGS, GTSRBtrainingLabelsGS);

                Console.WriteLine("Importing validation set...");
                validationSet.ReadData(GTSRBvalidationDataGS, GTSRBvalidationLabelsGS);

                Console.WriteLine("Importing test set...");
                testSet.ReadData(GTSRBtestDataGS, GTSRBtestLabelsGS);
            }
            else if (imageColor == "GS2")
            {
                // GTSRB training set (RGB)
                string GTSRBtrainingDataRGB   = dirPath + "/GTSRB/Preprocessed/18_training_images.dat";
                string GTSRBtrainingLabelsRGB = dirPath + "/GTSRB/Preprocessed/18_training_classes.dat";


                // GTSRB validation set (RGB)
                string GTSRBvalidationDataRGB   = dirPath + "/GTSRB/Preprocessed/18_validation_images.dat";
                string GTSRBvalidationLabelsRGB = dirPath + "/GTSRB/Preprocessed/18_validation_classes.dat";


                // GTSRB test set (RGB)
                string GTSRBtestDataRGB   = dirPath + "/GTSRB/Preprocessed/18_test_images.dat";
                string GTSRBtestLabelsRGB = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

                Console.WriteLine("Importing training set...");
                trainingSet.ReadData(GTSRBtrainingDataRGB);
                trainingSet.ReadLabels(GTSRBtrainingLabelsRGB);


                Console.WriteLine("Importing validation set...");
                validationSet.ReadData(GTSRBvalidationDataRGB);
                validationSet.ReadLabels(GTSRBvalidationLabelsRGB);


                Console.WriteLine("Importing test set...");
                testSet.ReadData(GTSRBtestDataRGB);
                testSet.ReadLabels(GTSRBtestLabelsRGB);
            }
            else if (imageColor == "RGB1")
            {
                // GTSRB training set (RGB)
                string GTSRBtrainingDataRGB   = dirPath + "/GTSRB/Preprocessed/16_training_images.dat";
                string GTSRBtrainingLabelsRGB = dirPath + "/GTSRB/Preprocessed/16_training_classes.dat";


                // GTSRB validation set (RGB)
                string GTSRBvalidationDataRGB   = dirPath + "/GTSRB/Preprocessed/16_validation_images.dat";
                string GTSRBvalidationLabelsRGB = dirPath + "/GTSRB/Preprocessed/16_validation_classes.dat";


                // GTSRB test set (RGB)
                string GTSRBtestDataRGB   = dirPath + "/GTSRB/Preprocessed/16_test_images.dat";
                string GTSRBtestLabelsRGB = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

                Console.WriteLine("Importing training set...");
                trainingSet.ReadData(GTSRBtrainingDataRGB, GTSRBtrainingLabelsRGB);

                Console.WriteLine("Importing validation set...");
                validationSet.ReadData(GTSRBvalidationDataRGB, GTSRBvalidationLabelsRGB);

                Console.WriteLine("Importing test set...");
                testSet.ReadData(GTSRBtestDataRGB, GTSRBtestLabelsRGB);
            }
            else if (imageColor == "RGB2")
            {
                // GTSRB training set (RGB)
                string GTSRBtrainingDataRGB   = dirPath + "/GTSRB/Preprocessed/20_training_images.dat";
                string GTSRBtrainingLabelsRGB = dirPath + "/GTSRB/Preprocessed/20_training_classes.dat";


                // GTSRB validation set (RGB)
                string GTSRBvalidationDataRGB   = dirPath + "/GTSRB/Preprocessed/20_validation_images.dat";
                string GTSRBvalidationLabelsRGB = dirPath + "/GTSRB/Preprocessed/20_validation_classes.dat";


                // GTSRB test set (RGB)
                string GTSRBtestDataRGB   = dirPath + "/GTSRB/Preprocessed/20_test_images.dat";
                string GTSRBtestLabelsRGB = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

                Console.WriteLine("Importing training set...");
                trainingSet.ReadData(GTSRBtrainingDataRGB, GTSRBtrainingLabelsRGB);

                Console.WriteLine("Importing validation set...");
                validationSet.ReadData(GTSRBvalidationDataRGB, GTSRBvalidationLabelsRGB);

                Console.WriteLine("Importing test set...");
                testSet.ReadData(GTSRBtestDataRGB, GTSRBtestLabelsRGB);
            }
            else if (imageColor == "RGB_16")
            {
                // GTSRB training set (RGB)
                string GTSRBtrainingDataRGB   = dirPath + "/GTSRB/Preprocessed/22_training_images.dat";
                string GTSRBtrainingLabelsRGB = dirPath + "/GTSRB/Preprocessed/22_training_classes.dat";


                // GTSRB validation set (RGB)
                string GTSRBvalidationDataRGB   = dirPath + "/GTSRB/Preprocessed/22_validation_images.dat";
                string GTSRBvalidationLabelsRGB = dirPath + "/GTSRB/Preprocessed/22_validation_classes.dat";


                // GTSRB test set (RGB)
                string GTSRBtestDataRGB   = dirPath + "/GTSRB/Preprocessed/22_test_images.dat";
                string GTSRBtestLabelsRGB = dirPath + "/GTSRB/Preprocessed/test_labels_full.dat";

                Console.WriteLine("Importing training set...");
                trainingSet.ReadData(GTSRBtrainingDataRGB, GTSRBtrainingLabelsRGB);

                Console.WriteLine("Importing validation set...");
                validationSet.ReadData(GTSRBvalidationDataRGB, GTSRBvalidationLabelsRGB);

                Console.WriteLine("Importing test set...");
                testSet.ReadData(GTSRBtestDataRGB, GTSRBtestLabelsRGB);
            }
            #endregion

            /*****************************************************
             * (2) Instantiate a neural network and add layers
             *
             * OPTIONS:
             * ConvolutionalLayer(filterSize, numberOfFilters, strideLength, zeroPadding)
             * ResidualModule(filterSize, numberOfFilters, strideLength, zeroPadding, nonlinearityType)
             * FullyConnectedLayer(numberOfUnits)
             * MaxPooling(2, 2)
             * AveragePooling()
             * ReLU()
             * ELU(alpha)
             * SoftMax()
             ****************************************************/

            #region NeuralNetworkCreation

            Console.WriteLine("\n=========================================");
            Console.WriteLine("    Neural network creation");
            Console.WriteLine("=========================================\n");

            // OPTION 1: Create a new network

            /*
             * NeuralNetwork network = new NeuralNetwork("SimplerLeNet_WD1e-4");
             *
             * network.AddLayer(new InputLayer(1, 32, 32));
             *
             * network.AddLayer(new ConvolutionalLayer(5, 32, 1, 0));
             * network.AddLayer(new ELU(1.0f));
             *
             * network.AddLayer(new MaxPooling(2, 2));
             *
             * network.AddLayer(new ConvolutionalLayer(5, 64, 1, 0));
             * network.AddLayer(new ELU(1.0f));
             *
             * network.AddLayer(new MaxPooling(2, 2));
             *
             * network.AddLayer(new FullyConnectedLayer(100));
             * network.AddLayer(new ELU(1.0f));
             *
             * network.AddLayer(new FullyConnectedLayer(100));
             * network.AddLayer(new ELU(1.0f));
             *
             * network.AddLayer(new FullyConnectedLayer(43));
             * network.AddLayer(new SoftMax());
             *
             * NetworkTrainer.TrainingMode = "new";
             */

            // OPTION 2: Load a network from file

            NeuralNetwork network = Utils.LoadNetworkFromFile(dirPath + "/Results/Networks/", "LeNet_RGBb_Dropout");
            //network.Set("MiniBatchSize", 64); // this SHOULDN'T matter!
            //network.InitializeParameters("load");
            //NetworkTrainer.TrainingMode = "resume";



            #endregion


            /*****************************************************
             * (3) Gradient check
             ******************************************************/
            //GradientChecker.Check(network, validationSet);


            /*****************************************************
            * (4) Train network
            ******************************************************
            *  Console.WriteLine("\n=========================================");
            *  Console.WriteLine("    Network training");
            *  Console.WriteLine("=========================================\n");
            *
            #region Training
            *
            *  // Set output files save paths
            *  string trainingSavePath = dirPath + "/Results/LossError/";
            *  NetworkTrainer.TrainingEpochSavePath = trainingSavePath + network.Name + "_trainingEpochs.txt";
            *  NetworkTrainer.ValidationEpochSavePath = trainingSavePath + network.Name + "_validationEpochs.txt";
            *  NetworkTrainer.NetworkOutputFilePath = dirPath + "/Results/Networks/";
            *
            *  NetworkTrainer.MomentumCoefficient = 0.9;
            *  NetworkTrainer.WeightDecayCoeff = 0.0001;
            *  NetworkTrainer.MaxTrainingEpochs = 200;
            *  NetworkTrainer.EpochsBeforeRegularization = 0;
            *  NetworkTrainer.MiniBatchSize = 64;
            *  NetworkTrainer.ConsoleOutputLag = 1; // 1 = print every epoch, N = print every N epochs
            *  NetworkTrainer.EvaluateBeforeTraining = true;
            *  NetworkTrainer.DropoutFullyConnected = 0.5;
            *  NetworkTrainer.DropoutConvolutional = 1.0;
            *  NetworkTrainer.DropoutInput = 1.0;
            *  NetworkTrainer.Patience = 1000;
            *  NetworkTrainer.LearningRateDecayFactor = Math.Sqrt(10.0);
            *  NetworkTrainer.MaxConsecutiveAnnealings = 3;
            *  NetworkTrainer.WeightMaxNorm = Double.PositiveInfinity;
            *
            *  NetworkTrainer.LearningRate = 0.00002;
            *  NetworkTrainer.Train(network, trainingSet, validationSet);
            *
            #endregion
            *
            *  /*****************************************************
            * (5) Test network
            *****************************************************/

            #region Testing

            Console.WriteLine("\nFINAL EVALUATION:");

            // Load best network from file
            NeuralNetwork bestNetwork = Utils.LoadNetworkFromFile("../../../../Results/Networks/", network.Name);
            bestNetwork.Set("MiniBatchSize", 64); // this SHOULDN'T matter!
            bestNetwork.InitializeParameters("load");
            bestNetwork.Set("Inference", true);

            //double loss;
            //double error;

            //NetworkEvaluator.EvaluateNetwork(bestNetwork, trainingSet, out loss, out error);
            //Console.WriteLine("\nTraining set:\n\tLoss = {0}\n\tError = {1}", loss, error);

            //NetworkEvaluator.EvaluateNetwork(bestNetwork, validationSet, out loss, out error);
            //Console.WriteLine("\nValidation set:\n\tLoss = {0}\n\tError = {1}\n\tAccuracy = {2}", loss, error, 100*(1-error));

            //NetworkEvaluator.EvaluateNetwork(bestNetwork, testSet, out loss, out error);
            //Console.WriteLine("\nTest set:\n\tLoss = {0}\n\tError = {1}\n\tAccuracy = {2}", loss, error, 100 * (1 - error));

            // Save misclassified examples
            //NetworkEvaluator.SaveMisclassifiedExamples(bestNetwork, trainingSet, "../../../../Results/MisclassifiedExamples/" + network.Name + "_training.txt");
            //NetworkEvaluator.SaveMisclassifiedExamples(bestNetwork, validationSet, "../../../../Results/MisclassifiedExamples/" + network.Name + "_validation.txt");
            //NetworkEvaluator.SaveMisclassifiedExamples(bestNetwork, testSet, "../../../../Results/MisclassifiedExamples/" + network.Name + "_test.txt");

            // Save filters to file
            bestNetwork.SaveWeights("first", "../../../../Results/Filters/");



            #endregion
            /*****************************************************/
        }