みんなのための高速ニューラルネットワーク

この記事では、Javaでニューラルネットワークを簡単に作成できることを示します。 車輪を再発明しないために、すでに十分に開発されたFast Artificial Neural Networkライブラリを利用してください。 Javaプロジェクトでニューラルネットワークを使用するのは現実的です。 多くの場合、実行速度に関するJavaに対する非難が聞こえます。 違いはそれほど大きくありませんが、これについては「C ++ Performance vs. Java vs. PHPと Python 額テスト" FANNライブラリーのラッパーを使用します。

挑戦する


1人以上の敵に出会えるキャラクターを決定できるシステムを作成する必要があります。 システムは以下を認識している場合があります。

答えは次のいずれかのアクションの形式である必要があります。

トレーニングのために、「レッスン」の表を作成します。
健康アクション
50%11攻撃する
90%12攻撃する
80%01攻撃する
30%11隠す
60%12隠す
40%01隠す
90%17実行するには
60%14実行するには
10%01実行するには
60%10なし
100%00なし

準備する


最初に行うことは、 libfannをビルドしてインストールすることです
次に、 fannjjnaをダウンロードします。

「レッスン」のセットを含むファイルを作成しましょう。

11 3 4 0.5 1 1 1 0 0 0 0.9 1 2 1 0 0 0 0.8 0 1 1 0 0 0 0.3 1 1 0 1 0 0 0.6 1 2 0 1 0 0 0.4 0 1 0 1 0 0 0.9 1 7 0 0 1 0 0.5 1 4 0 0 1 0 0.1 0 1 0 0 1 0 0.6 1 0 0 0 0 1 1.0 0 0 0 0 0 1 

次に、ANNをトレーニングして、ファイルに保存します。

  public static void main(String[] args) { //        List<Layer> layerList = new ArrayList<Layer>(); layerList.add(Layer.create(3, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f)); layerList.add(Layer.create(16, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f)); layerList.add(Layer.create(4, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f)); Fann fann = new Fann(layerList); //      Trainer trainer = new Trainer(fann); trainer.setTrainingAlgorithm(TrainingAlgorithm.FANN_TRAIN_RPROP); /*      ,     100000,    100      0.0001 */ trainer.train(new File("train.data").getAbsolutePath(), 100000, 100, 0.0001f); fann.save("ann"); } 

説明


レイヤー


ANNはニューロンの層で構成されています。 最初の層は、受容体ニューロンまたは入力データニューロンです。 出力ニューロンの最後の層。 残りはすべて非表示のレイヤーです。 この場合、最初の層には3つのニューロンがあります。

健康レベル(0.1-1.0);
武器の存在(1-yes、0-no);
敵の数。

ファン


Fannクラスのオブジェクトは、以前に作成されたレイヤーに基づいて作成されるニューラルネットワークです。

トレーナー


トレーナークラスのオブジェクトは、トレーナーの作成中に送信されるニューラルネットワークの学習アルゴリズムをカプセル化します。 トレーニング後、ファイルに保存することを忘れないでください。

結果を確認する


トレーニングをテストするには、次のコードを使用します。

  public static void main(String[] args) { Fann fann = new Fann("ann"); float[][] tests = { {1.0f, 0, 1}, {0.9f, 1, 3}, {0.3f, 0, 8}, {1, 1, 8}, {0.1f, 0, 0}, }; for (float[] test:tests){ System.out.println(getAction(fann.run(test))); } } private static String getAction(float[] out){ int i = 0; for (int j = 1; j < 4; j++) { if(out[i]<out[j]){ i = j; } } switch (i){ case 0:return ""; case 1:return ""; case 2:return ""; case 3:return "  "; } return ""; } 

私は次の結果を得ました:
健康アクション
100%いや1攻撃する
90%あります3隠す
30%いや8実行するには
100%あります8実行するには
10%いや0何もしない

建設的な批判を聞いてうれしいです。

Source: https://habr.com/ru/post/J254921/


All Articles