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:
- inputConnection: között súlyozott összefüggések Neuronok
- inputFunction: meghatározza súlyok és vektor összegek a bejövő csatlakozási adatokra alkalmazva
- átviteli funkció: meghatározza súlyok és vektor összegek kimenő adatokra alkalmazzák
- 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ó: 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: 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: 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: 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: Az első és az utolsó Réteg csatlakozni kell: Ne feledje, hogy az a Neurális hálózat nagyban függenek: 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). LearningRule meghatározza a DataSet tanítja vagy képzi a Neurális hálózat. Alosztályai LearningRule tartalmazza BackPropagation és SupervisedLearning. 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. Ö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: Ezután megvalósítjuk az első rejtett réteget: És a rejtett második réteg: Végül meghatározzuk a kimeneti réteget: Ezután összerakhatjuk őket a Neurális hálózat: Képzési célokból állítsuk össze a DataSet a bemeneti és a kapott kimeneti vektor méretének megadásával: 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: Ezután képezzük ki Neurális hálózat a beépítettel BackPropogation LearningRule: 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: 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: Látjuk, hogy a mi Neurális hálózat sikeresen megjósolja a helyes választ! 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.Réteg réteg = new Layer (); réteg.addNeuron (n);
3.3. Neurális hálózat
NeuralNetwork ann = új Perceptron (2, 4, 1);
NeuralNetwork ann = new NeuralNetwork (); Réteg réteg = new Layer (); ann.addLayer (0, réteg); 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), hamis); ann.setOutputNeurons (ann.getLayerAt (ann.getLayersCount () - 1) .getNeurons ());
3.4. Képzés a Neurális hálózat
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);
NeuralNetwork ann = new NeuralNetwork (); // ... BackPropagation backPropagation = new BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4. Az összes összerakása
4.1. Rétegek
Layer inputLayer = new Layer (); inputLayer.addNeuron (új Neuron ()); inputLayer.addNeuron (új Neuron ());
Layer hiddenLayerOne = new Layer (); hiddenLayerOne.addNeuron (új Neuron ()); hiddenLayerOne.addNeuron (új Neuron ()); hiddenLayerOne.addNeuron (új Neuron ()); hiddenLayerOne.addNeuron (új Neuron ());
Layer hiddenLayerTwo = new Layer (); hiddenLayerTwo.addNeuron (új Neuron ()); hiddenLayerTwo.addNeuron (új Neuron ()); hiddenLayerTwo.addNeuron (új Neuron ()); hiddenLayerTwo.addNeuron (új Neuron ());
Layer outputLayer = new Layer (); outputLayer.addNeuron (új Neuron ());
4.2. 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
int inputSize = 2; int outputSize = 1; DataSet ds = új DataSet (inputSize, outputSize);
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);
BackPropagation backPropagation = új BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4.4. Tesztelés
ann.setInput (0, 1); ann.számolja (); double [] networkOutputOne = ann.getOutput ();
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
5. Következtetés