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で