простая настройка нейронной сети Java - PullRequest
23 голосов
/ 18 января 2011

Я решил поиграть с некоторыми простыми понятиями, связанными с нейронными сетями в Java, и, адаптировав несколько бесполезный код, который я нашел на форуме, я смог создать очень простую модель для типичной симуляции XOR для начинающих:


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

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

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

Спасибо!

Ответы [ 2 ]

9 голосов
/ 18 января 2011

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

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

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

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

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

0 голосов
/ 18 января 2011

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

...