Package com.github.neuralnetworks.test

Source Code of com.github.neuralnetworks.test.DNNTest

package com.github.neuralnetworks.test;

import static org.junit.Assert.assertEquals;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

import com.github.neuralnetworks.architecture.FullyConnected;
import com.github.neuralnetworks.architecture.Layer;
import com.github.neuralnetworks.architecture.NeuralNetwork;
import com.github.neuralnetworks.architecture.types.Autoencoder;
import com.github.neuralnetworks.architecture.types.DBN;
import com.github.neuralnetworks.architecture.types.NNFactory;
import com.github.neuralnetworks.architecture.types.RBM;
import com.github.neuralnetworks.architecture.types.StackedAutoencoder;
import com.github.neuralnetworks.calculation.LayerCalculatorImpl;
import com.github.neuralnetworks.calculation.memory.ValuesProvider;
import com.github.neuralnetworks.calculation.neuronfunctions.AparapiWeightedSumConnectionCalculator;
import com.github.neuralnetworks.input.SimpleInputProvider;
import com.github.neuralnetworks.tensor.Matrix;
import com.github.neuralnetworks.tensor.Tensor;
import com.github.neuralnetworks.tensor.TensorFactory;
import com.github.neuralnetworks.training.DNNLayerTrainer;
import com.github.neuralnetworks.training.OneStepTrainer;
import com.github.neuralnetworks.training.TrainerFactory;
import com.github.neuralnetworks.training.rbm.AparapiCDTrainer;
import com.github.neuralnetworks.util.Environment;

public class DNNTest {

    @Test
    public void testDBNConstruction() {
  Environment.getInstance().setUseWeightsSharedMemory(true);

  DBN dbn = NNFactory.dbn(new int[] { 4, 4, 4, 4}, false);
  assertEquals(4, dbn.getLayers().size(), 0);
  assertEquals(3, dbn.getNeuralNetworks().size(), 0);
  assertEquals(2, dbn.getFirstNeuralNetwork().getLayers().size(), 0);
  assertEquals(2, dbn.getNeuralNetwork(1).getLayers().size(), 0);
  assertEquals(2, dbn.getLastNeuralNetwork().getLayers().size(), 0);

  dbn = NNFactory.dbn(new int[] { 4, 4, 4, 4 }, true);
  assertEquals(7, dbn.getLayers().size(), 0);
  assertEquals(3, dbn.getNeuralNetworks().size(), 0);
  assertEquals(4, dbn.getFirstNeuralNetwork().getLayers().size(), 0);
  assertEquals(4, dbn.getNeuralNetwork(0).getLayers().size(), 0);
  assertEquals(4, dbn.getLastNeuralNetwork().getLayers().size(), 0);

  assertEquals(true, dbn.getFirstNeuralNetwork().getHiddenBiasConnections() != null);
  assertEquals(true, dbn.getFirstNeuralNetwork().getVisibleBiasConnections() != null);
  assertEquals(true, dbn.getNeuralNetwork(1).getHiddenBiasConnections() != null);
  assertEquals(true, dbn.getNeuralNetwork(1).getVisibleBiasConnections() != null);
  assertEquals(true, dbn.getLastNeuralNetwork().getHiddenBiasConnections() != null);
  assertEquals(true, dbn.getLastNeuralNetwork().getVisibleBiasConnections() != null);

  assertEquals(false, dbn.getLayers().contains(dbn.getFirstNeuralNetwork().getVisibleBiasConnections().getInputLayer()));
  assertEquals(false, dbn.getLayers().contains(dbn.getNeuralNetwork(1).getVisibleBiasConnections().getInputLayer()));
  assertEquals(false, dbn.getLayers().contains(dbn.getLastNeuralNetwork().getVisibleBiasConnections().getInputLayer()));

  assertEquals(true, dbn.getFirstNeuralNetwork().getHiddenLayer() == dbn.getNeuralNetwork(1).getVisibleLayer());
  assertEquals(true, dbn.getNeuralNetwork(1).getHiddenLayer() == dbn.getLastNeuralNetwork().getVisibleLayer());

  assertEquals(true, dbn.getOutputLayer().equals(dbn.getLastNeuralNetwork().getHiddenLayer()));
    }

