Uvod u Neuroph

1. Uvod

Ovaj članak osvrće se na Neuroph - biblioteku otvorenog koda za stvaranje neuronskih mreža i korištenje strojnog učenja.

U članku ćemo pogledati temeljne koncepte i nekoliko primjera kako to sve spojiti.

2. Neuroph

S Neurophom možemo komunicirati koristeći:

  • alat zasnovan na GUI-u
  • Java knjižnica

Oba pristupa oslanjaju se na temeljnu hijerarhiju klase koja gradi umjetne neuronske mreže od slojeva neuroni.

Usredotočit ćemo se na programsku stranu, ali pozvat ćemo se na nekoliko zajedničkih klasa iz Neuroph-ovog pristupa temeljenog na GUI-ju da bismo pojasnili što radimo.

Za više informacija o pristupu temeljenom na GUI-ju, pogledajte dokumentaciju Neuroph.

2.1. Ovisnosti

Ako želimo koristiti Neuroph, moramo dodati sljedeći Mavenov unos:

 org.beykery neurof 2.92 

Najnoviju verziju možete pronaći na Maven Central.

3. Ključne klase i koncepti

Svi korišteni osnovni konceptualni blokovi imaju odgovarajuće Java klase.

Neuroni su povezani sa Slojevi koji se zatim grupiraju u Neuronske mreže. Neuronske mreže se naknadno obučavaju koristeći Pravila učenja i Skupovi podataka.

3.1. Neuron

The Neuron razred ima četiri osnovna atributa:

  1. inputConnection: ponderirane veze između Neuroni
  2. inputFunction: precizira utezi i vektorski zbrojevi primijenjeno na dolazne podatke veze
  3. transferFunction: precizira utezi i vektorski zbrojevi primijenjeno na odlazne podatke

  4. izlaz: izlazna vrijednost koja proizlazi iz primjene prijenosFunkcije i inputFunctions do an inputConnection

Ta četiri primarna atributa zajedno uspostavljaju ponašanje:

output = transferFunction (inputFunction (inputConnections));

3.2. Sloj

Slojevi su u osnovi grupiranja Neuroni takav da svaki Neuron u Sloj je (obično) povezan samo s Neuroni u prethodnom i sljedećem Slojevi.

Slojevi, zato prosljeđujte podatke između njih kroz ponderirane funkcije koje postoje na njihovim Neuroni.

Neuroni može se dodati u slojeve:

Sloj sloja = novi sloj (); sloj.addNeuron (n);

3.3. Živčana mreža

Vrhunska superklasa Živčana mreža subklasiran je u nekoliko poznatih vrsta umjetnih neuronskih mreža, uključujući konvolucijske neuronske mreže (podrazred ConvolutionalNetwork), Hopfieldove neuronske mreže (podrazred Hopfield) i višeslojne perceptronske neuronske mreže (podrazred VišeslojniPerceptron).

svi Neuronske mreže sastoje se od Slojevi koji se obično organiziraju u trihotomiju:

  1. ulazni slojevi
  2. skriveni slojevi
  3. izlazni slojevi

Ako koristimo konstruktor potklase od Živčana mreža (kao što je Perceptron), možemo proći Slojs, broj Neurons za svaku Sloj, i njihov indeks pomoću ove jednostavne metode:

NeuralNetwork ann = novi Perceptron (2, 4, 1);

Ponekad ćemo to htjeti učiniti ručno (i dobro je vidjeti što se događa ispod haube). Osnovna operacija dodavanja a Sloj do a Živčana mreža postiže se ovako:

NeuralNetwork ann = novi NeuralNetwork (); Sloj sloja = novi sloj (); ann.addLayer (0, sloj); ann.setInputNeurons (sloj.getNeurons ()); 

Prvi argument navodi indeks Sloj u Živčana mreža; drugi argument navodi Sloj sebe. Slojevi dodano ručno treba povezati pomoću ConnectionFactory razred:

ann.addLayer (0, inputLayer); ann.addLayer (1, hiddenLayerOne); ConnectionFactory.fullConnect (ann.getLayerAt (0), ann.getLayerAt (1));

Prvi i zadnji Sloj također treba povezati:

ConnectionFactory.fullConnect (ann.getLayerAt (0), ann.getLayerAt (ann.getLayersCount () - 1), false); ann.setOutputNeurons (ann.getLayerAt (ann.getLayersCount () - 1) .getNeurons ());

Sjetite se da snaga i snaga a Živčana mreža uglavnom ovise o:

  1. broj Slojevi u Živčana mreža
  2. broj Neuroni u svakom Sloj (i ponderirane funkcije između njih) i
  3. učinkovitost algoritama treninga / točnost Skup podataka

3.4. Trening Naše Živčana mreža

Neuronske mreže su obučeni koristeći Skup podataka i Pravilo učenja razreda.

Skup podataka koristi se za predstavljanje i pružanje informacija koje treba naučiti ili se koriste za obuku Živčana mreža. Skupovi podataka odlikuju se svojim veličina ulaza, veličina izlaza, i redovi (DataSetRow).

int inputSize = 2; int outputSize = 1; DataSet ds = novi DataSet (inputSize, outputSize); DataSetRow rOne = novi DataSetRow (novi double [] {0, 0}, novi double [] {0}); ds.addRow (rOne); DataSetRow rTwo = novi DataSetRow (novi double [] {1, 1}, novi double [] {0}); ds.addRow (rTwo);

