Ú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:
- inputConnection: vážené spojenia medzi Neuróny
- vstupná funkcia: upresňuje závažia a vektorové sumy sa použije na údaje prichádzajúceho spojenia
- funkcia prenosu: upresňuje závažia a vektorové sumy použité na odchádzajúce údaje
- 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: 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: 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: 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: 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: Prvý a posledný Vrstva by mali byť tiež pripojení: Pamätajte, že sila a sila a NeuralNetwork do veľkej miery závisia od: 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). 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. 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í. 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: Ďalej implementujeme skrytú vrstvu jedna: A skrytá vrstva dve: Nakoniec definujeme našu výstupnú vrstvu: Ďalej ich môžeme spojiť do a NeuralNetwork: 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: 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): Ďalej trénujme naše NeuralNetwork so zabudovaným BackPropogation LearningRule: 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: 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: Vidíme, že náš NeuralNetwork úspešne predpovedá správnu odpoveď! 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.Layer layer = new Layer (); vrstva.addNeuron (n);
3.3. NeuralNetwork
NeuralNetwork ann = nový Perceptron (2, 4, 1);
NeuralNetwork ann = nová NeuralNetwork (); Layer layer = new Layer (); ann.addLayer (0, vrstva); 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. Školenie našich NeuralNetwork
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);
NeuralNetwork ann = nová NeuralNetwork (); // ... BackPropagation backPropagation = new BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4. Dáme všetko dohromady
4.1. Vrstvy
Layer inputLayer = new Layer (); inputLayer.addNeuron (nový Neuron ()); inputLayer.addNeuron (nový Neuron ());
Layer hiddenLayerOne = nová vrstva (); hiddenLayerOne.addNeuron (nový Neuron ()); hiddenLayerOne.addNeuron (nový Neuron ()); hiddenLayerOne.addNeuron (nový Neuron ()); hiddenLayerOne.addNeuron (nový Neuron ());
Layer hiddenLayerTwo = nová vrstva (); hiddenLayerTwo.addNeuron (nový Neuron ()); hiddenLayerTwo.addNeuron (nový Neuron ()); hiddenLayerTwo.addNeuron (nový Neuron ()); hiddenLayerTwo.addNeuron (nový Neuron ());
Layer outputLayer = new Layer (); outputLayer.addNeuron (nový Neuron ());
4.2. 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
int inputSize = 2; int outputSize = 1; DataSet ds = new DataSet (inputSize, outputSize);
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);
BackPropagation backPropagation = nový BackPropagation (); backPropagation.setMaxIterations (1000); ann.learn (ds, backPropagation);
4.4. Testovanie
ann.setInput (0, 1); ann.calculate (); double [] networkOutputOne = ann.getOutput ();
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
5. Záver