Neurophの紹介

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クラスがあります。

NeuronsLayersに接続され、NeuralNetworksにグループ化されます。 その後、NeuralNetworksLearningRulesDataSetsを使用してトレーニングされます。

3.1. Neuron

Neuronクラスには、次の4つの主要な属性があります。

  1. Neurons間のinputConnection:加重接続

  2. inputFunction:は、着信接続データに適用されるweightsおよびvector sumsを指定します

  3. transferFunction:は、発信データに適用されるweightsおよびvector sumsを指定します__

  4. output:transferFunctionsおよびinputFunctionsinputConnectionに適用した結果の出力値

これらの4つの主要な属性を合わせて動作を確立します。

output = transferFunction(inputFunction(inputConnections));

3.2. Layer

Layerの各Neuronが(通常)前後のLayersNeuronsにのみ接続されるような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

  1. 入力層

  2. 隠れ層

  3. 出力層

NeuralNetworkのサブクラス(Perceptronなど)のコンストラクターを使用している場合は、各LayerNeuronsの数であるLayersを渡すことができます。 、およびこの単純な方法を使用したそれらのインデックス:

NeuralNetwork ann = new Perceptron(2, 4, 1);

これを手動で実行したい場合があります(そして、内部で何が起こっているかを確認するのは良いことです)。 LayerNeuralNetworkに追加する基本的な操作は、次のように実行されます。

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の強度とパワーは、主に以下に依存することに注意してください。

  1. NeuralNetwork内のLayersの数

  2. LayerNeuronsの数(およびそれらの間のweighted functions)、および

  3. トレーニングアルゴリズムの有効性/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は、DataSetNeuralNetworkによってティーチまたはトレーニングされる方法を指定します。 LearningRuleのサブクラスには、BackPropagationSupervisedLearningが含まれます。

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がトレーニングされたので、テストしてみましょう。 DataSetDataSetRowとして渡された論理値の各ペアに対して、次の種類のテストを実行します。

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にあります。