Pravilo učenja određuje način na koji Skup podataka podučava ili trenira Živčana mreža. Podrazredi Pravilo učenja uključuju BackPropagation i Nadzirano učenje.

NeuralNetwork ann = novi NeuralNetwork (); // ... BackPropagation backPropagation = novo BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);

4. Sve to zajedno

Sad stavimo te gradivne blokove u stvarni primjer. Krenut ćemo od kombinirajući nekoliko slojeva zajedno u poznato ulazni sloj, skriveni sloj, i izlazni sloj uzorak primjer većine arhitektura neuronske mreže.

4.1. Slojevi

Sastavit ćemo svoje Živčana mreža kombiniranjem četiri sloja. Cilj nam je stvoriti (2, 4, 4, 1) Živčana mreža.

Prvo definirajmo svoj ulazni sloj:

Sloj inputLayer = novi sloj (); inputLayer.addNeuron (novi Neuron ()); inputLayer.addNeuron (novi Neuron ());

Dalje, implementiramo skriveni sloj jedan:

Sloj hiddenLayerOne = novi sloj (); hiddenLayerOne.addNeuron (novi Neuron ()); hiddenLayerOne.addNeuron (novi Neuron ()); hiddenLayerOne.addNeuron (novi Neuron ()); hiddenLayerOne.addNeuron (novi Neuron ());

I skriveni sloj dva:

Sloj hiddenLayerTwo = novi sloj (); hiddenLayerTwo.addNeuron (novi Neuron ()); hiddenLayerTwo.addNeuron (novi Neuron ()); hiddenLayerTwo.addNeuron (novi Neuron ()); hiddenLayerTwo.addNeuron (novi Neuron ());

Na kraju definiramo naš izlazni sloj:

Sloj outputLayer = novi sloj (); outputLayer.addNeuron (novi Neuron ()); 

4.2. Živčana mreža

Dalje, možemo ih sastaviti u Živčana mreža:

NeuralNetwork ann = novi NeuralNetwork (); ann.addLayer (0, inputLayer); ann.addLayer (1, hiddenLayerOne); ConnectionFactory.fullConnect (ann.getLayerAt (0), ann.getLayerAt (1)); ann.addLayer (2, hiddenLayerTwo); ConnectionFactory.fullConnect (ann.getLayerAt (1), ann.getLayerAt (2)); ann.addLayer (3, outputLayer); ConnectionFactory.fullConnect (ann.getLayerAt (2), ann.getLayerAt (3)); ConnectionFactory.fullConnect (ann.getLayerAt (0), ann.getLayerAt (ann.getLayersCount () - 1), false); ann.setInputNeurons (inputLayer.getNeurons ()); ann.setOutputNeurons (outputLayer.getNeurons ());

4.3. Trening

Za potrebe treninga, sastavimo a Skup podataka određivanjem veličine ulaznog i rezultirajućeg izlaznog vektora:

int inputSize = 2; int outputSize = 1; DataSet ds = novi DataSet (inputSize, outputSize);

Našem dodamo elementarni red Skup podataka pridržavajući se gore definiranih ulaznih i izlaznih ograničenja - naš je cilj u ovom primjeru naučiti našu mrežu raditi osnovne XOR (ekskluzivne ili) operacije:

DataSetRow rOne = novi DataSetRow (novi dvostruki [] {0, 1}, novi dvostruki [] {1}); ds.addRow (rOne); DataSetRow rTwo = novi DataSetRow (novi double [] {1, 1}, novi double [] {0}); ds.addRow (rTwo); DataSetRow rThree = novi DataSetRow (novi dvostruki [] {0, 0}, novi dvostruki [] {0}); ds.addRow (rThree); DataSetRow rFour = novi DataSetRow (novi double [] {1, 0}, novi double [] {1}); ds.addRow (rFour);

Dalje, trenirajmo svoje Živčana mreža s ugrađenim Pravilo učenja BackPropogation:

BackPropagation backPropagation = novo BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation); 

4.4. Testiranje

Sad to naše Živčana mreža istreniran, testirajmo ga. Za svaki par logičkih vrijednosti prenesenih u našu Skup podataka kao DataSetRow, provodimo sljedeću vrstu testa:

ann.setInput (0, 1); ann.calculate (); dvostruko [] networkOutputOne = ann.getOutput (); 

Važno je upamtiti to Neuronske mreže samo iznesite vrijednost na uključiv interval 0 i 1. Da bismo ispisali neku drugu vrijednost, moramo normalizirati i denormalizirati naši podaci.

U ovom su slučaju za logičke operacije 0 i 1 savršeni za posao. Izlaz će biti:

Testiranje: 1, 0 Očekivano: 1,0 Rezultat: 1,0 Testiranje: 0, 1 Očekivano: 1,0 Rezultat: 1,0 Testiranje: 1, 1 Očekivano: 0,0 Rezultat: 0,0 Testiranje: 0, 0 Očekivano: 0,0 Rezultat: 0,0 

Vidimo da je naš Živčana mreža uspješno predviđa pravi odgovor!

5. Zaključak

Upravo smo pregledali osnovne koncepte i klase koje koristi Neuroph.

Dodatne informacije o ovoj knjižnici dostupne su ovdje, a primjeri koda korišteni u ovom članku mogu se naći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found