Neurophの概要
1. 前書き
この記事では、ニューラルネットワークを作成して機械学習を利用するためのオープンソースライブラリであるNeurophについて説明します。
この記事では、核となる概念と、それをすべてまとめる方法に関するいくつかの例を見ていきます。
2. ニューロフ
以下を使用してNeurophと対話できます。
-
GUIベースのツール
-
Javaライブラリ
どちらのアプローチも、neuronsの層から人工ニューラルネットワークを構築する基礎となるクラス階層に依存しています。
プログラムの側面に焦点を当てますが、NeurophのGUIベースのアプローチからいくつかの共有クラスを参照して、私たちが行っていることを明確にします。
GUIベースのアプローチの詳細については、Neurophdocumentationを参照してください。
2.1. 依存関係
Neurophを使用するには、次のMavenエントリを追加する必要があります。
org.beykery
neuroph
2.92
最新バージョンはon Maven Centralで見つけることができます。
3. 主要なクラスと概念
使用されるすべての基本的な概念構成ブロックには、対応するJavaクラスがあります。
NeuronsはLayersに接続され、NeuralNetworksにグループ化されます。 その後、NeuralNetworksはLearningRulesとDataSetsを使用してトレーニングされます。
3.1. Neuron
Neuronクラスには、次の4つの主要な属性があります。
-
Neurons間のinputConnection:加重接続
-
inputFunction:は、着信接続データに適用されるweightsおよびvector sumsを指定します
-
transferFunction:は、発信データに適用されるweightsおよびvector sumsを指定します__
-
output:transferFunctionsおよびinputFunctionsをinputConnectionに適用した結果の出力値
これらの4つの主要な属性を合わせて動作を確立します。
output = transferFunction(inputFunction(inputConnections));
3.2. Layer
Layerの各Neuronが(通常)前後のLayersのNeuronsにのみ接続されるようなLayers are essentially groupings of Neurons。
したがって、Layersは、Neuronsに存在する重み付き関数を介してそれらの間で情報を渡します。
Neuronsはレイヤーに追加できます:__
Layer layer = new Layer();
layer.addNeuron(n);
3.3. NeuralNetwork
トップレベルのスーパークラスNeuralNetworkは、畳み込みニューラルネットワーク(サブクラスConvolutionalNetwork)、ホップフィールドニューラルネットワーク(サブクラスHopfield)、多層パーセプトロンニューラルネットワークなど、いくつかのよく知られた種類の人工ニューラルネットワークにサブクラス化されています。 (サブクラスMultilayerPerceptron)。
通常、三分法に編成されるAll NeuralNetworks are composed of Layers:
-
入力層
-
隠れ層
-
出力層
NeuralNetworkのサブクラス(Perceptronなど)のコンストラクターを使用している場合は、各LayerのNeuronsの数であるLayersを渡すことができます。 、およびこの単純な方法を使用したそれらのインデックス:
NeuralNetwork ann = new Perceptron(2, 4, 1);
これを手動で実行したい場合があります(そして、内部で何が起こっているかを確認するのは良いことです)。 LayerをNeuralNetworkに追加する基本的な操作は、次のように実行されます。
NeuralNetwork ann = new NeuralNetwork();
Layer layer = new Layer();
ann.addLayer(0, layer);
ann.setInputNeurons(layer.getNeurons());
最初の引数は、NeuralNetwork内のLayerのインデックスを指定します。 2番目の引数は、Layer自体を指定します。 手動で追加されたLayersは、ConnectionFactoryクラスを使用して接続する必要があります。
ann.addLayer(0, inputLayer);
ann.addLayer(1, hiddenLayerOne);
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));
最初と最後のLayerも接続する必要があります。
ConnectionFactory.fullConnect(ann.getLayerAt(0),
ann.getLayerAt(ann.getLayersCount() - 1), false);
ann.setOutputNeurons(ann.getLayerAt(
ann.getLayersCount() - 1).getNeurons());
NeuralNetworkの強度とパワーは、主に以下に依存することに注意してください。
-
NeuralNetwork内のLayersの数
-
各LayerのNeuronsの数(およびそれらの間のweighted functions)、および
-
トレーニングアルゴリズムの有効性/DataSetの精度
3.4. NeuralNetworkのトレーニング
NeuralNetworksは、DataSetクラスとLearningRuleクラスを使用してトレーニングされます。
DataSetは、NeuralNetworkをトレーニングするために学習または使用される情報を表し、提供するために使用されます。 DataSetsは、input size, outputsize,と行(DataSetRow).によって特徴付けられます。
int inputSize = 2;
int outputSize = 1;
DataSet ds = new DataSet(inputSize, outputSize);
DataSetRow rOne
= new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rOne);
DataSetRow rTwo
= new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);
LearningRuleは、DataSetがNeuralNetworkによってティーチまたはトレーニングされる方法を指定します。 LearningRuleのサブクラスには、BackPropagationとSupervisedLearningが含まれます。
NeuralNetwork ann = new NeuralNetwork();
//...
BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);
4. すべてを一緒に入れて
それでは、これらの構成要素を実際の例にまとめましょう。 まず、ほとんどのニューラルネットワークアーキテクチャで例示されているcombining several layers together into the familiar input layer, hidden layer, and output layer patternから始めます。
4.1. レイヤー
4つのレイヤーを組み合わせてNeuralNetworkを組み立てます。 私たちの目標は、(2、4、4、1)NeuralNetwork.を構築することです
まず、入力レイヤーを定義しましょう。
Layer inputLayer = new Layer();
inputLayer.addNeuron(new Neuron());
inputLayer.addNeuron(new Neuron());
次に、隠れ層1を実装します。
Layer hiddenLayerOne = new Layer();
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
そして隠されたレイヤー2:
Layer hiddenLayerTwo = new Layer();
hiddenLayerTwo.addNeuron(new Neuron());
hiddenLayerTwo.addNeuron(new Neuron());
hiddenLayerTwo.addNeuron(new Neuron());
hiddenLayerTwo.addNeuron(new Neuron());
最後に、出力レイヤーを定義します。
Layer outputLayer = new Layer();
outputLayer.addNeuron(new Neuron());
4.2. NeuralNetwork
次に、それらをまとめてNeuralNetworkにすることができます。
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), false);
ann.setInputNeurons(inputLayer.getNeurons());
ann.setOutputNeurons(outputLayer.getNeurons());
4.3. トレーニング
トレーニングの目的で、入力ベクトルと結果の出力ベクトルの両方のサイズを指定して、DataSetをまとめましょう。
int inputSize = 2;
int outputSize = 1;
DataSet ds = new DataSet(inputSize, outputSize);
上で定義した入力および出力制約に準拠する基本行をDataSetに追加します。この例の目標は、基本的なXOR(排他的論理和)演算を実行するようにネットワークに教えることです。
DataSetRow rOne
= new DataSetRow(new double[] {0, 1}, new double[] {1});
ds.addRow(rOne);
DataSetRow rTwo
= new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);
DataSetRow rThree
= new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rThree);
DataSetRow rFour
= new DataSetRow(new double[] {1, 0}, new double[] {1});
ds.addRow(rFour);
次に、組み込みのBackPropogation LearningRuleを使用してNeuralNetworkをトレーニングしましょう。
BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);
4.4. テスト
NeuralNetworkがトレーニングされたので、テストしてみましょう。 DataSetにDataSetRowとして渡された論理値の各ペアに対して、次の種類のテストを実行します。
ann.setInput(0, 1);
ann.calculate();
double[] networkOutputOne = ann.getOutput();
覚えておくべき重要なことは、NeuralNetworks only output a value on the inclusive interval of 0 and 1です。 他の値を出力するには、データをnormalizeおよびdenormalizeする必要があります。
この場合、論理演算の場合、0と1がジョブに最適です。 出力は次のようになります。
Testing: 1, 0 Expected: 1.0 Result: 1.0
Testing: 0, 1 Expected: 1.0 Result: 1.0
Testing: 1, 1 Expected: 0.0 Result: 0.0
Testing: 0, 0 Expected: 0.0 Result: 0.0
NeuralNetworkが正しい答えを正しく予測していることがわかります。
5. 結論
Neurophで使用される基本的な概念とクラスを確認しました。
このライブラリの詳細については、hereを参照してください。この記事で使用されているコード例は、over on GitHubにあります。