这是一个很奇怪的问题。
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.
这充分描述了我的情况。但是如何处理呢?
我得出的结论是,我遇到的情况是正确的。实际上,对于每种网络配置,都可以将所有连接“切断”到输出层。确实可以做到这一点,例如,通过将所有隐藏权重设置为接近零或在某些疯狂值上设置偏差,以使隐藏层过饱和并使输出独立于输入。之后,我们可以自由调整输出层,以使它只是独立于输入而再现输出。在批处理学习中,发生的事情是对梯度进行平均,并且网络仅复制目标的均值。输入没有任何作用。
我的答案不能完全准确,因为您尚未发布功能perceptron(...)
和backpropagation(...)
的内容。
但是根据我的猜测,您对一个网络进行了很多次网络训练,然后在循环for data in training_data
中对另一个网络进行了完全训练,这导致您的网络只会记住最后一个。相反,尝试对每个数据进行一次网络训练,然后再次进行多次(反转嵌套循环的顺序)。
换句话说,for I = 1:number of patterns
循环应位于backpropagation(...)
函数的循环内,因此此函数应包含两个循环。
示例(在C#中:
这里是反向传播功能的某些部分,我在这里简化了它。在权重和偏差的每次更新时,将“传播”整个网络。在此URL上可以找到以下代码: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