    @Test
    public void testStackedAutoencoderConstruction() {
  Environment.getInstance().setUseWeightsSharedMemory(true);

  StackedAutoencoder sae = NNFactory.sae(new int[] { 5, 4, 3 }, false);
  assertEquals(3, sae.getLayers().size(), 0);
  assertEquals(2, sae.getNeuralNetworks().size(), 0);
  assertEquals(3, sae.getFirstNeuralNetwork().getLayers().size(), 0);
  assertEquals(3, sae.getLastNeuralNetwork().getLayers().size(), 0);

  sae = NNFactory.sae(new int[] { 5, 4, 3 }, true);
  assertEquals(5, sae.getLayers().size(), 0);
  assertEquals(2, sae.getNeuralNetworks().size(), 0);
  assertEquals(5, sae.getFirstNeuralNetwork().getLayers().size(), 0);
  assertEquals(5, sae.getLastNeuralNetwork().getLayers().size(), 0);

  assertEquals(false, sae.getLayers().contains(sae.getFirstNeuralNetwork().getOutputLayer()));
  assertEquals(false, sae.getLayers().contains(sae.getLastNeuralNetwork().getOutputLayer()));
  assertEquals(true, sae.getOutputLayer().equals(sae.getLastNeuralNetwork().getHiddenLayer()));

  assertEquals(true, sae.getFirstNeuralNetwork().getHiddenLayer() == sae.getLastNeuralNetwork().getInputLayer());
    }

    @Test
    public void testDBNCalculation() {
  Environment.getInstance().setUseWeightsSharedMemory(true);
  DBN dbn = NNFactory.dbn(new int [] {3, 2, 2}, true);
  dbn.setLayerCalculator(NNFactory.lcWeightedSum(dbn, null));

  RBM firstRBM = dbn.getFirstNeuralNetwork();

  Tensor t = firstRBM.getMainConnections().getWeights();
  float[] e1 = t.getElements();
  t.forEach(i -> e1[i] = 0.2f);
 
  t = firstRBM.getVisibleBiasConnections().getWeights();
  float[] e2 = t.getElements();
  t.forEach(i -> e2[i] = 0.1f);

  t = firstRBM.getHiddenBiasConnections().getWeights();
  float[] e3 = t.getElements();
  t.forEach(i -> e3[i] = 0.3f);

  RBM secondRBM = dbn.getLastNeuralNetwork();

  t = secondRBM.getMainConnections().getWeights();
  float[] e4 = t.getElements();
  t.forEach(i -> e4[i] = 0.4f);

  t = secondRBM.getVisibleBiasConnections().getWeights();
  float[] e5 = t.getElements();
  t.forEach(i -> e5[i] = 0.8f);

  t = secondRBM.getHiddenBiasConnections().getWeights();
  float[] e6 = t.getElements();
  t.forEach(i -> e6[i] = 0.5f);

  Set<Layer> calculatedLayers = new HashSet<>();
  calculatedLayers.add(dbn.getInputLayer());

  ValuesProvider results = TensorFactory.tensorProvider(dbn, 1, true);
  results.get(dbn.getInputLayer()).set(1, 0, 0);
  results.get(dbn.getInputLayer()).set(0, 1, 0);
  results.get(dbn.getInputLayer()).set(1, 2, 0);
  dbn.getLayerCalculator().calculate(dbn, dbn.getOutputLayer(), calculatedLayers, results);

  assertEquals(1.06, results.get(dbn.getOutputLayer()).get(0, 0), 0.00001);
  assertEquals(1.06, results.get(dbn.getOutputLayer()).get(1, 0), 0.00001);
    }

