2011-01-18 5 views
22

私はJavaでニューラルネットワークを含むいくつかの単純な概念で遊んすることを決めた、と私はフォーラムで見つけ多少の無駄なコードを適応させるには、私は典型的な初心者のための非常に単純なモデルを作成することができましたXORシミュレーション:私のメインクラスでjavaの簡単なニューラルネットワークのセットアップ


public class MainApp { 
    public static void main (String [] args) { 
     Neuron xor = new Neuron(0.5f); 
     Neuron left = new Neuron(1.5f); 
     Neuron right = new Neuron(0.5f); 
     left.setWeight(-1.0f); 
     right.setWeight(1.0f); 
     xor.connect(left, right); 

     for (String val : args) { 
      Neuron op = new Neuron(0.0f); 
      op.setWeight(Boolean.parseBoolean(val)); 
      left.connect(op); 
      right.connect(op); 
     } 

     xor.fire(); 

     System.out.println("Result: " + xor.isFired()); 

    } 
} 

public class Neuron { 
    private ArrayList inputs; 
    private float weight; 
    private float threshhold; 
    private boolean fired; 

    public Neuron (float t) { 
     threshhold = t; 
     fired = false; 
     inputs = new ArrayList(); 
    } 

    public void connect (Neuron ... ns) { 
     for (Neuron n : ns) inputs.add(n); 
    } 

    public void setWeight (float newWeight) { 
     weight = newWeight; 
    } 

    public void setWeight (boolean newWeight) { 
     weight = newWeight ? 1.0f : 0.0f; 
    } 

    public float getWeight() { 
     return weight; 
    } 

    public float fire() { 
     if (inputs.size() > 0) { 
      float totalWeight = 0.0f; 
      for (Neuron n : inputs) { 
       n.fire(); 
       totalWeight += (n.isFired()) ? n.getWeight() : 0.0f; 
      } 
      fired = totalWeight > threshhold; 
      return totalWeight; 
     } 
     else if (weight != 0.0f) { 
      fired = weight > threshhold; 
      return weight; 
     } 
     else { 
      return 0.0f; 
     } 
    } 

    public boolean isFired() { 
     return fired; 
    } 
} 

、私はモデリングジェフ・ヒートンの図では、簡単なシミュレーション作成しました: XOR diagram

をしかし、私はニューロンクラスのための私の実装があることを確認したかったですコーラル私はすでにすべての入力([true true]、[true false]、[false true]、[false false])をテストしました。さらに、このプログラムは引数を引数として受け入れるので、[真偽false]、[真の真偽]などの入力に対する手動検証にも合うようです。

概念的に言えば、この実装は正しいでしょうか?あるいは、私がこのトピックのさらなる開発と研究を始める前に、どのように改善することができますか?

ありがとうございました! (限られた)から

+0

ただ、あなたが持っている任意の経験から、その値が – user2425429

答えて

0

は、実装及びモデルが私に正しく見えることを、私はニューラルネットでやった仕事 - 出力は、私が期待するものであり、ソースは固体に見えます。

+1

おかげであなたの応答のための第二のコンストラクタで定義することができ、減衰率を、追加した方が良いかもしれません、必要なCPUを持つ大規模なアプリケーションでメモリを節約するにはこのNeuronクラスのスケーラビリティに何か問題がありますか?私の見解では、ニューロンの複数の内層を収容するのに十分にスケーラブルにしようとしましたが、2つの視点が1つより優れています。 – jerluc

9

それは良い出発点のように見えます。すでに現在の入力セットで解雇だニューロンは、それぞれの時間を再計算する必要がないように、スケーラビリティ、火(のために

  1. )再構築する必要があります。私はいくつかの提案を持っています。これは、別の隠しレイヤーまたは複数の出力ノードがある場合にも当てはまります。

  2. は、独自の方法にあなたのしきい値CALCを分割することを検討してください。次に、Neuronをサブクラス化し、異なる種類の活性化関数(バイポーラ・シグモイド、RBF、線形など)を使用することができます。

  3. 各ニューロンへのバイアス入力を追加し、より複雑な機能を習得します。それは基本的にそれ自身の重み付け値を持つ別の入力に似ていますが、入力は常に1(または-1)に固定されています。

  4. は、訓練方法を可能にすることを忘れないでください。バックプロパゲーションには、ターゲット出力を取得し、各レイヤーの重量変化をリップルするために、fire()の逆数のようなものが必要です。

+2

あなたの提案をありがとう!しかし、私は主題に関してもっと多くの研究をする必要があります。あなたが提案したことの大部分が何を意味しているかを知ることからは程遠いと感じています。 – jerluc

関連する問題