Úvod do Neuroph

1. Úvod

Tento článok sa zameriava na Neuroph - knižnicu open source na vytváranie neurónových sietí a využitie strojového učenia.

V článku sa pozrieme na základné koncepty a niekoľko príkladov, ako to dať všetko dohromady.

2. Neurof

S Neurophom môžeme interagovať pomocou:

  • nástroj založený na grafickom používateľskom rozhraní
  • knižnica Java

Oba prístupy sa spoliehajú na základnú hierarchiu tried, ktorá z vrstiev vytvára umelé neurónové siete neurónov.

Zameriame sa na programovú stránku, ale budeme sa odvolávať na niekoľko zdieľaných tried z prístupu Neuroph založeného na GUI, aby sme objasnili, čo robíme.

Viac informácií o prístupe založenom na grafickom používateľskom rozhraní sa dozviete v dokumentácii Neuroph.

2.1. Závislosti

Ak chcete používať Neuroph, musíme pridať nasledujúci záznam Maven:

 org.beykery neuroph 2,92 

Najnovšiu verziu nájdete na serveri Maven Central.

3. Kľúčové triedy a koncepty

Všetky použité základné koncepčné stavebné bloky majú zodpovedajúce triedy Java.

Neuróny sú pripojení k Vrstvy ktoré sa potom zoskupia do Neurálne siete. Neurálne siete sú následne vyškolení pomocou LearningRules a Množiny údajov.

3.1. Neurón

The Neurón trieda má štyri primárne atribúty:

  1. inputConnection: vážené spojenia medzi Neuróny
  2. vstupná funkcia: upresňuje závažia a vektorové sumy sa použije na údaje prichádzajúceho spojenia
  3. funkcia prenosu: upresňuje závažia a vektorové sumy použité na odchádzajúce údaje

  4. výkon: výstupná hodnota vyplývajúca z použitia transferFunctions a inputFunctions do an inputConnection

Spoločne tieto štyri základné atribúty určujú správanie:

output = transferFunction (inputFunction (inputConnections));

3.2. Vrstva

Vrstvy sú v podstate zoskupenia Neuróny také, že každý Neuron v Vrstva je (zvyčajne) spojený iba s Neuróny v predchádzajúcom a nasledujúcom Vrstvy.

Vrstvy, preto medzi nimi prenášajte informácie prostredníctvom vážených funkcií, ktoré na nich existujú Neuróny.

Neuróny je možné pridať do vrstiev:

Layer layer = new Layer (); vrstva.addNeuron (n);

3.3. NeuralNetwork

Supertrieda najvyššej úrovne NeuralNetwork je podtrieda do niekoľkých známych druhov umelých neurónových sietí vrátane konvolučných neurónových sietí (podtrieda Konvolučná sieť), Hopfieldove neurónové siete (podtrieda Hopfield) a viacvrstvové perceptrónové neurónové siete (podtrieda Viacvrstvový Perceptron).

Všetky Neurálne siete sú zložené z Vrstvy ktoré sa zvyčajne organizujú do trichotómie:

  1. vstupné vrstvy
  2. skryté vrstvy
  3. výstupné vrstvy

Ak používame konštruktor podtriedy NeuralNetwork (ako napr Perceptron), môžeme prejsť Vrstvas, počet Neuróns pre každého Vrstvaa ich index pomocou tejto jednoduchej metódy:

NeuralNetwork ann = nový Perceptron (2, 4, 1);

Niekedy to budeme chcieť urobiť manuálne (a je dobré sledovať, čo sa deje pod kapotou). Základná operácia pre pridanie a Vrstva do a NeuralNetwork sa dosahuje takto:

NeuralNetwork ann = nová NeuralNetwork (); Layer layer = new Layer (); ann.addLayer (0, vrstva); ann.setInputNeurons (layer.getNeurons ()); 

Prvý argument určuje index súboru Vrstva v NeuralNetwork; druhý argument špecifikuje Vrstva sám. Vrstvy pridané manuálne by mali byť pripojené pomocou ConnectionFactory trieda:

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

Prvý a posledný Vrstva by mali byť tiež pripojení:

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

