1

我写了一个 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 上有全部内容。现在一切都写好了,我只是不知道我应该如何进行实际测试以确保我正确编写了训练方法。

几个月前我问了一个类似的问题。

4

2 回答 2

3

具有 669 个观测值的 10 个参数并不是一个大数据集。因此,您的算法可能存在问题。你可以做两件事来让你的算法更容易调试:

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

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

于 2013-08-07T18:43:08.050 回答
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具有许多其他参数的类型,用于获取它的值并且你的收敛依赖于它。通常,在训练神经网络时,当收敛在可接受的误差范围内(不是您试图检查的严格等式)时,您会停止。

希望这可以帮助

于 2013-08-07T18:00:40.290 回答