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

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



挑戦する



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



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



トレーニングのために、「レッスン」の表を作成します。

健康 アクション
50% 1 1 攻撃する
90% 1 2 攻撃する
80% 0 1 攻撃する
30% 1 1 隠す
60% 1 2 隠す
40% 0 1 隠す
90% 1 7 実行するには
60% 1 4 実行するには
10% 0 1 実行するには
60% 1 0 なし
100% 0 0 なし


準備する



最初に行うことは、 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 何もしない


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



All Articles