Introduksjon til Neuroph
1. Introduksjon
Denne artikkelen tar en titt på Neuroph - et open source-bibliotek for å skape nevrale nettverk og bruke maskinlæring.
I artikkelen ser vi på kjernekonseptene og flere eksempler på hvordan du kan sette det hele sammen.
2. Neuroph
Vi kan samhandle med Neuroph ved å bruke:
- et GUI-basert verktøy
- et Java-bibliotek
Begge tilnærmingene er avhengige av et underliggende klassehierarki som bygger kunstige nevrale nettverk ut av lag av nevroner.
Vi vil fokusere på den programmatiske siden, men vil referere til flere delte klasser fra Neurophs GUI-baserte tilnærming for å avklare hva vi gjør.
For mer informasjon om GUI-basert tilnærming, ta en titt på Neuroph-dokumentasjonen.
2.1. Avhengigheter
Hvis du skal bestille Neuroph, må vi legge til følgende Maven-oppføring:
org.beykery neuroph 2.92
Den nyeste versjonen finner du på Maven Central.
3. Nøkkelklasser og begreper
Alle de grunnleggende konseptuelle byggesteinene som brukes har tilsvarende Java-klasser.
Nevroner er koblet til Lag som deretter grupperes i NeuralNetworks. NeuralNetworks blir deretter trent ved hjelp av LearningRules og Datasett.
3.1. Neuron
De Neuron klasse har fire primære attributter:
- inputConnection: vektede forbindelser mellom Nevroner
- inputFunction: spesifiserer vekter og vektorsummer brukes på innkommende tilkoblingsdata
- overføringsfunksjon: spesifiserer vekter og vektorsummer brukt på utgående data
- produksjon: utgangsverdien som følge av anvendelsen av transferFunctions og inputFunctions til en inputConnection
Til sammen etablerer de fire primære attributtene atferden:
output = transferFunction (inputFunction (inputConnections));
3.2. Lag
Lag er egentlig grupper av Nevroner slik at hver Neuron i Lag er (vanligvis) bare forbundet med Nevroner i forrige og påfølgende Lag.
LagGi derfor informasjon mellom dem gjennom de vektede funksjonene som finnes på deres Nevroner.
Nevroner kan legges til lag: Superklassen på toppnivå Nevrale nettverket er underklassert i flere kjente typer kunstige nevrale nettverk inkludert konvolusjonelle nevrale nettverk (underklasse ConvolutionalNetwork), Hopfield nevrale nettverk (underklasse Hopfield), og flerlags perceptron nevrale nettverk (underklasse MultilayerPerceptron). Alle NeuralNetworks er sammensatt av Lag som vanligvis er organisert i en trikotomi: Hvis vi bruker konstruktøren til en underklasse av Nevrale nettverket (som for eksempel Perceptron), kan vi passere Lags, antall Neurons for hver Lag, og indeksen deres ved hjelp av denne enkle metoden: Noen ganger vil vi gjøre dette manuelt (og det er godt å se hva som skjer under panseret). Den grunnleggende operasjonen for å legge til en Lag til en Nevrale nettverket oppnås slik: Det første argumentet spesifiserer indeksen til Lag i Nevrale nettverket; det andre argumentet spesifiserer Lag seg selv. Lag manuelt lagt til skal kobles til ved hjelp av ConnectionFactory klasse: Den første og siste Lag skal også kobles til: Husk at styrken og kraften til en Nevrale nettverket er i stor grad avhengig av: NeuralNetworks er trent ved hjelp av Datasett og LearningRule klasser. Datasett brukes til å representere og levere informasjonen som skal læres eller brukes til å trene Nevrale nettverket. Datasett er preget av sine inngangsstørrelse, outputsize, og rader (DataSetRow). LearningRule angir måten Datasett blir undervist eller trent av Nevrale nettverket. Underklasser av LearningRule inkludere BackPropagation og Overvåket læring. La oss nå sette disse byggesteinene sammen til et reelt eksempel. Vi begynner med kombinere flere lag sammen til det kjente inngangslaget, skjult lag, og utgangslaget mønster eksemplifisert av de fleste nevrale nettverksarkitekturer. Vi monterer våre Nevrale nettverket ved å kombinere fire lag. Målet vårt er å bygge en (2, 4, 4, 1) Nevrale nettverket. La oss først definere inngangslaget vårt: Deretter implementerer vi skjult lag ett: Og skjult lag to: Til slutt definerer vi utgangslaget vårt: Deretter kan vi sette dem sammen til en Nevrale nettverket: For treningsformål, la oss sette sammen en Datasett ved å spesifisere størrelsen på både inngangs- og resulterende utgangsvektor: Vi legger til en elementær rad i vår Datasett overholdelse av inngangs- og utgangsbegrensningene som er definert ovenfor - vårt mål i dette eksemplet er å lære nettverket vårt å utføre grunnleggende XOR (eksklusive eller) operasjoner: Neste, la oss trene vår Nevrale nettverket med den innebygde BackPropogation LearningRule: Nå som vår Nevrale nettverket er trent opp, la oss teste det ut. For hvert par logiske verdier overført til vårt Datasett som en DataSetRow, kjører vi følgende type test: En viktig ting å huske er at NeuralNetworks bare mat ut en verdi på det inkluderende intervallet 0 og 1. For å levere en annen verdi, må vi normalisere og denormalisere våre data. I dette tilfellet, for logiske operasjoner, er 0 og 1 perfekt for jobben. Resultatet blir: Vi ser at vår Nevrale nettverket spår vellykket riktig svar! Vi har nettopp gjennomgått de grunnleggende konseptene og klassene som brukes av Neuroph. Mer informasjon om dette biblioteket er tilgjengelig her, og kodeeksemplene som brukes i denne artikkelen finner du på GitHub.Laglag = nytt Lag (); layer.addNeuron (n);
3.3. Nevrale nettverket
NeuralNetwork ann = ny Perceptron (2, 4, 1);
NeuralNetwork ann = nytt NeuralNetwork (); Laglag = nytt Lag (); ann.addLayer (0, lag); ann.setInputNeurons (layer.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 av vår Nevrale nettverket
int inputSize = 2; int outputSize = 1; Datasett ds = nytt datasett (inputSize, outputSize); DataSetRow rOne = ny DataSetRow (ny dobbel [] {0, 0}, ny dobbel [] {0}); ds.addRow (rOne); DataSetRow rTwo = ny DataSetRow (ny dobbel [] {1, 1}, ny dobbel [] {0}); ds.addRow (rTwo);
NeuralNetwork ann = nytt NeuralNetwork (); // ... BackPropagation backPropagation = ny BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4. Sette det hele sammen
4.1. Lag
Layer inputLayer = nytt lag (); inputLayer.addNeuron (new Neuron ()); inputLayer.addNeuron (new Neuron ());
Layer hiddenLayerOne = nytt lag (); hiddenLayerOne.addNeuron (new Neuron ()); hiddenLayerOne.addNeuron (new Neuron ()); hiddenLayerOne.addNeuron (new Neuron ()); hiddenLayerOne.addNeuron (new Neuron ());
Layer hiddenLayerTwo = nytt lag (); hiddenLayerTwo.addNeuron (new Neuron ()); hiddenLayerTwo.addNeuron (nye Neuron ()); hiddenLayerTwo.addNeuron (new Neuron ()); hiddenLayerTwo.addNeuron (new Neuron ());
Layer outputLayer = nytt lag (); outputLayer.addNeuron (nye Neuron ());
4.2. Nevrale nettverket
NeuralNetwork ann = nytt 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. Opplæring
int inputSize = 2; int outputSize = 1; Datasett ds = nytt datasett (inputSize, outputSize);
DataSetRow rOne = ny DataSetRow (ny dobbel [] {0, 1}, ny dobbel [] {1}); ds.addRow (rOne); DataSetRow rTwo = ny DataSetRow (ny dobbel [] {1, 1}, ny dobbel [] {0}); ds.addRow (rTwo); DataSetRow rThree = ny DataSetRow (ny dobbel [] {0, 0}, ny dobbel [] {0}); ds.addRow (rThree); DataSetRow rFour = ny DataSetRow (ny dobbel [] {1, 0}, ny dobbel [] {1}); ds.addRow (rFour);
BackPropagation backPropagation = ny BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4.4. Testing
ann.setInput (0, 1); ann.calculate (); dobbelt [] networkOutputOne = ann.getOutput ();
Testing: 1, 0 Forventet: 1.0 Resultat: 1.0 Testing: 0, 1 Forventet: 1.0 Resultat: 1.0 Testing: 1, 1 Forventet: 0.0 Resultat: 0.0 Testing: 0, 0 Forventet: 0.0 Resultat: 0.0
5. Konklusjon