编程语言
首页 > 编程语言> > java-Neuroph:多层感知器反向传播学习不起作用

java-Neuroph:多层感知器反向传播学习不起作用

作者:互联网

此问题与Neuroph Java库有关.

我有以下程序,该程序创建一个包含20个节点的单个隐藏层的多层感知器.正在学习的函数是x ^ 2.使用反向传播学习规则.但是,从输出中可以明显看出,该程序似乎无法正常工作.输出始终为1.我的程序中是否有错误?

程序

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;

public class SquareNeuralNetwork {

    public static void main(String[] args) {
        NeuralNetwork neuralNetwork = new MultiLayerPerceptron(TransferFunctionType.SIGMOID, 1, 20, 1);
        DataSet trainingSet = new DataSet(1, 1);
        for (int i = 1; i <= 100; i++) {
            trainingSet.addRow(new double[]{i}, new double[]{i * i});
        }
        BackPropagation backPropagation = new BackPropagation();
        backPropagation.setMaxIterations(10);
        neuralNetwork.learn(trainingSet, backPropagation);
        for (int i = 1; i <= 100; i++) {
            neuralNetwork.setInput(i);
            neuralNetwork.calculate();
            double output = neuralNetwork.getOutput()[0];
            System.out.println(i + " - " + output);
        }
    }
}

输出量

1 - 1.0
2 - 1.0
3 - 1.0
4 - 1.0
5 - 1.0
6 - 1.0
7 - 1.0
8 - 1.0
9 - 1.0
10 - 1.0
11 - 1.0
12 - 1.0

解决方法:

乙状结肠

S型激活函数的输出值范围为:

似乎您正在尝试教导Sigmoid函数输出1到10000之间的值,这是不可能的.因此,网络可以实现的最佳适应性总是输出1.

替代方法

如果将函数重新建模为1 / x ^ 2而不是x ^ 2,您仍然可以教神经网络对指数函数进行建模,因为对于x≥1,这会将输出范围修改为[0,1].在训练完成后使用网络,您必须将1 /输出除以得到您想要的指数曲线.

我为包含20个隐藏节点和一个隐藏层的网络建模,以证明其概念:

标签:neural-network,java
来源: https://codeday.me/bug/20191028/1952038.html