这个问题与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发布于 2015-05-02 07:33:46
乙状体
乙状结肠激活函数输出范围内的值:

看起来,您正在尝试教sigmoid函数输出1到10000的值,这是不可能的。因此,网络所能达到的最佳适应度就是始终输出1。

替代方法
如果将函数重新建模为1/x^2而不是x^2,则仍然可以教神经网络对指数函数建模,因为这将将x >= 1的输出范围修改为0,1。在训练完成后使用该网络时,必须将1/输出除以,才能得到你想要的指数曲线。
我建立了一个由20个隐藏节点和一个隐藏层组成的网络模型,作为概念的证明:

https://stackoverflow.com/questions/29998335
复制相似问题