这是一个奇怪的问题。
A有一个完美的反向传播代码,如下所示:
现在,当我进行批量学习时,即使只涉及一个简单的标量函数逼近,我也会得到错误的结果。
训练后,网络为所有输入模式产生几乎相同的输出。
此刻我尝试过:
我注意到,在针对一种模式进行一系列反向传播后,网络为各种输入产生几乎相同的输出。
当我尝试近似函数时,我总是得到线(几乎是一条线)。像这样:
相关问题:Neural Network Always Produces Same/Similar Outputs for Any Input 并且添加偏见神经元的建议并没有解决我的问题。
我发现了一个帖子:
When ANNs have trouble learning they often just learn to output the
average output values, regardless of the inputs. I don't know if this
is the case or why it would be happening with such a simple NN.
足够详细地描述了我的情况。但是如何处理呢?
这是实际代码(在Matlab中):
我得出结论,我遇到的情况有权成为。实际上,对于每个网络配置,人们可能只是“切断”到输出层的所有连接。这实际上是可行的,例如,通过将所有隐藏权重设置为接近零或将偏差设置为某些疯狂值,以使过度饱和隐藏层并使输出独立于输入。之后,我们可以自由调整输出层,这样就可以独立于输入再现输出。在批量学习中,会发生的是梯度得到平均值,而净值只能再现目标的均值。输入不起任何作用。
答案 0 :(得分:1)
我的回答不能完全准确,因为您尚未发布函数perceptron(...)
和backpropagation(...)
的内容。
但是根据我的猜测,你在一个数据上训练你的网络很多次,然后在循环for data in training_data
中完全在另一个上训练你的网络,这导致你的网络只会记住最后一个。相反,尝试在每个数据上训练一次网络,然后再次多次执行(颠倒嵌套循环的顺序)。
换句话说,for I = 1:number of patterns
循环应该在backpropagation(...)
函数的循环内,所以这个函数应该包含两个循环。
示例(在C#中):
以下是反向传播函数的一些部分,我在这里进行了简化。在权重和偏差的每次更新时,整个网络被“传播”。可以在以下网址找到以下代码:https://visualstudiomagazine.com/articles/2015/04/01/back-propagation-using-c.aspx
public double[] Train(double[][] trainData, int maxEpochs, double learnRate, double momentum)
{
//...
Shuffle(sequence); // visit each training data in random order
for (int ii = 0; ii < trainData.Length; ++ii)
{
//...
ComputeOutputs(xValues); // copy xValues in, compute outputs
//...
// Find new weights and biases
// Update weights and biases
//...
} // each training item
}
可能不起作用的只是你想要在这个评论之后(在Batch learn
中作为一个例子)用一个辅助for
循环来封闭所有内容以进行多个学习时期:
%--------------------------------------------------------------------------
%% Get all updates