Implementación de red neuronal escrita en Java; con documentación en Español.
En el contexto de la Tarea 1 del curso CC5114 del 2017, se presenta el REPORTE.
- JUnit 4
- JavaSE-1.7
- Fue implementado en Eclipse 4.7.0 (Ubuntu 16.04).
- Las neuronas tienen función de activación sigmoidea; se puede extender a otras funciones.
- La red neuronal soporta vectores de entrada de tamaño fijo; el cual se determina en el constructor.
- La red neuronal provee flexibilidad en la cantidad de capas y neuronas por capa.
- La red neuronal permite obtener vector de salida (de capa de salida) de tamaño fijo (detemrinado por cantidad de neuronas de esta).
public NeuralNetwork(double learningRate) {...}
public NeuralNetwork() {...} // learning rate de 0.1
public void newInputLayer(int inputSize, int numberOfNeurons) throws Exception {...} // Crear capa de entrada
public void newHiddenLayer(int numberOfNeurons) throws Exception {...} // crear capa oculta o de salida
public void closeNetwork() throws Exception {...} // se transforma ultima capa en capa de salida
public void train(double[][] input, double[][] expectedOutput, int nEpochs) throws Exception {...} /** input y expectedOutput deben tener la misma cantidad de elementos,
nEpochs es la cantidad de veces que se entrenara con el dataSet.*/
Metodo para hacer una prediccion individual, sobre un input cualquiera.
public double[] predict(double[] input) throws Exception {...} /** retorna vector de predicciones (con valores entre 0 y 1) con tamaño igual a la cantidad de neuronas de la capa de salida */
public int[] binaryPredict(double[] input, double threshold) throws Exception {...} /** Metodo para forzar predicciones binarias, se evalua cada elemento de la predicción mediante el threshold y se deja un valor 0 o 1 en el vector */
El paquete provee un metodo para obtener gran cantidad de metricas binarias, a partir de un data-set de pruebas. Las metricas las retorna en un HashMap indexado por el nombre de la metrica.
- tasa de aciertos (verdaderos positivos y verdaderos negativos) [tasa_aciertos]
- tasa de desaciertos (falsos positivos y falsos negativos) [tasa_desaciertos]
- recall [recall]
- precision [precision]
- Conjunto de datos de entrada con sus respectivas etiquetas (1 o 0).
double threshold = 0.25;
boolean verbose = true;
HashMap<String, Double> metricsData = utils.binaryMetrics(net,
testData,
testClasses,
threshold,
verbose); // verbose para imprimir en consola mayor informacion
NeuralNetwork net = new NeuralNetwork(0.1); // learningRate = 0.1
net.newInputLayer(2, 2); // 1° argumento: n_inputs; 2°: cantidad de neuronas en capa
net.newHiddenLayer(3); // 3 neuronas en capa oculta
net.newHiddenLayer(1); // 1 neurona en capa oculta
net.closeNetwork(); // se cierra red y ultima capa queda como capa de salida (1 salida, en este ejemplo).
Más ejemplos en LayerNetworkTest.java
, spam.MainClass.java
Se hace aprender a red neuronal varias compuertas logicas (AND, XOR, OR). Además se hace aprender a clasificar puntos sobre (y bajo) una funcion lineal. Al ejecutar los test, se exportan gráficos de su error cuadratico VS numero de epoch al directorio del proyecto, para poder visualizar como la red neuronal aprende.
Tests:
- LayerNetworkTest.java
- NeuralTest.java
- utilsTest.java
- Para información especifica sobre mi experimento de Clasificador de SMS de Spam en ../src/spam/README.md
- Para información especifica sobre mi experimento de Clasificador de toxicidad de hongos en ../src/fungi/README.md;