我写了一个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。答案 0 :(得分:3)
具有669个观测值的十个参数不是大数据集。因此,您的算法可能存在问题。您可以做两件事使调试算法变得更加容易:
在每次迭代结束时打印平方误差之和。这将帮助您确定算法是否正在收敛(根本),陷入局部最小值,或者只是非常缓慢地收敛。
在简单的数据集上测试您的代码。选择一些像二维输入一样容易的东西,你知道它是线性可分的。你的算法会学习两个输入的简单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
类型,其中包含许多其他参数以获取其值,并且您的收敛依赖于它。通常,在训练神经网络时,当收敛在可接受的误差限制内时,您会停止(不像您要检查的严格相等)。
希望这有帮助