    @Test
    public void testSAECalculation() {
  Environment.getInstance().setUseWeightsSharedMemory(true);
  StackedAutoencoder sae = NNFactory.sae(new int [] {3, 2, 2}, true);
  sae.setLayerCalculator(NNFactory.lcWeightedSum(sae, null));

  Autoencoder firstAE = sae.getFirstNeuralNetwork();
  Tensor t = ((FullyConnected) firstAE.getConnection(firstAE.getInputLayer(), firstAE.getHiddenLayer())).getWeights();
  float[] e1 = t.getElements();
  t.forEach(i -> e1[i] = 0.2f);

  t = ((FullyConnected) firstAE.getConnection(firstAE.getHiddenBiasLayer(), firstAE.getHiddenLayer())).getWeights();
  float[] e2 = t.getElements();
  t.forEach(i -> e2[i] = 0.3f);

  t = ((FullyConnected) firstAE.getConnection(firstAE.getHiddenLayer(), firstAE.getOutputLayer())).getWeights();
  float[] e3 = t.getElements();
  t.forEach(i -> e3[i] = 0.8f);

  t = ((FullyConnected) firstAE.getConnection(firstAE.getOutputBiasLayer(), firstAE.getOutputLayer())).getWeights();
  float[] e4 = t.getElements();
  t.forEach(i -> e4[i] = 0.9f);

  Autoencoder secondAE = sae.getLastNeuralNetwork();

  t = ((FullyConnected) secondAE.getConnection(secondAE.getInputLayer(), secondAE.getHiddenLayer())).getWeights();
  float[] e5 = t.getElements();
  t.forEach(i -> e5[i] = 0.4f);
 
  t = ((FullyConnected) secondAE.getConnection(secondAE.getHiddenBiasLayer(), secondAE.getHiddenLayer())).getWeights();
  float[] e6 = t.getElements();
  t.forEach(i -> e6[i] = 0.5f);

  t = ((FullyConnected) secondAE.getConnection(secondAE.getHiddenLayer(), secondAE.getOutputLayer())).getWeights();
  float[] e7 = t.getElements();
  t.forEach(i -> e7[i] = 0.7f);

  t = ((FullyConnected) secondAE.getConnection(secondAE.getOutputBiasLayer(), secondAE.getOutputLayer())).getWeights();
  float[] e8 = t.getElements();
  t.forEach(i -> e8[i] = 0.9f);

  Set<Layer> calculatedLayers = new HashSet<>();
  calculatedLayers.add(sae.getInputLayer());

  ValuesProvider results = TensorFactory.tensorProvider(sae, 1, true);
  results.get(sae.getInputLayer()).set(1, 0, 0);
  results.get(sae.getInputLayer()).set(0, 1, 0);
  results.get(sae.getInputLayer()).set(1, 2, 0);

  sae.getLayerCalculator().calculate(sae, sae.getOutputLayer(), calculatedLayers, results);

  assertEquals(1.06, results.get(sae.getOutputLayer()).get(0, 0), 0.00001);
  assertEquals(1.06, results.get(sae.getOutputLayer()).get(1, 0), 0.00001);
    }

    @Test
    public void testDNNLayerTrainer() {
  Environment.getInstance().setUseWeightsSharedMemory(true);
  DBN dbn = NNFactory.dbn(new int [] {3, 2, 2}, true);
  dbn.setLayerCalculator(NNFactory.lcSigmoid(dbn, null));

  RBM firstRBM = dbn.getFirstNeuralNetwork();

  Matrix cg1 = firstRBM.getMainConnections().getWeights();
  cg1.set(0.2f, 0, 0);
  cg1.set(0.4f, 0, 1);
  cg1.set(-0.5f, 0, 2);
  cg1.set(-0.3f, 1, 0);
  cg1.set(0.1f, 1, 1);
  cg1.set(0.2f, 1, 2);

  Matrix cgb1 = firstRBM.getVisibleBiasConnections().getWeights();
  cgb1.set(0f, 0, 0);
  cgb1.set(0f, 1, 0);
  cgb1.set(0f, 2, 0);

  Matrix cgb2 = firstRBM.getHiddenBiasConnections().getWeights();
  cgb2.set(-0.4f, 0, 0);
  cgb2.set(0.2f, 1, 0);

  SimpleInputProvider inputProvider = new SimpleInputProvider(new float[][] { { 1, 0, 1 } }, null);

  AparapiCDTrainer firstTrainer = TrainerFactory.cdSigmoidTrainer(firstRBM, null, null, null, null, 1f, 0f, 0f, 0f, 1, 1, 1, true);

  RBM secondRBM = dbn.getLastNeuralNetwork();

  AparapiCDTrainer secondTrainer = TrainerFactory.cdSigmoidTrainer(secondRBM, null, null, null, null, 1f, 0f, 0f, 0f, 1, 1, 1, true);

  Map<NeuralNetwork, OneStepTrainer<?>> layerTrainers = new HashMap<>();
  layerTrainers.put(firstRBM, firstTrainer);
  layerTrainers.put(secondRBM, secondTrainer);

  DNNLayerTrainer trainer = TrainerFactory.dnnLayerTrainer(dbn, layerTrainers, inputProvider, null, null);
  trainer.train();
 
  assertEquals(0.2 + 0.13203661, cg1.get(0, 0), 0.00001);
  assertEquals(0.4 - 0.22863509,  cg1.get(0, 1), 0.00001);
  assertEquals(-0.5 + 0.12887852, cg1.get(0, 2), 0.00001);
  assertEquals(-0.3 + 0.26158813, cg1.get(1, 0), 0.00001);
  assertEquals(0.1 - 0.3014404,  cg1.get(1, 1), 0.00001);
  assertEquals(0.2 + 0.25742438, cg1.get(1, 2), 0.00001);

  assertEquals(0.52276707, cgb1.get(0, 0), 0.00001);
  assertEquals(- 0.54617375, cgb1.get(1, 0), 0.00001);
  assertEquals(0.51522285, cgb1.get(2, 0), 0.00001);

  assertEquals(-0.4 - 0.08680013, cgb2.get(0, 0), 0.00001);
  assertEquals(0.2 - 0.02693379, cgb2.get(1, 0), 0.00001);
    }

