Помощь с нейрофильной сетью Neuroph - PullRequest
9 голосов
/ 06 июня 2010

Для своих исследований в аспирантуре я создаю нейронную сеть, которая обучает распознавать изображения. Я собираюсь сделать это намного сложнее, чем просто взять сетку значений RGB, уменьшить частоту дискретизации и отправить их на вход сети, как это делают многие примеры. Я на самом деле использую более 100 независимо обученных нейронных сетей, которые обнаруживают такие особенности, как линии, шаблоны затенения и т. Д. Гораздо больше похоже на человеческий глаз, и до сих пор это работает очень хорошо! Проблема в том, что у меня есть немного тренировочных данных. Я показываю более 100 примеров того, как выглядит машина. Затем 100 примеров того, как выглядит человек. Затем более 100 из того, на что похожа собака и т. Д. Это довольно много тренировочных данных! В настоящее время я бегу около недели, чтобы обучить сеть. Это как бы убивает мой прогресс, так как мне нужно приспособиться и переобучиться.

Я использую Neuroph в качестве низкоуровневого API нейронной сети. Я использую двухъядерный компьютер (16 ядер с гиперпоточностью), так что это должно быть быстро. Мой процент процессора составляет всего 5%. Есть ли какие-нибудь хитрости в исполнении Neuroph? Или производительность Java в целом? Предложения? Я аспирант по когнитивной психологии, и я неплохой программист, но не очень разбираюсь в программировании производительности.

Ответы [ 5 ]

12 голосов
/ 06 июня 2010

Да, я пошел по этой дороге несколько месяцев назад.Также для университетского проекта.Первая проблема - Нейроф.Это смертельно медленно.Neuroph хорошо знает основные проблемы архитектуры и производительности, на прошлой неделе была только статья о проекте кода.

http://www.codeproject.com/KB/recipes/benchmark-neuroph-encog.aspx

Я пошел по тому же пути, что и автор этой статьи.Переключение с Neuroph на Encog - это действительно простой порт.У автора вышеупомянутой статьи даже есть другой, который сравнивает синтаксис Encog, JOONE и Neuroph, так что вы можете сравнить это.Для получения дополнительной информации о Encog,

http://www.heatonresearch.com/encog

Encog также получит больше преимуществ от ваших ядер.Просто посмотрите на таблицу в приведенной выше статье.

Удачи!Ваше исследование звучит действительно круто, я бы хотел увидеть результаты.

4 голосов
/ 06 июня 2010

Также посмотрите на ваш метод обучения. Многоядерные помогают вам работать быстрее. Работать умнее тоже хорошо. Если вы просто используете обратное распространение, вам понадобится много времени, чтобы сойтись. Как минимум, используйте что-то вроде устойчивого распространения, я думаю, что это может быть в Neuroph. Или посмотрите на градиент Scaled Conjugate или Levenberg Marquardt. Encog делает оба из них. Encog также может использовать ваш графический процессор для еще большей скорости, используя OpenCL.

Ускорение итераций - это хорошо. Но делать БОЛЬШЕ с обучающей итерацией часто даже лучше. И делать ОБА лучше всего.

Насколько независимы ваши нейронные сети? Честно говоря, я главный программист Encog, и мне бы очень хотелось, чтобы вы переключились. НО, если у вас не хватает времени, и вам нужно остаться Neuroph, и эти сети действительно независимы, то вы можете создать несколько потоков и запустить несколько циклов обучения Neuroph одновременно. За все ваши ядра. Предполагая, что в Neuroph нет ничего, что могло бы сойти с ума, когда есть несколько экземпляров их тренера одновременно. Я не знаю Neuroph достаточно хорошо, чтобы сказать, насколько это вновь.

Также я согласен, ваше исследование звучит очень интересно.

3 голосов
/ 08 июня 2010

Тренируетесь ли вы из GUI или Java-кода и какую версию Neuroph вы используете? Если вы используете GUI, возьмите последнюю обновленную версию 2.4u1 (только что загрузив ее), она имеет некоторые улучшения производительности. Кроме того, какой алгоритм обучения вы используете, и какие настройки? Вы можете попробовать DynamicBackpropagation. Ваш проект звучит очень интересно, и мне очень жаль, что у вас проблемы с Neuroph. Мы не знали, что производительность Neuroph настолько низка по сравнению с другими, до этих тестов, и мы обязательно улучшим это в будущем.

Как предложил Джефф (спасибо Джеффу), если ваши сети независимы, вы можете сделать что-то вроде этого:

for(int index = 0; index < numberThreads ; index++ ) {    
    MultiLayerPerceptron mlp = new MultiLayerPerceptron(inputSize, hiddenLayerSize,outputSize);      
    SupervisedLearning learningRule = (SupervisedLearning)mlp.getLearningRule(); 
    learningRule.setMaxError(maxError); 
    learningRule.setMaxIterations(maxIterations); // make sure we can end. 
    learningRule.addObserver(this); // user observer to tell when individual networks are done and launch new networks. 
    this.mlpVector.add(mlp);
    mlp.learnInNewThread(trainingSet);
} 

