Введение в Neuroph
1. Вступление
В этой статье рассматриваетсяNeuroph - библиотека с открытым исходным кодом для создания нейронных сетей и использования машинного обучения.
В этой статье мы рассмотрим основные концепции и несколько примеров того, как все это собрать воедино.
2. Нейроф
Мы можем взаимодействовать с Neuroph используя:
-
инструмент на основе графического интерфейса
-
библиотека Java
Оба подхода полагаются на базовую иерархию классов, которая строит искусственные нейронные сети из слоевneurons.
Мы сосредоточимся на программной стороне, но обратимся к нескольким общим классам из подхода Neuroph, основанного на графическом интерфейсе, чтобы прояснить, что мы делаем.
Для получения дополнительной информации о подходе на основе графического интерфейса пользователя взгляните на Neurophdocumentation.
2.1. зависимости
Если вы хотите использовать Neuroph, нам нужно добавить следующую запись Maven:
org.beykery
neuroph
2.92
Самую последнюю версию можно найтиon Maven Central.
3. Ключевые классы и концепции
Все основные используемые концептуальные строительные блоки имеют соответствующие классы Java.
Neurons подключаются кLayers, которые затем группируются вNeuralNetworks. NeuralNetworks впоследствии обучаются с использованиемLearningRules иDataSets.
3.1. Neuronс
КлассNeuron имеет четыре основных атрибута:
-
inputConnection: взвешенных связей междуNeurons
-
inputFunction: указываетweights иvector sums, применяемые к входящим данным соединения
-
transferFunction: указываетweights иvector sums, применяемые к исходящим данным __
-
output: выходное значение, полученное в результате примененияtransferFunctions иinputFunctions кinputConnection
Вместе эти четыре основных атрибута определяют поведение:
output = transferFunction(inputFunction(inputConnections));
3.2. Layerс
Layers are essentially groupings of Neurons, так что каждыйNeuron вLayer (обычно) связан только сNeurons в предыдущем и последующихLayers.
Layers, следовательно, передает информацию между ними через взвешенные функции, которые существуют на ихNeurons.
Neurons можно добавить к слоям: __
Layer layer = new Layer();
layer.addNeuron(n);
3.3. NeuralNetworkс
Суперкласс верхнего уровняNeuralNetwork подразделяется на несколько известных видов искусственных нейронных сетей, включая сверточные нейронные сети (подклассConvolutionalNetwork), нейронные сети Хопфилда (подклассHopfield) и многослойные нейронные сети персептронов. (подклассMultilayerPerceptron).
All NeuralNetworks are composed of Layers, которые обычно объединяются в трихотомию:
-
входные слои
-
скрытые слои
-
выходные слои
Если мы используем конструктор подклассаNeuralNetwork (например,Perceptron), мы можем передатьLayers, количествоNeurons для каждогоLayer , и их индекс с помощью этого простого метода:
NeuralNetwork ann = new Perceptron(2, 4, 1);
Иногда нам нужно сделать это вручную (и хорошо бы увидеть, что происходит под капотом). Базовая операция добавленияLayer кNeuralNetwork выполняется следующим образом:
NeuralNetwork ann = new NeuralNetwork();
Layer layer = new Layer();
ann.addLayer(0, layer);
ann.setInputNeurons(layer.getNeurons());
Первый аргумент указывает индексLayer вNeuralNetwork; второй аргумент определяет самLayer. Добавленный вручнуюLayers должен быть подключен с использованием классаConnectionFactory:
ann.addLayer(0, inputLayer);
ann.addLayer(1, hiddenLayerOne);
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));
Первый и последнийLayer также должны быть подключены:
ConnectionFactory.fullConnect(ann.getLayerAt(0),
ann.getLayerAt(ann.getLayersCount() - 1), false);
ann.setOutputNeurons(ann.getLayerAt(
ann.getLayersCount() - 1).getNeurons());
Помните, что сила и мощность aNeuralNetworkво многом зависят от:
-
количествоLayers вNeuralNetwork
-
количествоNeurons в каждомLayer (иweighted functions между ними), и
-
эффективность алгоритмов обучения / точностьDataSet
3.4. Обучение НашиNeuralNetwork
NeuralNetworks обучаются с использованием классовDataSet иLearningRule.
DataSet используется для представления и предоставления информации, которую необходимо изучить или использовать для обученияNeuralNetwork. DataSets характеризуются своимиinput size, outputsize, и строками(DataSetRow).
int inputSize = 2;
int outputSize = 1;
DataSet ds = new DataSet(inputSize, outputSize);
DataSetRow rOne
= new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rOne);
DataSetRow rTwo
= new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);
LearningRule определяет способ обученияDataSet или обученияNeuralNetwork. ПодклассыLearningRule включаютBackPropagation иSupervisedLearning.
NeuralNetwork ann = new NeuralNetwork();
//...
BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);
4. Собираем все вместе
Теперь давайте объединим эти строительные блоки в реальный пример. Мы собираемся начать сcombining several layers together into the familiar input layer, hidden layer, and output layer pattern на примере большинства архитектур нейронных сетей.
4.1. Слои
Мы соберем нашNeuralNetwork, объединив четыре слоя. Наша цель - построить (2, 4, 4, 1)NeuralNetwork.
Давайте сначала определим наш входной слой:
Layer inputLayer = new Layer();
inputLayer.addNeuron(new Neuron());
inputLayer.addNeuron(new Neuron());
Далее мы реализуем скрытый слой один:
Layer hiddenLayerOne = new Layer();
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
И скрытый слой два:
Layer hiddenLayerTwo = new Layer();
hiddenLayerTwo.addNeuron(new Neuron());
hiddenLayerTwo.addNeuron(new Neuron());
hiddenLayerTwo.addNeuron(new Neuron());
hiddenLayerTwo.addNeuron(new Neuron());
Наконец, мы определяем наш выходной слой:
Layer outputLayer = new Layer();
outputLayer.addNeuron(new Neuron());
4.2. NeuralNetworkс
Затем мы можем объединить их вNeuralNetwork:
NeuralNetwork ann = new NeuralNetwork();
ann.addLayer(0, inputLayer);
ann.addLayer(1, hiddenLayerOne);
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));
ann.addLayer(2, hiddenLayerTwo);
ConnectionFactory.fullConnect(ann.getLayerAt(1), ann.getLayerAt(2));
ann.addLayer(3, outputLayer);
ConnectionFactory.fullConnect(ann.getLayerAt(2), ann.getLayerAt(3));
ConnectionFactory.fullConnect(ann.getLayerAt(0),
ann.getLayerAt(ann.getLayersCount()-1), false);
ann.setInputNeurons(inputLayer.getNeurons());
ann.setOutputNeurons(outputLayer.getNeurons());
4.3. Повышение квалификации
Для целей обучения давайте составимDataSet, указав размер как входного, так и результирующего выходного вектора:
int inputSize = 2;
int outputSize = 1;
DataSet ds = new DataSet(inputSize, outputSize);
Мы добавляем элементарную строку к нашемуDataSet, придерживаясь ограничений ввода и вывода, определенных выше - наша цель в этом примере - научить нашу сеть выполнять базовые операции XOR (исключающее ИЛИ):
DataSetRow rOne
= new DataSetRow(new double[] {0, 1}, new double[] {1});
ds.addRow(rOne);
DataSetRow rTwo
= new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);
DataSetRow rThree
= new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rThree);
DataSetRow rFour
= new DataSetRow(new double[] {1, 0}, new double[] {1});
ds.addRow(rFour);
Затем давайте обучим нашNeuralNetwork с помощью встроенногоBackPropogation LearningRule:
BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);
4.4. тестирование
Теперь, когда нашNeuralNetwork обучен, давайте проверим его. Для каждой пары логических значений, переданных в нашDataSet какDataSetRow, мы запускаем следующий вид теста:
ann.setInput(0, 1);
ann.calculate();
double[] networkOutputOne = ann.getOutput();
Важно помнить, чтоNeuralNetworks only output a value on the inclusive interval of 0 and 1. Чтобы вывести какое-то другое значение, мы должныnormalize иdenormalize наши данные.
В этом случае для логических операций 0 и 1 идеально подходят для работы. Выход будет:
Testing: 1, 0 Expected: 1.0 Result: 1.0
Testing: 0, 1 Expected: 1.0 Result: 1.0
Testing: 1, 1 Expected: 0.0 Result: 0.0
Testing: 0, 0 Expected: 0.0 Result: 0.0
Мы видим, что нашNeuralNetwork успешно предсказывает правильный ответ!
5. Заключение
Мы только что рассмотрели основные концепции и классы, используемые Neuroph.
Дополнительная информация об этой библиотеке доступнаhere, а примеры кода, использованные в этой статье, можно найти вover on GitHub.