package org.neuroph.samples.mnist.learn;

import java.io.IOException;

import org.neuroph.eval.Evaluation;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.learning.error.MeanSquaredError;
import org.neuroph.nnet.ConvolutionalNetwork;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.events.LearningEvent;
import org.neuroph.core.events.LearningEventListener;
import org.neuroph.nnet.comp.Dimension2D;
import org.neuroph.nnet.learning.BackPropagation;
import org.neuroph.nnet.learning.ConvolutionalBackpropagation;
import org.neuroph.samples.convolution.mnist.MNISTDataSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Utility class which can be used from command prompt to train ConvolutionalNetwork
 */
public class CnnMNIST {

    private static Logger LOG = LoggerFactory.getLogger(CnnMNIST.class);


    /**
     * @param args Command line parameters used to initialize parameters of convolutional network
     *             [0] - maximal number of epochs during learning
     *             [1] - learning error stop condition
     *             [2] - learning rate used during learning process
     *             [3] - number of feature maps in 1st convolutional layer
     *             [4] - number of feature maps in 2nd convolutional layer
     *             [5] - number of feature maps in 3rd convolutional layer
     */
    public static void main(String[] args) {
        try {
            int maxIter = 10000; // Integer.parseInt(args[0]);
            double maxError = 0.01; //Double.parseDouble(args[1]);
            double learningRate = 0.2; //  Double.parseDouble(args[2]);

            int layer1 = Integer.parseInt(args[3]);
            int layer2 = Integer.parseInt(args[4]);
            int layer3 = Integer.parseInt(args[5]);

            LOG.info("{}-{}-{}", layer1, layer2, layer3);

         String putanja = "C:\\Users\\jecak_000\\Documents\\Neuroph\\neuroph_novaVerzija\\neurophNoviPull\\neuroph-2.9\\Samples\\";
         String labelName = putanja.concat(MNISTDataSet.TRAIN_LABEL_NAME);
         String trainImage = putanja.concat(MNISTDataSet.TRAIN_IMAGE_NAME);
         String testLabel =  putanja.concat(MNISTDataSet.TEST_LABEL_NAME);
         String testImage  = putanja.concat(MNISTDataSet.TEST_IMAGE_NAME);
         DataSet trainSet = MNISTDataSet.createFromFile(labelName,trainImage, 100);
         DataSet testSet = MNISTDataSet.createFromFile(testLabel,testImage, 100);

            Dimension2D inputDimension = new Dimension2D(32, 32);
            Dimension2D convolutionKernel = new Dimension2D(5, 5);
            Dimension2D poolingKernel = new Dimension2D(2, 2);

            ConvolutionalNetwork convolutionNetwork = new ConvolutionalNetwork.Builder()
                    .withInputLayer(32, 32, 1)
                    .withConvolutionLayer(5, 5, layer1)
                    .withPoolingLayer(2, 2)
                    .withConvolutionLayer(5, 5, layer2)
                    .withPoolingLayer(2, 2)
                    .withConvolutionLayer(5, 5, layer3)
                    .withFullConnectedLayer(10)
                    .build();

            ConvolutionalBackpropagation backPropagation = new ConvolutionalBackpropagation();
            backPropagation.setLearningRate(learningRate);
            backPropagation.setMaxError(maxError);
            backPropagation.setMaxIterations(maxIter);
            backPropagation.addListener(new LearningListener(convolutionNetwork, testSet));
            backPropagation.setErrorFunction(new MeanSquaredError());

            convolutionNetwork.setLearningRule(backPropagation);
            convolutionNetwork.learn(trainSet);

            Evaluation.runFullEvaluation(convolutionNetwork, testSet);


        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private static class LearningListener implements LearningEventListener {

        private final NeuralNetwork neuralNetwork;
        private DataSet testSet;

        public LearningListener(NeuralNetwork neuralNetwork, DataSet testSet) {
            this.testSet = testSet;
            this.neuralNetwork = neuralNetwork;
        }


        long start = System.currentTimeMillis();

        public void handleLearningEvent(LearningEvent event) {
            BackPropagation bp = (BackPropagation) event.getSource();
            LOG.info("Epoch no#: [{}]. Error [{}]", bp.getCurrentIteration(), bp.getTotalNetworkError());
            LOG.info("Epoch execution time: {} sec", (System.currentTimeMillis() - start) / 1000.0);
           // neuralNetwork.save(bp.getCurrentIteration() + "_MNIST_CNN-MIC.nnet");

            start = System.currentTimeMillis();
          //  if (bp.getCurrentIteration() % 5 == 0)
          //      Evaluation.runFullEvaluation(neuralNetwork, testSet);
        }

    }


}

 

Ads help maintain this website.