Помощь с neuroph нейронной сети

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

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

5 ответов


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

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

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

http://www.heatonresearch.com/encog

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

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


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

ускорение итераций хорошо. Но делать больше с тренировочной итерацией часто еще лучше. И делаю это лучше всех.

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

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


вы тренируетесь с GUI или Java-кодом и какую версию Neuroph вы используете? Если вы используете GUI, возьмите последнюю обновленную версию 2.4u1 (только что загрузил его) имеет некоторые улучшения производительности. Также, какой алгоритм обучения вы используете, и какие настройки? Вы можете попробовать DynamicBackpropagation. Ваш проект звучит очень интересно и мне очень жаль, что у вас проблемы с 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 определить правильные настройки. Его еще не закончили, но в основном он генерирует все возможные комбинации настроек обучения и пытается один за другим. Надеюсь, это поможет вы, также, если у вас есть дополнительные вопросы или нужна помощь с чем-то не стесняйтесь спрашивать.


Если вы ищете облегченную (Nen Beta - Я не знаю, как он сравнивается с Neuroph или Encog, но a производительность и скорость-сравнение с LibSVM выглядит вполне перспективной.


может быть, слишком поздно,но я тоже использую 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;
    }

}