2011-01-18 2 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

Однако, я хотел обеспечить свою реализацию класса нейрона кор rect. Я уже тестировал все возможные входы ([true true], [true false], [false true], [false false]), и все они прошли мою ручную проверку. Кроме того, поскольку эта программа принимает входные данные в качестве аргументов, она также, похоже, передает ручную проверку для таких входов, как [true false false], [true true false] и т. Д.

Но концептуально говоря, будет ли эта реализация правильной ? Или как я могу улучшить его, прежде чем я начну дальнейшую разработку и исследование этой темы?

Спасибо!

+0

Просто, чтобы сохранить память в больших приложениях, которые имеют необходимый процессор, это может быть лучше, чтобы добавить скорость распада, значение которого может быть определена во втором конструкторе – user2425429

ответ

0

Из (ограниченной) работы, которую я сделал с нейронными сетями, эта реализация и модель выглядят корректно для меня - результат - это то, что я ожидаю, и источник выглядит прочным.

+1

Спасибо за ваш ответ, из любого опыта у вас есть, есть ли проблемы, которые вы видите в масштабируемости этого класса Neuron? С моей точки зрения, я попытался сделать его достаточно масштабируемым для размещения нескольких внутренних слоев нейронов, но две перспективы лучше, чем одна. – jerluc

9

Это похоже на хорошую отправную точку. У меня есть несколько предложений:

  1. Для масштабируемости, огнь() должно быть перестроены таким образом, что нейрон, который уже уволен с текущим входным набором не пересчитывать каждый раз. Это было бы так, если бы у вас был другой скрытый слой или более одного выходного узла.

  2. Рассмотрите возможность расщепления порога в своем собственном методе. Затем вы можете подклассировать Neuron и использовать различные типы функций активации (биполярный сигмоид, RBF, линейный и т. Д.).

  3. Чтобы узнать более сложные функции, добавьте вход смещения для каждого нейрона. Это в основном как другой вход с собственным значением веса, но вход всегда фиксируется на 1 (или -1).

  4. Не забудьте указать методы обучения. Backpropagation потребуется что-то вроде инверсии fire(), чтобы получить целевой результат и пульсировать изменения веса через каждый слой.

+2

Спасибо за ваши предложения! Тем не менее, мне нужно будет сделать гораздо больше исследований по этому вопросу, поскольку я чувствую себя далеко не зная, что большинство из того, что вы предложили, означает хаха – jerluc

Смежные вопросы