что такое джун
-
Joone — это бесплатный фреймворк для создания, обучения и тестирования искусственных нейронных сетей. Цель состоит в том, чтобы создать надежную среду для самых популярных технологий Java для энтузиастов и профессиональных пользователей.
-
Joone состоит из центрального механизма, который является основой всех приложений, разработанных Joone. Нейронные сети Джуна можно построить на локальной машине, обучить в распределенной среде и запустить на любом устройстве.
-
Каждый может писать новые модули для реализации новых алгоритмов или новых архитектур, начиная с простых компонентов, распространяемых ядром. Основная идея состоит в том, чтобы заложить основу для развертывания миллионов приложений искусственного интеллекта вокруг базовой структуры.
Некоторые особенности...
- [x] Контролируемое обучение:
- [x] Нейронная сеть с прямой связью (FFNN)
- [x] Рекуррентные нейронные сети (Эльмана, Иордан, ...)
- [x] Нейронная сеть с временной задержкой (TDNN)
- [x] Стандартная обратная ветвь (градиентный спуск, онлайн и пакетная обработка)
-
[x] Эластичная поддержка (RPROP)
Неконтролируемое обучение:
- [x] Kohonen SOM (выходная карта с WTA или Gaussian)
- [x] Анализ главных компонентов (PCA)
- [X] модульная нейронная сеть (то есть возможность смешивания все вышеуказанная схема)
- [x] Мощный встроенный механизм предварительной обработки данных
- [x] Функция сценария (JavaScript) для добавления пользовательского поведения в NN
- существующие данные
- [x] blog.CSDN.net/U010223750/…Это сильно отличается от информации официального сайта, но отношения сравнения не решены.
- ссылка на ресурс
Базовый пример операции XOR
- У вас могут возникнуть вопросы, почему операция XOR до сих пор используется, и почему ее нельзя заменить на что-то другое?Операция XOR имеет небольшой объем данных и может дать хороший эффект обучения.
- Несколько ключевых моментов:
- Одногрупповая нейронная сеть LinearLayer линейная
- Одногрупповая нейронная сеть SigmoidLayer линейная
- FullSynapse соединяет синапсы нейронных сетей
- Контейнер нейронной сети NeuralNet
-
Монитор Монитор Подобный менеджер
- Основной процесс подачи заявки
- Построить нейронную сеть, подходящую для модели
- Ввод/вывод управления потоком на основе данных, контролируемых моделью
- монитор запускает процесс обучения
- Обратите внимание: один класс должен реализовывать NeuralNetListener.
- Код дисплея:
private NeuralNet neuralNet;
private Monitor monitor;
private SigmoidLayer out, hidden;
private LinearLayer in;
public static void main(String[] args) {
Xor xor = new Xor();
xor.init_nulnetwork();
xor.dualData("res/xor.txt", "res/result.txt");
// xor.name("res/xor.txt", "res/result.txt");
try { Thread.sleep(1000); } catch (InterruptedException doNothing) { }
xor.interrogate();
}
private void interrogate() {
double[][] inputArray = new double[][] { { 0.0, 1.0 } };
// set the inputs
neuralNet.getMonitor().setLearning(false);
MemoryInputSynapse inputSynapse = new MemoryInputSynapse();
inputSynapse.setInputArray(inputArray);
inputSynapse.setAdvancedColumnSelector("1,2");
neuralNet.removeAllInputs();
neuralNet.removeAllOutputs();
neuralNet.addInputSynapse(inputSynapse);
MemoryOutputSynapse memOut = new MemoryOutputSynapse();
neuralNet.addOutputSynapse(memOut);
if (neuralNet != null) {
neuralNet.getMonitor().setSingleThreadMode(false);
neuralNet.go();
for (int i = 0; i < 4; i++) {
double[] nextPattern = memOut.getNextPattern();
System.out.println(nextPattern[0]);
}
System.exit(0);
}
}
public void dualData(String inpath, String outpath) {
// 输入数据突触
FileInputSynapse inputSynapse = new FileInputSynapse();
inputSynapse.setInputFile(new File(inpath));
inputSynapse.setAdvancedColumnSelector("1,2");
// 传入数据突触
in.addInputSynapse(inputSynapse);
// 训练突触
TeachingSynapse Teaching = new TeachingSynapse();
// 结果对应
FileInputSynapse in_resultsynapse = new FileInputSynapse();
in_resultsynapse.setInputFile(new File(inpath));
in_resultsynapse.setAdvancedColumnSelector("3");
// 期望结果
Teaching.setDesired(in_resultsynapse);
// 输出数据突触
out.addOutputSynapse(Teaching);
/* Creates the error output file */
FileOutputSynapse error = new FileOutputSynapse();
error.setFileName(outpath);
// error.setBuffered(false);
Teaching.addResultSynapse(error);
neuralNet.setTeacher(Teaching);
monitor.setLearning(true);
monitor.setTrainingPatterns(4);
monitor.setTotCicles(2000);
neuralNet.go();
}
public void init_nulnetwork() {
// 构造三个神经网络
in = new LinearLayer("in");
out = new SigmoidLayer("out");
hidden = new SigmoidLayer("hidden");
// 定义每个网络的神经数
in.setRows(2);
hidden.setRows(3);
out.setRows(1);
// 创建神经突触
FullSynapse synapseone = new FullSynapse();
FullSynapse synapsetwo = new FullSynapse();
// 连接突触 in->hidden
in.addOutputSynapse(synapseone);
hidden.addInputSynapse(synapseone);
// hidden>out
out.addInputSynapse(synapsetwo);
hidden.addOutputSynapse(synapsetwo);
// 创建容器
neuralNet = new NeuralNet();
neuralNet.addLayer(in, NeuralNet.INPUT_LAYER);
neuralNet.addLayer(out, NeuralNet.OUTPUT_LAYER);
neuralNet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);
neuralNet.addNeuralNetListener(this);
monitor = neuralNet.getMonitor();
monitor.addNeuralNetListener(this);
// 学习速度
monitor.setLearningRate(0.8);
// 学习梯度
monitor.setMomentum(0.9);
}
@Override
public void cicleTerminated(NeuralNetEvent arg0) {
}
@Override
public void errorChanged(NeuralNetEvent arg0) {
Monitor source = (Monitor) arg0.getSource();
if (source.getCurrentCicle() % 100 == 0)
System.out.println(source.getCurrentCicle() + " epochs remaining - RMSE = " + source.getGlobalError());
}
@Override
public void netStarted(NeuralNetEvent arg0) {
System.out.println("star ..............");
}
@Override
public void netStopped(NeuralNetEvent arg0) {
}
@Override
public void netStoppedError(NeuralNetEvent arg0, String arg1) {
}
скопировать код
Отображение эффекта бега
-
консольная печать
star .............. 1900 epochs remaining - RMSE = 0.47600682941789274 1800 epochs remaining - RMSE = 0.4193120542959407 1700 epochs remaining - RMSE = 0.3615907922936926 1600 epochs remaining - RMSE = 0.043037310196610556 1500 epochs remaining - RMSE = 0.029465401358726946 1400 epochs remaining - RMSE = 0.023733896256020553 1300 epochs remaining - RMSE = 0.020388084386553255 1200 epochs remaining - RMSE = 0.01813347388867849 1100 epochs remaining - RMSE = 0.0164837281607376 1000 epochs remaining - RMSE = 0.015209973541172709 900 epochs remaining - RMSE = 0.014188572240857322 800 epochs remaining - RMSE = 0.013346142747488585 700 epochs remaining - RMSE = 0.012636035607807258 600 epochs remaining - RMSE = 0.012026998316013436 500 epochs remaining - RMSE = 0.011497207806982808 400 epochs remaining - RMSE = 0.011030904955155142 300 epochs remaining - RMSE = 0.010616388884900461 200 epochs remaining - RMSE = 0.010244766308025021 100 epochs remaining - RMSE = 0.009909141567578732
скопировать код - Как видно, числа в первой строке приведенного выше списка достаточно близки к нулю. Это хорошо, поскольку ожидается, что первая строка входного обучающего файла, показанного в листинге 1, будет равна нулю. Кроме того, вторая строка достаточно близка к 1, и это нормально, поскольку ожидается, что вторая строка тренировочного файла также будет равна 1.
-
формат тренировочного файла
0;0;0 1;0;1 1;1;0 0;1;1
скопировать кодУстановите setAdvancedColumnSelector, чтобы выбрать необходимое содержимое данных
проблема с хранением
Если вы тренируетесь с большим объемом данных, то в конце каждой тренировки текущие результаты не будут сохранены при следующем запуске обучения.Так какое же решение?
Это определенно решение сериализации в java.Вам нужно только реализовать интерфейс Serializable.
-
Для класса инструмента joonetools просто используйте метод load для его загрузки.
-
Пример класса инструмента приведен ниже:
package extend.java.Seriobject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
*
* @author DGW-PC
* 对象的序列化与反序列化
*/
public class TestSerializable {
private final static String filepath="rouseces/temp.xor";
public static void main(String[] args) {
/*User user = new User(123, "dgw", "男");
TestSerializable serializable = new TestSerializable();
try {
serializable.writeObject(user);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
TestSerializable serializable = new TestSerializable();
try {
User object = (User)serializable.readObject();
System.out.println(object.toString());
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void writeObject(Object o) throws IOException {
File file = new File(filepath);
if (file.exists()) {
file.delete();
}
FileOutputStream outputStream = new FileOutputStream(file);
ObjectOutputStream objectWrite = new ObjectOutputStream(outputStream);
objectWrite.writeObject(o);
objectWrite.close();
outputStream.close();
}
@SuppressWarnings("resource")
public Object readObject() throws IOException, ClassNotFoundException {
File file = new File(filepath);
if (!file.exists()) {
throw new FileNotFoundException();
}
FileInputStream inputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
return objectInputStream.readObject();
}
}
скопировать код
другие проблемы
Реализовать некоторые функции слушателя в процессе обучения нейронной сети NeuralNetListener:
- icleTerminated: вывод информации после завершения каждого цикла
- errorChanged: вывод информации при изменении частоты ошибок нейронной сети.
- netStarted: вывод информации, когда нейронная сеть начинает работать.
- netStopped: вывод информации при остановке нейронной сети.
Проверочный код:
private void interrogate() {
double[][] inputArray = new double[][] { { 0.0, 1.0 } };
// 设置输入
neuralNet.getMonitor().setLearning(false);
MemoryInputSynapse inputSynapse = new MemoryInputSynapse();
inputSynapse.setInputArray(inputArray);
inputSynapse.setAdvancedColumnSelector("1,2");
neuralNet.removeAllInputs();
neuralNet.removeAllOutputs();
neuralNet.addInputSynapse(inputSynapse);
MemoryOutputSynapse memOut = new MemoryOutputSynapse();
neuralNet.addOutputSynapse(memOut);
if (neuralNet != null) {
neuralNet.getMonitor().setSingleThreadMode(false);
neuralNet.go();
for (int i = 0; i < 4; i++) {
double[] nextPattern = memOut.getNextPattern();
System.out.println(nextPattern[0]);
}
System.exit(0);
}
}
скопировать код
- При вводе 0,1 вывод содержимого
100 epochs remaining - RMSE = 0.009909141567578732
[main] [WARN] - org.joone.net.NeuralNet - Termination requested but net appears not to be running.
star ..............
0.9908896675722858
скопировать код
- Когда вход равен 0,0, это выход
400 epochs remaining - RMSE = 0.010399344820751158
300 epochs remaining - RMSE = 0.010045322272865264
200 epochs remaining - RMSE = 0.009724485002708847
100 epochs remaining - RMSE = 0.009431977897288895
[main] [WARN] - org.joone.net.NeuralNet - Termination requested but net appears not to be running.
star ..............
0.008214361744075686
скопировать код
Из сравнения содержания двух вышеуказанных данных мы можем узнать, что после 4 сравнений данных ожидаемая цель обучения была достигнута, 0,0 означает, что результат не установлен, а результат равен 0, 0,99 означает, что результат установлен. , а результат 1
Пример инкапсуляции класса инструментов joonetools
- Дополнительные примеры валидаторов: см. официальную документацию по API.
package org.basics.code;
import org.joone.helpers.factory.JooneTools;
import org.joone.net.NeuralNet;
public class Tools {
// XOR 输入值
private static double[][] inputArray = new double[][] {
{0.0, 0.0},
{0.0, 1.0},
{1.0, 0.0},
{1.0, 1.0}
};
// XOR 期望值
private static double[][] desiredArray = new double[][] {
{0.0},
{1.0},
{1.0},
{0.0}
};
public static void main(String[] args) {
try {
// 创建3个sigmoid神经网络,序列为2 2 1
NeuralNet nnet = JooneTools.create_standard(new int[]{ 2, 2, 1 }, JooneTools.LOGISTIC);
nnet.getMonitor().setSingleThreadMode(true);
/**
* 参数意义:
* 1. 网络容器
* 2. 输入,期末数组
* 3.5000 个递归梯度
* 4. 步进为0.01
* 5. 形式为输出
* 6.异步模式
*/
double rmse = JooneTools.train(nnet, inputArray, desiredArray,
5000, 0.01,
200, System.out, false);
// 避免的时间片重叠
try { Thread.sleep(50); } catch (InterruptedException doNothing) { }
// 更直观的验证列表
System.out.println("Last RMSE = "+rmse);
System.out.println("\nResults:");
System.out.println("|Inp 1\t|Inp 2\t|Output");
for (int i=0; i < 4; ++i) {
double[] output = JooneTools.interrogate(nnet, inputArray[i]);
System.out.print("| "+inputArray[i][0]+"\t| "+inputArray[i][1]+"\t| ");
System.out.println(output[0]);
}
// 测试结果
double testRMSE = JooneTools.test(nnet, inputArray, desiredArray);
System.out.println("\nTest error = "+testRMSE);
} catch (Exception exc) { exc.printStackTrace(); }
}
}
скопировать код