Кроме того, поскольку у вас так много сетевых параметров обучения, они могут иметь решающее значение, поэтому вы можете использовать Neuroph trainer для определения правильных настроек. Он еще не закончен, но в основном он генерирует все возможные комбинации настроек тренировки и пробует одну за другой. Надеюсь, что это поможет вам, даже если у вас есть дополнительные вопросы или вам нужна помощь, не стесняйтесь спрашивать.

0 голосов
/ 25 апреля 2016

Может быть, слишком поздно, но я тоже использую Neuroph. Я создаю до 100 тысяч сетей за ночь с моим SSD и 4-ядерным процессором. Когда вы используете Java 8, вы можете выполнять многопоточность без особых навыков кодирования. Просто взгляните на новых «Исполнителей» Java 8. Я использую его в своем классе. Взгляните на объект "Обезьяна". И, пожалуйста, не против плохого стиля кодирования. Мне нужно было быстро здесь ...

package de.sauer.dispe;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.Instant;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.data.DataSet;
import org.neuroph.nnet.MultiLayerPerceptron;
import org.neuroph.nnet.learning.BackPropagation;
import org.neuroph.util.TransferFunctionType;

import de.sauer.dispe.model.Director;
import de.sauer.dispe.model.Specialist;

@SuppressWarnings("rawtypes")
public class DirBreeder_old {

    private static final int MAX_ITER = 40;
    public static final double GG_EPS = 0.49;
    private static final double[] ERROR_RANGE = {0.02, 0.05, 0.47};
    private static final double[] LEARNING_RANGE = {0.1, 0.1, 0.3};
    private static final int[] LAYER_RANGE = {25, 5, 50};

    private static final TransferFunctionType[] TF_TYPES = {
            TransferFunctionType.GAUSSIAN,
            TransferFunctionType.LOG
        };

    private static final String DIRECTOR_FOLDER = SpecAnalyser.SPEC_PATH+"\\director\\";
    private static final String OUTPUT_SUMMARY_FILE = DIRECTOR_FOLDER+"\\summary.csv";
    private static final String DATASET_FILE = TeamBuilder.TEAM_PATH+"\\1918_train.csv";
    private static ExecutorService MONKEY;

    public static void main(String[] args) throws IOException {
        doStuff();
    }

    public static void doStuff() throws IOException {
        System.out.println("Starting at: "+Instant.now());
        int counter = 0;

        MONKEY = Executors.newFixedThreadPool(4);
        FileWriter output = new FileWriter(new File(OUTPUT_SUMMARY_FILE), true);

        DataSet ds = DataSet.createFromFile(DATASET_FILE, 11, 1, ";");

        for(int firstLayer=LAYER_RANGE[0];firstLayer<=LAYER_RANGE[2];firstLayer+=LAYER_RANGE[1]) {
            for(int secondLayer=LAYER_RANGE[0];secondLayer<=LAYER_RANGE[2];secondLayer+=LAYER_RANGE[1]) { 
                for(int thirdLayer=LAYER_RANGE[0];thirdLayer<=LAYER_RANGE[2];thirdLayer+=LAYER_RANGE[1]) { 
                    for(int forthLayer=LAYER_RANGE[0];forthLayer<=LAYER_RANGE[2];forthLayer+=LAYER_RANGE[1]) { 
                        for(double maxError=ERROR_RANGE[0];maxError<=ERROR_RANGE[2];maxError+=ERROR_RANGE[1]) {
                            for(double learnRate=LEARNING_RANGE[0];learnRate<=LEARNING_RANGE[2];learnRate+=LEARNING_RANGE[1]) {
                                for(TransferFunctionType tft: TF_TYPES) {

                                    Specialist trainee = new Director(
                                            buildAnn(tft, firstLayer, secondLayer, thirdLayer, forthLayer), 
                                            tft, 
                                            maxError, 
                                            ds, 
                                            MAX_ITER, 
                                            GG_EPS, 
                                            learnRate);

                                    MONKEY.execute(new Trainer(trainee, output, counter++));
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println("Building "+counter);
        MONKEY.shutdown();
        try {
            MONKEY.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        output.flush();
        output.close();
    }

    @SuppressWarnings("unchecked")
    private static NeuralNetwork<BackPropagation> buildAnn(TransferFunctionType tft, int layer1, int layer2, int layer3, int layer4) {
        NeuralNetwork nn = new MultiLayerPerceptron(tft, 11, layer1, layer2, layer3, layer4, 1);
        nn.randomizeWeights();
        return nn;
    }

}
0 голосов
/ 19 февраля 2012

Если вы ищете легковесную (<50kb) реализацию нейронной сети на Java, вы также можете взглянуть на <a href="http://sourceforge.net/p/nen/" rel="nofollow"> Nen Beta - я не знаю, как это сравнить с Neuroph или Encog, но сравнение производительности и скорости с LibSVM выглядит довольно многообещающе.

...