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

标签 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几个月前。

最佳答案

具有 669 个观测值的 10 个参数并不是一个大数据集。所以你的算法可能有问题。您可以做两件事来简化算法的调试:

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

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

关于java - 我怎么知道我的神经网络正在被正确训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18110215/

相关文章:

java - 在对象创建时定义类型,例如 HashMap<type here>

javascript - Angular 4 单元测试,但出现错误 No provider for Http

java - 如何对需要键盘输入的方法进行单元测试?

java - 模块化应用程序堆栈中的虚拟数据和单元测试策略

java - 在库项目内的 Activity 中使用 Android 通用图像加载器

java - 确定 Java 中的二进制/文本文件类型?

java - float 属性在 HtmlWorker(iText) 中不起作用

machine-learning - 深度置信网络与卷积神经网络在非图像分类任务上的性能比较

python - 我试图在神经网络训练中理解 'epochs'。接下来的实验是等价的吗?

machine-learning - 加载 tensorflow 层的自定义权重