Линейная регрессия DL4J

Я новичок в нейронных сетях. Я пытаюсь реализовать и обучить простую нейронную сеть с помощью DL4j. Моя функция:

y = x * 2 + 300

Мое видение Мое видение

Мой результат Мой результат

Параметры:

    public final int seed = 12345;
    public final int iterations = 1;
    public final int nEpochs = 1;
    public final int batchSize = 1000;
    public final double learningRate = 0.01;
    public final Random rng = new Random(seed);
    public final int numInputs = 2;
    public final int numOutputs = 1;
    public final double maxX = 100;//xmax = 100; ymax=500. 
    public final double scale = 500;//for scale out x and y. 

Конфигурация сети:

    public MultiLayerConfiguration createConf() {
        return new NeuralNetConfiguration.Builder()
                .seed(seed)
                .iterations(iterations)
                .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                .learningRate(learningRate)
                .weightInit(WeightInit.XAVIER)
                .updater(new Nesterovs(0.9))
                .list()
                .layer(0, new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
                        .activation(Activation.IDENTITY)
                        .nIn(numInputs).nOut(numOutputs).build())
                .pretrain(false).backprop(true).build();
    }

Данные тренировки:

    public DataSetIterator generateTrainingData() {

        List<DataSet> list = new ArrayList<>();

        for (int i = 0; i < batchSize; i++) {

            double x = rng.nextDouble() * maxX * (rng.nextBoolean() ? 1 : -1);
            double y = y(x);

            list.add(
                    new DataSet(
                            Nd4j.create(new double[]{x / scale, 1}),
                            Nd4j.create(new double[]{y / scale})
                    )
            );
        }

        return new ListDataSetIterator(list, batchSize);
    }

Тестирование:

    public void test() {

        final MultiLayerNetwork net = new MultiLayerNetwork(createConf());
        net.init();
        net.setListeners(new ScoreIterationListener(1));

        for (int i = 0; i < nEpochs; i++) {
            net.fit(generateTrainingData());
        }

        int idx = 0;
        double x[] = new double[19];
        double y[] = new double[19];
        double p[] = new double[19];
        for (double i = -90; i < 100; i += 10) {
            x[idx] = i;
            y[idx] = y(i);
            p[idx] = scale * net.output(Nd4j.create(new double[]{i / scale, 1})).getDouble(0, 0);
            idx++;
        }
        plot(x, y, p);
    }

Подскажите, пожалуйста, что я делаю не так, или у меня неправильное зрение...

Заранее спасибо, С уважением, Минас


person mabramyan    schedule 07.01.2018    source источник


Ответы (1)


Взгляните на этот пример: https://github.com/deeplearning4j/dl4j-examples/tree/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/feedforward/regression

Несколько советов:

Используйте наши встроенные инструменты нормализации. Не делай этого сам. Наши инструменты нормализации также позволяют нормализовать метки.

Отключите мини-пакет (установите мини-пакет (false) в конфигурации нейронной сети вверху).

Кроме того, вы каждый раз регенерируете набор данных. Нет необходимости делать это. Просто создайте его один раз и передайте, чтобы он подходил.

В целях визуализации используйте механизм восстановления, о котором я упоминал ранее (это в примере, вы можете выбрать 1 из любых нормализаторов, таких как MinMaxScalar, NormalizeStandardize и т. д.)

Ваши итерации также неверны. Просто сохраните это значение равным 1 и сохраните цикл for. В противном случае вы просто перетренируетесь и потратите гораздо больше времени на тренировки, чем нужно. На самом деле «итерация» — это количество обновлений, которые вы хотите выполнить для каждого вызова подгонки в одном и том же наборе данных. В следующем релизе мы все равно избавимся от этой опции.

person Adam Gibson    schedule 07.01.2018
comment
Ссылка мертва. Следуйте этому: github.com/eclipse/deeplearning4j-examples/tree/master/ - person Anna Klein; 16.07.2020