Практика нейросети JOONE

искусственный интеллект Нейронные сети Java Архитектура
Практика нейросети JOONE

что такое джун

  • 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/…Это сильно отличается от информации официального сайта, но отношения сравнения не решены.
  • ссылка на ресурс
  • [x] Эй, Джо Уан, World.com/download, Контракт...

Базовый пример операции XOR

  • У вас могут возникнуть вопросы, почему операция XOR до сих пор используется, и почему ее нельзя заменить на что-то другое?Операция XOR имеет небольшой объем данных и может дать хороший эффект обучения.

  • Несколько ключевых моментов:
  1. Одногрупповая нейронная сеть LinearLayer линейная
  2. Одногрупповая нейронная сеть SigmoidLayer линейная
  3. FullSynapse соединяет синапсы нейронных сетей
  4. Контейнер нейронной сети NeuralNet
  5. Монитор Монитор Подобный менеджер

  • Основной процесс подачи заявки
  1. Построить нейронную сеть, подходящую для модели
  2. Ввод/вывод управления потоком на основе данных, контролируемых моделью
  3. монитор запускает процесс обучения
  4. Обратите внимание: один класс должен реализовывать 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:

  1. icleTerminated: вывод информации после завершения каждого цикла
  2. errorChanged: вывод информации при изменении частоты ошибок нейронной сети.
  3. netStarted: вывод информации, когда нейронная сеть начинает работать.
  4. 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(); }
    }

}
скопировать код
Автор: Guowei, Jianshu: http://www.jianshu.com/u/e8368fe872b3 ---- github: https://github.com/PEAKWEI Авторские права принадлежат автору. Для коммерческих перепечаток, пожалуйста, свяжитесь с автором для получения разрешения, а для некоммерческих перепечаток, пожалуйста, укажите источник.