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);
}
Пожалуйста, скажите мне, что я делаю неправильно или у меня неправильное зрение...
Заранее спасибо, С уважением, Минас
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. В противном случае вы просто перегружаете и тратите гораздо больше времени на тренировки, чем вам нужно. "Итерация" - это фактически количество обновлений, которые вы хотите выполнить за один вызов фитинга в одном и том же наборе данных. В следующем выпуске мы все равно избавимся от этой опции.