2011-01-18 27 views
22

Postanowiłem pogawędzić z prostymi koncepcjami z udziałem sieci neuronowych w Javie oraz w adaptacji nieco bezużytecznego kodu, który znalazłem na forum, udało mi się stworzyć bardzo prosty model dla typowego początkującego użytkownika. symulacja XOR:Konfiguracja sieci neuronowej 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; 
    } 
} 

w moim głównym klasy I utworzeniu prostą symulację w modelowaniu Jeff Heaton w schemacie: XOR diagram

jednak chciałem zapewnić moją implementację klasy neuronu cor rect .. Przetestowałem już wszystkie możliwe dane wejściowe ([true true], [true false], [false true], [false false]) i wszystkie przeszły moją ręczną weryfikację. Dodatkowo, ponieważ ten program akceptuje dane wejściowe jako argumenty, zdaje się również przechodzić ręczną weryfikację dla danych wejściowych, takich jak [true false false], [true true false], itp.

Czy jednak pod względem koncepcyjnym, czy ta implementacja byłaby poprawna? ? Albo jak mogę go ulepszyć, zanim rozpocznę dalszy rozwój i badania tego tematu?

Dziękujemy!

+0

Wystarczy zapisać pamięci w większych aplikacji, które posiadają niezbędne CPU, może lepiej byłoby dodać szybkość zaniku, którego wartość może być zdefiniowana w drugim konstruktora – user2425429

Odpowiedz

0

Z (ograniczonej) pracy, którą wykonałem przy użyciu sieci neuronowych, ta implementacja i model wygląda mi poprawnie - wynik jest taki, jakiego oczekiwałbym, a źródło wygląda solidnie.

+1

Dzięki za odpowiedź, z każdego doświadczenia masz, czy są jakieś problemy związane ze skalowalnością tej klasy Neuron? Z mojej perspektywy próbowałem uczynić go wystarczająco skalowalnym, aby mógł pomieścić wiele wewnętrznych warstw neuronów, ale dwie perspektywy są lepsze niż jedna. – jerluc

9

Wygląda na dobry punkt wyjścia. Mam kilka propozycji:

  1. skalowalność, ogień() powinna zostać zreorganizowana tak, neuron, który jest już zwolniony z obecnego zestawu wejściowego nie musi przeliczyć za każdym razem. Miałoby to miejsce, gdybyś miał inną ukrytą warstwę lub więcej niż jeden węzeł wyjściowy.

  2. Rozważ podzielenie wartości progowej calc na własną metodę. Następnie możesz podklasować Neuron i użyć różnych typów funkcji aktywacji (sigmoidów bipolarnych, RBF, liniowych itd.).

  3. Aby nauczyć się bardziej złożonych funkcji, dodaj sygnał wstępny do każdego neuronu. Jest to zasadniczo jak inne wejście z własną wartością ciężaru, ale wejście jest zawsze ustalone na 1 (lub -1).

  4. Nie zapomnij o metodach szkoleniowych. Backpropagation będzie potrzebować czegoś podobnego do odwrotności ognia(), aby przyjąć docelowy wynik i zmiażdżyć zmiany wagi przez każdą z warstw.

+2

Dzięki za sugestie! Muszę jednak przeprowadzić o wiele więcej badań na ten temat, ponieważ czuję się daleki od wiedzy, co większość sugerowanych przez ciebie słów oznacza haha – jerluc

Powiązane problemy