Neurophの紹介

1前書き

この記事では、http://neuroph.sourceforge.net/[Neuroph] - ニューラルネットワークを作成し、機械学習を利用するためのオープンソースライブラリを見てください。

この記事では、コア概念と、それをすべてまとめる方法に関するいくつかの例を見ています。

2ニューロフ

私たちはNeurophと対話することができます:

  • GUIベースのツール

  • Javaライブラリ

どちらのアプローチも、ニューラルネットワークの層から人工ニューラルネットワークを構築する基礎となるクラス階層に依存しています。

私たちはプログラム的な側面に焦点を当てますが、私たちがしていることを明確にするためにNeurophのGUIベースのアプローチからのいくつかの共有クラスを参照します。

GUIベースのアプローチの詳細については、Neuroph documentation を参照してください。

** 2.1. 依存関係

**

Neurophを使用する場合は、次のMavenエントリを追加する必要があります。

<dependency>
    <groupId>org.beykery</groupId>
    <artifactId>neuroph</artifactId>
    <version>2.92</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22neuroph%22[on Maven Central]です。

3主なクラスと概念

使用される基本的な概念構築ブロックはすべて、対応するJavaクラスを持ちます。

Neurons Layers に接続され、 Layers NeuralNetworks にグループ化されます。その後、 NeuralNetworks は、 LearningRules DataSets を使用してトレーニングされます。

3.1. ニューロン

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

  1. inputConnection: ニューロン間の重み付き接続__

  2. inputFunction: はに適用される weights vector sums を指定します

着信接続データ 。 transferFunction: は、に適用される weights vector sums を指定します

発信データ____

output: を適用した結果の出力値

transferFunctions および inputFunctions から inputConnection

これら4つの主要な属性が一緒になって動作を確立します。

output = transferFunction(inputFunction(inputConnections));

==== 3.2.

  • Layers は本質的に Neurons ** のグループで、 Layer 内の各 Neuron は(通常)前後の Layers 内の Neurons とのみ接続されています。

したがって、 Layers は、それらの Neurons に存在する重み付き関数を介してそれらの間で情報を渡します。

Neurons をレイヤーに追加することができます:

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

==== 3.3. ニューラルネットワーク

トップレベルのスーパークラス NeuralNetworkは、畳み込みニューラルネットワーク(サブクラス ConvolutionalNetwork )、ホップフィールドニューラルネットワーク(サブクラス Hopfield )、および多層パーセプトロンニューラルネットワーク(サブクラス MultilayerPerceptron__)を含む、よく知られた種類の人工ニューラルネットワークにサブクラス化されます。

  • すべての NeuralNetworks Layers ** から構成されています。

    1. 入力レイヤー

    2. 隠れ層

    3. 出力層

NeuralNetwork のサブクラス( Perceptron など)のコンストラクターを使用している場合は、次の単純なメソッドを使用して、 Layer s、各 Layer Neuron __の数、およびそれらのインデックスを渡すことができます。

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の強さと力は、次の要素に大きく左右されます。

  1. NeuralNetwork Layers の数

  2. Layer (および加重関数__)に含まれる中性子の数

それらの間) 。トレーニングアルゴリズムの有効性/ DataSet の精度

==== ** 3.4. 私たちのトレーニング NeuralNework

**

  • NeuralNetworks は、 DataSet および LearningRule クラスを使用してトレーニングされます。

DataSet は、学習する情報の表現と提供、または NeuralNetwork のトレーニングに使用されます。 DataSets は、それらの 入力サイズ、outputize、 、および行__(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すべてを一緒に入れて

それでは、これらのビルディングブロックを実際の例にまとめてみましょう。まず、いくつかのレイヤーを、ほとんどのニューラルネットワークアーキテクチャで例示されている、使い慣れた 入力レイヤー 隠しレイヤー 、および出力レイヤー__パターン** にまとめることから始めます。

==== 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());

そして隠れた第二​​層:

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 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 のトレーニングが終わったので、テストしましょう。 DataSetRow として DataSet に渡された論理値のペアごとに、以下の種類のテストを実行します。

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

覚えておくべき重要なことは、** NeuralNetworks は0と1の包括的な範囲の値のみを出力することです。他の値を出力するには、データを正規化し、正規化しなければなりません。

この場合、論理演算では、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で使用されている基本的な概念とクラスを見直しました。

このライブラリの詳細については、http://neuroph.sourceforge.net[ここ]を参照してください。この記事で使用されているコード例は、https://github.com/eugenp/tutorials/tree/master/libraries[overにあります。 GitHubで