我怎么知道我的神经网络正在被正确训练

时间:2013-08-07 17:46:42

标签: java unit-testing machine-learning artificial-intelligence neural-network

我写了一个Adaline神经网络。我编写的所有内容,所以我知道我写的内容没有问题,但我怎么知道我必须正确算法?当我尝试训练网络时,我的计算机只是说应用程序正在运行而且它正在运行。大约2分钟后我就停止了它。

培训通常需要这么长时间(我有10个参数和669个观察值)吗? 我只需要让它运行更长时间吗?

听到我的火车方法

public void trainNetwork()
{
    int good = 0;

    //train until all patterns are good.
    while(good < trainingData.size())
    {
        for(int i=0; i< trainingData.size(); i++)
        {
            this.setInputNodeValues(trainingData.get(i));
            adalineNode.run();

            if(nodeList.get(nodeList.size()-1).getValue(Constants.NODE_VALUE) != adalineNode.getValue(Constants.NODE_VALUE))
            {
                adalineNode.learn();
            }
            else
            {
                good++;
            }
        }
    }
}

这是我的学习方法

public void learn()
{
    Double nodeValue = value.get(Constants.NODE_VALUE);
    double nodeError = nodeValue * -2.0;
    error.put(Constants.NODE_ERROR, nodeError);
    BaseLink link;
    int count = inLinks.size();
    double delta;

    for(int i = 0; i < count; i++)
    {
        link = inLinks.get(i);
        Double learningRate = value.get(Constants.LEARNING_RATE);
        Double value = inLinks.get(i).getInValue(Constants.NODE_VALUE);
        delta = learningRate * value * nodeError;
        inLinks.get(i).updateWeight(delta);
    }
}

这是我的跑步方法

public void run()
{
    double total = 0;

    //find out how many input links there are
    int count = inLinks.size();

    for(int i = 0; i< count-1; i++)
    {
        //grab a specific link in sequence
        BaseLink specificInLink = inLinks.get(i);
        Double weightedValue = specificInLink.weightedInValue(Constants.NODE_VALUE);
        total += weightedValue;
    }

    this.setValue(Constants.NODE_VALUE, this.transferFunction(total));
}

这些函数是我正在编写的库的一部分。我在Github上有整件事here。现在所有内容都已编写完成,我只是不知道应该如何进行实际测试以确保我正确编写了训练方法。

几个月前我问a similar question

2 个答案:

答案 0 :(得分:3)

具有669个观测值的十个参数不是大数据集。因此,您的算法可能存在问题。您可以做两件事使调试算法变得更加容易:

  1. 在每次迭代结束时打印平方误差之和。这将帮助您确定算法是否正在收敛(根本),陷入局部最小值,或者只是非常缓慢地收敛。

  2. 在简单的数据集上测试您的代码。选择一些像二维输入一样容易的东西,你知道它是线性可分的。你的算法会学习两个输入的简单AND函数吗?如果是这样,它是否会倾向于XOR功能(2个输入,2个隐藏节点,2个输出)?

答案 1 :(得分:0)

如果权重变得饱和且更加融合,您应该添加调试/测试模式消息以观察。 good < trainingData.size()可能没有发生。

基于Double nodeValue = value.get(Constants.NODE_VALUE);我假设NODE_VALUE属于Double类型?如果是这种情况,则此行nodeList.get(nodeList.size()-1).getValue(Constants.NODE_VALUE) != adalineNode.getValue(Constants.NODE_VALUE)可能不会真正收敛double类型,其中包含许多其他参数以获取其值,并且您的收敛依赖于它。通常,在训练神经网络时,当收敛在可接受的误差限制内时,您会停止(不像您要检查的严格相等)。

希望这有帮助