Java простая настройка нейронной сети
Я решил поиграть с некоторыми простыми концепциями, связанными с нейронными сетями на 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] и т.д.
Но концептуально говоря, будет ли эта реализация правильной? Или как я могу улучшить его, прежде чем я начну дальнейшее развитие и исследование этой темы?
Спасибо!
Ответы
Ответ 1
Похоже, это хорошая отправная точка. У меня есть несколько предложений:
-
Для масштабируемости fire() следует перестроить так, чтобы нейрон, который уже запускался с текущим набором входных данных, не должен был пересчитывать каждый раз. Это было бы так, если бы у вас был другой скрытый слой или более одного выхода node.
-
Рассмотрим разбиение порогового значения на собственный метод. Затем вы можете подклассировать Neuron и использовать различные типы функций активации (биполярный сигмоид, RBF, линейный и т.д.).
-
Чтобы узнать более сложные функции, добавьте вход смещения для каждого нейрона. Это в основном как другой ввод с собственным значением веса, но вход всегда фиксируется на 1 (или -1).
-
Не забудьте указать методы обучения. Для backpropagation потребуется что-то вроде обратного к fire(), чтобы получить целевой результат и пульсировать изменения веса через каждый уровень.
Ответ 2
Из (ограниченной) работы, которую я сделал с нейронными сетями, эта реализация и модель выглядят корректно для меня - результат - это то, что я ожидаю, и источник выглядит прочным.