Pamätajte, že sila a sila a NeuralNetwork do veľkej miery závisia od:

  1. počet Vrstvy v NeuralNetwork
  2. počet Neuróny v každom Vrstva (a vážené funkcie medzi nimi) a
  3. účinnosť výcvikových algoritmov / presnosť systému Množina údajov

3.4. Školenie našich NeuralNetwork

Neurálne siete sú vyškolení pomocou Množina údajov a LearningRule triedy.

Množina údajov sa používa na zastupovanie a poskytnutie informácií, ktoré sa majú naučiť, alebo na školenie NeuralNetwork. Množiny údajov sa vyznačujú svojimi vstupná veľkosť, výstupná veľkosť, a riadky (DataSetRow).

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

LearningRule určuje spôsob Množina údajov je vyučovaný alebo trénovaný organizáciou NeuralNetwork. Podtriedy LearningRule zahrnúť Spätné šírenie a SupervisedLearning.

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

4. Dáme všetko dohromady

Poďme tieto stavebné kamene spojiť do skutočného príkladu. Začneme tým spojením niekoľkých vrstiev do známeho vstupná vrstva, skrytá vrstvaa výstupná vrstva vzor príkladom je väčšina architektúr neurónových sietí.

4.1. Vrstvy

Zostavíme naše NeuralNetwork spojením štyroch vrstiev. Naším cieľom je postaviť (2, 4, 4, 1) NeuralNetwork.

Najprv definujeme našu vstupnú vrstvu:

Layer inputLayer = new Layer (); inputLayer.addNeuron (nový Neuron ()); inputLayer.addNeuron (nový Neuron ());

Ďalej implementujeme skrytú vrstvu jedna:

Layer hiddenLayerOne = nová vrstva (); hiddenLayerOne.addNeuron (nový Neuron ()); hiddenLayerOne.addNeuron (nový Neuron ()); hiddenLayerOne.addNeuron (nový Neuron ()); hiddenLayerOne.addNeuron (nový Neuron ());

A skrytá vrstva dve:

Layer hiddenLayerTwo = nová vrstva (); hiddenLayerTwo.addNeuron (nový Neuron ()); hiddenLayerTwo.addNeuron (nový Neuron ()); hiddenLayerTwo.addNeuron (nový Neuron ()); hiddenLayerTwo.addNeuron (nový Neuron ());

Nakoniec definujeme našu výstupnú vrstvu:

Layer outputLayer = new Layer (); outputLayer.addNeuron (nový Neuron ()); 

4.2. NeuralNetwork

Ďalej ich môžeme spojiť do a NeuralNetwork:

NeuralNetwork ann = nová 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. Školenie

Na účely tréningu poďme spolu a Množina údajov zadaním veľkosti vstupného aj výsledného výstupného vektora:

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

Pridáme elementárny riadok do nášho Množina údajov dodržiavanie vyššie definovaných vstupných a výstupných obmedzení - naším cieľom v tomto príklade je naučiť našu sieť robiť základné operácie XOR (exkluzívne alebo):

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

Ďalej trénujme naše NeuralNetwork so zabudovaným BackPropogation LearningRule:

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

4.4. Testovanie

Teraz, keď naše NeuralNetwork je trénovaný, poďme to vyskúšať. Pre každú dvojicu logických hodnôt odovzdaných do našej Množina údajov ako DataSetRow, spustíme nasledujúci druh testu:

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

Je dôležité pamätať na to Neurálne siete vypíše iba hodnotu v intervale 0 a 1. Aby sme dostali nejakú inú hodnotu, musíme normalizovať a denormalizovať naše údaje.

V tomto prípade sú pre logické operácie ideálne 0 a 1. Výstupom bude:

Testovanie: 1, 0 Očakávané: 1,0 Výsledok: 1,0 Testovanie: 0, 1 Očakávané: 1,0 Výsledok: 1,0 Testovanie: 1, 1 Očakávané: 0,0 Výsledok: 0,0 Testovanie: 0, 0 Očakávané: 0,0 Výsledok: 0,0 

Vidíme, že náš NeuralNetwork úspešne predpovedá správnu odpoveď!

5. Záver

Práve sme si preštudovali základné koncepty a triedy, ktoré používa Neuroph.

Ďalšie informácie o tejto knižnici sú k dispozícii tu a príklady kódov použitých v tomto článku nájdete na GitHub.


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