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:
- inputConnection: ponderirane veze između Neuroni
- inputFunction: precizira utezi i vektorski zbrojevi primijenjeno na dolazne podatke veze
- transferFunction: precizira utezi i vektorski zbrojevi primijenjeno na odlazne podatke
- 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: 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: 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: 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: 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: Prvi i zadnji Sloj također treba povezati: Sjetite se da snaga i snaga a Živčana mreža uglavnom ovise o: 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). 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. 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. 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: Dalje, implementiramo skriveni sloj jedan: I skriveni sloj dva: Na kraju definiramo naš izlazni sloj: Dalje, možemo ih sastaviti u Živčana mreža: Za potrebe treninga, sastavimo a Skup podataka određivanjem veličine ulaznog i rezultirajućeg izlaznog vektora: 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: Dalje, trenirajmo svoje Živčana mreža s ugrađenim Pravilo učenja BackPropogation: 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: 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: Vidimo da je naš Živčana mreža uspješno predviđa pravi odgovor! 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.Sloj sloja = novi sloj (); sloj.addNeuron (n);
3.3. Živčana mreža
NeuralNetwork ann = novi Perceptron (2, 4, 1);
NeuralNetwork ann = novi NeuralNetwork (); Sloj sloja = novi sloj (); ann.addLayer (0, sloj); ann.setInputNeurons (sloj.getNeurons ());
ann.addLayer (0, inputLayer); ann.addLayer (1, hiddenLayerOne); ConnectionFactory.fullConnect (ann.getLayerAt (0), ann.getLayerAt (1));
ConnectionFactory.fullConnect (ann.getLayerAt (0), ann.getLayerAt (ann.getLayersCount () - 1), false); ann.setOutputNeurons (ann.getLayerAt (ann.getLayersCount () - 1) .getNeurons ());
3.4. Trening Naše Živčana mreža
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);
NeuralNetwork ann = novi NeuralNetwork (); // ... BackPropagation backPropagation = novo BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4. Sve to zajedno
4.1. Slojevi
Sloj inputLayer = novi sloj (); inputLayer.addNeuron (novi Neuron ()); inputLayer.addNeuron (novi Neuron ());
Sloj hiddenLayerOne = novi sloj (); hiddenLayerOne.addNeuron (novi Neuron ()); hiddenLayerOne.addNeuron (novi Neuron ()); hiddenLayerOne.addNeuron (novi Neuron ()); hiddenLayerOne.addNeuron (novi Neuron ());
Sloj hiddenLayerTwo = novi sloj (); hiddenLayerTwo.addNeuron (novi Neuron ()); hiddenLayerTwo.addNeuron (novi Neuron ()); hiddenLayerTwo.addNeuron (novi Neuron ()); hiddenLayerTwo.addNeuron (novi Neuron ());
Sloj outputLayer = novi sloj (); outputLayer.addNeuron (novi Neuron ());
4.2. Ž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
int inputSize = 2; int outputSize = 1; DataSet ds = novi DataSet (inputSize, outputSize);
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);
BackPropagation backPropagation = novo BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4.4. Testiranje
ann.setInput (0, 1); ann.calculate (); dvostruko [] networkOutputOne = ann.getOutput ();
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
5. Zaključak