Bevezetés a Neuroph-ba

1. Bemutatkozás

Ez a cikk a Neuroph - egy nyílt forráskódú könyvtárat veszi szemügyre neurális hálózatok létrehozásához és a gépi tanulás hasznosításához.

A cikkben áttekintjük az alapfogalmakat és számos példát, hogyan lehet mindezt összerakni.

2. Neuroph

Kölcsönhatásba léphetünk a Neuroph-tal:

  • egy GUI-alapú eszköz
  • Java könyvtár

Mindkét megközelítés egy mögöttes osztályhierarchiára támaszkodik, amely mesterséges neurális hálózatokat épít ki a rétegekből idegsejtek.

Összpontosítunk a programozási oldalra, de a Neuroph GUI-alapú megközelítéséből több megosztott osztályra fogunk hivatkozni, hogy tisztázzuk, mit csinálunk.

A GUI-alapú megközelítésről további információt a Neuroph dokumentációjában talál.

2.1. Függőségek

A Neuroph használatának megadásához hozzá kell adnunk a következő Maven bejegyzést:

 org.beykery neuroph 2.92 

A legfrissebb verzió a Maven Central oldalon található.

3. Kulcsosztályok és fogalmak

A felhasznált alapvető fogalmi építőelemek mindegyike rendelkezik megfelelő Java osztályokkal.

Neuronok kapcsolódnak Rétegek amelyeket aztán csoportosítanak NeuralNetworks. NeuralNetworks később képzik LearningRules és DataSets.

3.1. Idegsejt

A Idegsejt osztály négy elsődleges tulajdonsággal rendelkezik:

  1. inputConnection: között súlyozott összefüggések Neuronok
  2. inputFunction: meghatározza súlyok és vektor összegek a bejövő csatlakozási adatokra alkalmazva
  3. átviteli funkció: meghatározza súlyok és vektor összegek kimenő adatokra alkalmazzák

  4. Kimenet: A kimenet értéke a transferFunctions és inputFunctions egy inputConnection

Ez a négy elsődleges tulajdonság együttesen állapítja meg a viselkedést:

kimenet = transferFunction (inputFunction (inputConnections));

3.2. Réteg

Rétegek lényegében a Neuronok olyan, hogy mindegyik Neuron ban,-ben Réteg (általában) csak azzal kapcsolódik Neuronok az előző és az azt követő Rétegek.

Rétegek, ezért információt továbbítanak közöttük a súlyozott függvényeken keresztül Neuronok.

Neuronok rétegekhez adható:

Réteg réteg = new Layer (); réteg.addNeuron (n);

3.3. Neurális hálózat

A legfelső szintű szuperosztály Neurális hálózat a mesterséges ideghálózatok számos ismert típusába sorolható, ideértve a konvolúciós ideghálózatokat is (alosztály) ConvolutionalNetwork), Hopfield idegi hálózatok (alosztály) Hopfield), és a többrétegű perceptron neurális hálózatok (alosztály) MultilayerPerceptron).

Minden NeuralNetworks áll Rétegek amelyeket rendszerint trichotómiára szerveznek:

  1. bemeneti rétegek
  2. rejtett rétegek
  3. kimeneti rétegek

Ha egy alosztály konstruktorát használjuk Neurális hálózat (mint például Perceptron), átadhatjuk a Rétegs, a szám Idegsejts mindegyikre Rétegés indexük ezzel az egyszerű módszerrel:

NeuralNetwork ann = új Perceptron (2, 4, 1);

Néha ezt manuálisan is meg akarjuk tenni (és jó látni, hogy mi történik a motorháztető alatt). Az alapművelet a Réteg a Neurális hálózat így teljesül:

NeuralNetwork ann = new NeuralNetwork (); Réteg réteg = new Layer (); ann.addLayer (0, réteg); ann.setInputNeurons (layer.getNeurons ()); 

Az első argumentum meghatározza a Réteg ban,-ben Neurális hálózat; a második érv a Réteg maga. Rétegek a manuálisan hozzáadottakat a ConnectionFactory osztály:

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

Az első és az utolsó Réteg csatlakozni kell:

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

Ne feledje, hogy az a Neurális hálózat nagyban függenek:

  1. száma Rétegek ban,-ben Neurális hálózat
  2. száma Neuronok az összesben Réteg (és a súlyozott függvények közöttük), és
  3. - a képzési algoritmusok hatékonysága / a DataSet

3.4. Képzés a Neurális hálózat

NeuralNetworks képezik a DataSet és LearningRule osztályok.