    @Test
    public void testDNNLayerTrainer2() {
  Environment.getInstance().setUseWeightsSharedMemory(true);
  DBN dbn = NNFactory.dbn(new int [] {3, 3, 2}, true);
  dbn.setLayerCalculator(NNFactory.lcSigmoid(dbn, null));

  RBM firstRBM = dbn.getFirstNeuralNetwork();

  LayerCalculatorImpl lc = (LayerCalculatorImpl) dbn.getLayerCalculator();
  lc.addConnectionCalculator(firstRBM.getHiddenLayer(), new AparapiWeightedSumConnectionCalculator());

  Matrix m1 = firstRBM.getMainConnections().getWeights();
  m1.set(1, 0, 0);
  m1.set(0, 0, 1);
  m1.set(0, 0, 2);
  m1.set(0, 1, 0);
  m1.set(1, 1, 1);
  m1.set(0, 1, 2);
  m1.set(0, 2, 0);
  m1.set(0, 2, 1);
  m1.set(1, 2, 2);

  RBM secondRBM = dbn.getLastNeuralNetwork();
 
  Matrix cg1 = secondRBM.getMainConnections().getWeights();
  cg1.set(0.2f, 0, 0);
  cg1.set(0.4f, 0, 1);
  cg1.set(-0.5f, 0, 2);
  cg1.set(-0.3f, 1, 0);
  cg1.set(0.1f, 1, 1);
  cg1.set(0.2f, 1, 2);
 
  Matrix cgb1 = secondRBM.getVisibleBiasConnections().getWeights();
  cgb1.set(0f, 0, 0);
  cgb1.set(0f, 1, 0);
  cgb1.set(0f, 2, 0);
 
  Matrix cgb2 = secondRBM.getHiddenBiasConnections().getWeights();
  cgb2.set(-0.4f, 0, 0);
  cgb2.set(0.2f, 1, 0);

  SimpleInputProvider inputProvider = new SimpleInputProvider(new float[][] { { 1, 0, 1 } }, null);

  AparapiCDTrainer firstTrainer = TrainerFactory.cdSigmoidTrainer(firstRBM, null, null, null, null, 0f, 0f, 0f, 0f, 0, 1, 1, true);

  AparapiCDTrainer secondTrainer = TrainerFactory.cdSigmoidTrainer(secondRBM, null, null, null, null, 1f, 0f, 0f, 0f, 1, 1, 1, true);

  Map<NeuralNetwork, OneStepTrainer<?>> layerTrainers = new HashMap<>();
  layerTrainers.put(firstRBM, firstTrainer);
  layerTrainers.put(secondRBM, secondTrainer);

  DNNLayerTrainer trainer = TrainerFactory.dnnLayerTrainer(dbn, layerTrainers, inputProvider, null, null);
  trainer.train();
 
  assertEquals(0.2 + 0.13203661, cg1.get(0, 0), 0.00001);
  assertEquals(0.4 - 0.22863509,  cg1.get(0, 1), 0.00001);
  assertEquals(-0.5 + 0.12887852, cg1.get(0, 2), 0.00001);
  assertEquals(-0.3 + 0.26158813, cg1.get(1, 0), 0.00001);
  assertEquals(0.1 - 0.3014404,  cg1.get(1, 1), 0.00001);
  assertEquals(0.2 + 0.25742438, cg1.get(1, 2), 0.00001);

  assertEquals(0.52276707, cgb1.get(0, 0), 0.00001);
  assertEquals(- 0.54617375, cgb1.get(1, 0), 0.00001);
  assertEquals(0.51522285, cgb1.get(2, 0), 0.00001);
 
  assertEquals(-0.4 - 0.08680013, cgb2.get(0, 0), 0.00001);
  assertEquals(0.2 - 0.02693379, cgb2.get(1, 0), 0.00001);
    }
}
TOP

Related Classes of com.github.neuralnetworks.test.DNNTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.