首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >神经病:多层感知器反向传播学习无效

神经病:多层感知器反向传播学习无效
EN

Stack Overflow用户
提问于 2015-05-02 04:18:25
回答 1查看 2.9K关注 0票数 3

这个问题与Java库有关。

我有下面的程序,它创建了一个多层感知器,包含一个由20个节点组成的单个隐藏层。学习函数为x^2,采用反向传播学习规则。但是,从输出中可以看出,该程序似乎不起作用。输出总是1。我的程序中有错误吗?

程序

代码语言:javascript
复制
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);
        }
    }
}

输出

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-02 07:33:46

乙状体

乙状结肠激活函数输出范围内的值:

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

替代方法

如果将函数重新建模为1/x^2而不是x^2,则仍然可以教神经网络对指数函数建模,因为这将将x >= 1的输出范围修改为0,1。在训练完成后使用该网络时,必须将1/输出除以,才能得到你想要的指数曲线。

我建立了一个由20个隐藏节点和一个隐藏层组成的网络模型,作为概念的证明:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29998335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档