DataSet a megtanulandó vagy a tanfolyam felhasználására szolgáló információk képviseletére és továbbítására szolgál Neurális hálózat. DataSets azok jellemzik bemeneti méret, outputsize, és sorok (DataSetRow).

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

LearningRule meghatározza a DataSet tanítja vagy képzi a Neurális hálózat. Alosztályai LearningRule tartalmazza BackPropagation és SupervisedLearning.

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

4. Az összes összerakása

Most állítsuk össze ezeket az építőelemeket valódi példaként. Kezdjük több réteget ötvözve az ismerőssé bemeneti réteg, rejtett réteg, és kimeneti réteg minta a legtöbb neurális hálózati architektúra példája.

4.1. Rétegek

Összeszereljük Neurális hálózat négy réteg kombinálásával. Célunk egy (2, 4, 4, 1) felépítése Neurális hálózat.

Először határozzuk meg a bemeneti réteget:

Layer inputLayer = new Layer (); inputLayer.addNeuron (új Neuron ()); inputLayer.addNeuron (új Neuron ());

Ezután megvalósítjuk az első rejtett réteget:

Layer hiddenLayerOne = new Layer (); hiddenLayerOne.addNeuron (új Neuron ()); hiddenLayerOne.addNeuron (új Neuron ()); hiddenLayerOne.addNeuron (új Neuron ()); hiddenLayerOne.addNeuron (új Neuron ());

És a rejtett második réteg:

Layer hiddenLayerTwo = new Layer (); hiddenLayerTwo.addNeuron (új Neuron ()); hiddenLayerTwo.addNeuron (új Neuron ()); hiddenLayerTwo.addNeuron (új Neuron ()); hiddenLayerTwo.addNeuron (új Neuron ());

Végül meghatározzuk a kimeneti réteget:

Layer outputLayer = new Layer (); outputLayer.addNeuron (új Neuron ()); 

4.2. Neurális hálózat

Ezután összerakhatjuk őket a Neurális hálózat:

NeuralNetwork ann = new 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), hamis); ann.setInputNeurons (inputLayer.getNeurons ()); ann.setOutputNeurons (outputLayer.getNeurons ());

4.3. Kiképzés

Képzési célokból állítsuk össze a DataSet a bemeneti és a kapott kimeneti vektor méretének megadásával:

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

Hozzáadunk egy elemi sort a sajátunkhoz DataSet betartva a fent definiált bemeneti és kimeneti korlátokat - ebben a példában az a célunk, hogy megtanítsuk hálózatunkat alapvető XOR (kizárólagos vagy) műveletek elvégzésére:

DataSetRow rOne = új DataSetRow (új dupla [] {0, 1}, új dupla [] {1}); ds.addRow (rOne); DataSetRow rTwo = új DataSetRow (új dupla [] {1, 1}, új dupla [] {0}); ds.addRow (rTwo); DataSetRow rThree = új DataSetRow (új dupla [] {0, 0}, új dupla [] {0}); ds.addRow (rThree); DataSetRow rFour = új DataSetRow (új dupla [] {1, 0}, új dupla [] {1}); ds.addRow (rFour);

Ezután képezzük ki Neurális hálózat a beépítettel BackPropogation LearningRule:

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

4.4. Tesztelés

Most, hogy a mi Neurális hálózat fel van képezve, próbáljuk ki. Minden egyes logikai értékpárra, amely átkerül a miénkbe DataSet mint a DataSetRow, a következő típusú tesztet hajtjuk végre:

ann.setInput (0, 1); ann.számolja (); double [] networkOutputOne = ann.getOutput (); 

Fontos megjegyezni, hogy NeuralNetworks csak 0 és 1 közötti intervallumon adjon meg értéket. Valamely más érték kimenetéhez meg kell adnunk normalizálni és denormalizálni adataink.

Ebben az esetben a logikai műveletekhez a 0 és az 1 tökéletes a munkához. A kimenet a következő lesz:

Tesztelés: 1, 0 Várható: 1,0 Eredmény: 1,0 Tesztelés: 0, 1 Várható: 1,0 Eredmény: 1,0 Tesztelés: 1, 1 Várható: 0,0 Eredmény: 0,0 Tesztelés: 0, 0 Várható: 0,0 Eredmény: 0,0 

Látjuk, hogy a mi Neurális hálózat sikeresen megjósolja a helyes választ!

5. Következtetés

Most áttekintettük a Neuroph által használt alapfogalmakat és osztályokat.

A könyvtárral kapcsolatos további információk itt érhetők el, és az ebben a cikkben használt kódpéldák megtalálhatók a GitHub oldalon.


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