package org.neuroph.samples.convolution.mnist;

import org.neuroph.core.data.DataSet;
import org.neuroph.core.events.LearningEvent;
import org.neuroph.core.events.LearningEventListener;
import org.neuroph.core.learning.error.MeanSquaredError;
import org.neuroph.nnet.ConvolutionalNetwork;
import org.neuroph.nnet.learning.BackPropagation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import org.neuroph.eval.Evaluation;
import org.neuroph.nnet.learning.ConvolutionalBackpropagation;

/**
 * Konvolucioni parametri
 * 

* Globalna arhitektura: Konvolucioni i pooling lejeri - naizmenicno (samo konvolucioni ili naizmenicno konvolccioni pooling) * Za svaki lajer da ima svoj kernel (mogu svi konvolucioni da imaju isti kernel, ili svi pooling isti kernel) * da mogu da zadaju neuron properties (transfer funkciju) za konvolucioni i pooling lejer(input) * Konektovanje lejera? - po defaultu full connect (ostaviti api za custom konekcije) *

* addFeatureMaps... * connectFeatureMaps *

* Helper utility klasa... *

* Osnovni kriterijumi: * 1. Jednostavno kreiranje default neuronske mreze * 2. Laka customizacija i kreiranje custom arhitektura: konvolucionih i pooling lejera i transfer/input funkcija * Napraviti prvo API i ond aprilagodti kod *

* ------------------------ *

* promeniti nacin kreiranja i dodavanja feature maps layera * resiti InputMaps Layer, overridovana metoda koja baca unsupported exception ukazuje da nesto nije u redu sa dizajnom * Da li imamo potrebe za klasom kernel - to je isto kao i dimension? *

* zasto je public abstract void connectMaps apstraktna? (u klasi FeatureMapsLayer) *

* InputMapsLayer konstruktoru superklase prosledjuje null... *

* fullConnectMapLayers * * * Same as CNNMNIST just with hardoced params * * @author zoran */ public class MNISTExample { private static Logger LOG = LoggerFactory.getLogger(MNISTExample.class); public static void main(String[] args) { try { DataSet trainSet = MNISTDataSet.createFromFile(MNISTDataSet.TRAIN_LABEL_NAME, MNISTDataSet.TRAIN_IMAGE_NAME, 60); DataSet testSet = MNISTDataSet.createFromFile(MNISTDataSet.TEST_LABEL_NAME, MNISTDataSet.TEST_IMAGE_NAME, 10); ConvolutionalNetwork convolutionNetwork = new ConvolutionalNetwork.Builder() .withInputLayer(32, 32, 1) .withConvolutionLayer(5, 5, 6) // add transfer function and its properties .withPoolingLayer(2, 2) .withConvolutionLayer(5, 5, 16) .withPoolingLayer(2, 2) .withConvolutionLayer(5, 5, 120) .withFullConnectedLayer(84) .withFullConnectedLayer(10) .build(); // we need Output RBF euclidean layer - implement original LeNet5 - and make sure it works // + kreiraj RBF Euclidean i dodaj u output layer: EuclideanRBF // - amplitude for tanh - dodaj parametar // trenutno konvolucioni sloj koristi RectifiedLinear.class - trebalo bi svi tanh // zasto dva puta okida event za learning? loguje dvaput? ConvolutionalBackpropagation backPropagation = new ConvolutionalBackpropagation(); backPropagation.setLearningRate(0.001); backPropagation.setMaxError(0.01); //backPropagation.setMaxIterations(1000); backPropagation.setErrorFunction(new MeanSquaredError()); convolutionNetwork.setLearningRule(backPropagation); backPropagation.addListener(new LearningListener()); // System.out.println("Started training..."); convolutionNetwork.learn(trainSet); // System.out.println("Done training!"); // CrossValidation crossValidation = new CrossValidation(convolutionNetwork, trainSet, 6); // crossValidation.run(); // ClassificationMetrics validationResult = crossValidation.computeErrorEstimate(convolutionNetwork, trainSet); Evaluation.runFullEvaluation(convolutionNetwork, testSet); convolutionNetwork.save("mnist.nnet"); // System.out.println(crossValidation.getResult()); } catch (IOException e) { e.printStackTrace(); } } static class LearningListener implements LearningEventListener { long start = System.currentTimeMillis(); @Override public void handleLearningEvent(LearningEvent event) { BackPropagation bp = (BackPropagation) event.getSource(); LOG.info("Current iteration: " + bp.getCurrentIteration()); LOG.info("Error: " + bp.getTotalNetworkError()); LOG.info("Calculation time: " + (System.currentTimeMillis() - start) / 1000.0); // neuralNetwork.save(bp.getCurrentIteration() + "CNN_MNIST" + bp.getCurrentIteration() + ".nnet"); start = System.currentTimeMillis(); // NeuralNetworkEvaluationService.completeEvaluation(neuralNetwork, testSet); } } }

Ads help maintain this website.