Matlab 反向传播神经网络隐层所有输出为1

Matlab 反向传播神经网络隐层所有输出为1,matlab,neural-network,Matlab,Neural Network,每个人我都创建了一个神经网络,有1600个输入,一个隐藏层有不同数量的神经元节点和24个输出神经元。 我的代码显示,我可以减少每个历元的错误,但隐藏层的输出总是1。由于这个原因,调整后的重量对我的测试数据总是产生相同的结果。 我尝试在ANN中使用不同数量的神经元节点和学习速率,并随机初始化初始权重。我使用sigmoid函数作为激活函数,因为我的输出在不同的输出中是1或0。 我可以知道隐藏层输出总是1的主要原因是什么,我应该如何解决它? 我建立这个神经网络的目的是识别字母表的24个手形,我在项目的

每个人我都创建了一个神经网络,有1600个输入,一个隐藏层有不同数量的神经元节点和24个输出神经元。 我的代码显示,我可以减少每个历元的错误,但隐藏层的输出总是1。由于这个原因,调整后的重量对我的测试数据总是产生相同的结果。 我尝试在ANN中使用不同数量的神经元节点和学习速率,并随机初始化初始权重。我使用sigmoid函数作为激活函数,因为我的输出在不同的输出中是1或0。 我可以知道隐藏层输出总是1的主要原因是什么,我应该如何解决它? 我建立这个神经网络的目的是识别字母表的24个手形,我在项目的第一阶段尝试了强度数据。 我尝试了30个隐藏的神经节点,100个神经节点,甚至1000个神经节点,但是隐藏层的输出仍然是1。由于这个原因,测试数据中的所有结果总是相似的。 我为我的网络添加了代码 谢谢

g=inline('logsig(x)');
[行,列]=大小(输入);
numofInputNeurons=col;
权重\输入\隐藏=兰德(numofInputNeurons,numofFirstHiddenNeurons);
权重\隐藏\输出=兰德(numofFirstHiddenNeurons,numofOutputNeurons);
年代=0;
误差矩阵=[];
while(true)
如果(totalEpochs>0&&epochs>=totalEpochs)
打破
结束
totalError=0;
时代=时代+1;
对于i=1:行
targetRow=零(1,numOutputNeurons);
targetRow(1,target(i))=1;
隐藏输出=g(输入(1,1:结束)*权重输入隐藏);
最终输出=g(隐藏输出*重量隐藏输出);
错误=abs(targetRow-最终输出);
误差=总和(误差);
totalError=totalError+错误;
如果(错误~=0)
delta_final_output=学习率*(targetRow-final_output)。*final_output.*(1-final_output);
delta_hidden_output=学习率*(hidden_output)。*(1-hidden_output)。*(delta_final_output*权重_hidden_output');
对于m=1:numofirsthiddenneurons
对于n=1:numofOutputNeurons
当前变化=增量最终输出(1,n)*隐藏输出(1,m);
权重隐藏输出(m,n)=权重隐藏输出(m,n)+当前变化;
结束
结束
对于m=1:numofInputNeurons
对于n=1:numofirsthiddenneurons
当前变化=增量隐藏输出(1,n)*输入(1,m);
权重输入隐藏(m,n)=权重输入隐藏(m,n)+当前变化;
结束
结束
结束
结束
totalError=totalError/(行);
误差矩阵(end+1)=总误差;
如果(errorThreshold>0&&totalEpochs==0&&totalError
我发现代码中有几个明显的错误需要修复:

1)初始化时没有负权重。这可能会使网络卡住。重量初始化应类似于:

weight_input_hidden = 0.2 * rand(numofInputNeurons, numofFirstHiddenNeurons) - 0.1;
2)您没有实施偏见。这将严重限制网络的学习能力。你应该回到你的笔记中,找出答案,在确定每一层的激活之前,它通常被实现为一个额外的1列插入到输入和激活向量/矩阵中,并且应该有一个匹配的额外的权重列

3)输出层的增量错误。此行

delta_final_output = learningRate * (targetRow - final_output) .* final_output .* (1 - final_output);
。不是输出层激活的增量。它有一些额外的不必要的因素

输出层中正确的增量和S形激活应为:

delta_final_output = (final_output - targetRow);
delta_hidden_output = (hidden_output) .* (1-hidden_output) .* (delta_final_output * weight_hidden_output');
根据您的目标函数,还有其他可能性,但未显示。原始代码的均方误差已接近正确,如果更改符号并删除
learningRate

4)隐藏层的增量错误。此行:

delta_hidden_output = learningRate * (hidden_output) .* (1-hidden_output) .* (delta_final_output * weight_hidden_output');
。不是隐藏层激活的增量。由于某种原因,您已经乘以了
learningRate
(与另一个增量相结合,这意味着您有一个learningRate的平方因子)

正确的增量应为:

delta_final_output = (final_output - targetRow);
delta_hidden_output = (hidden_output) .* (1-hidden_output) .* (delta_final_output * weight_hidden_output');
5)您的体重更新步骤需要调整以匹配(3)和(4)的修正。这些行:

current_changes = delta_final_output(1, n) * hidden_output(1, m);
需要调整以获得正确的符号和学习率乘数

current_changes = -learningRate * delta_final_output(1, n) * hidden_output(1, m);

这是代码中的5个bug,我可能遗漏了一些。但我认为现在这已经足够了。

请添加一个详细的代码。解释它为什么不起作用以及你希望它做什么。你会得到“隐藏层的输出总是1”这样的结果的主要原因是你的代码中有一个bug。为了更好地分析可能导致错误的原因,您需要显示您的代码。您好,谢谢您的回复。我在帖子中添加了代码。正如@NeilSlater所说,通常是一个bug。您是否正在尝试使网络输出值>1?您好,感谢您的回复,这节省了我的时间,我可以知道,当我的神经网络在许多时期减少误差并增加误差时,这是否正常。Thanks@TanK.Seang:在基本梯度下降法中,训练误差值可能会上下波动。一个很好的模式是,错误应该快速下降,然后开始变化(有时上升,有时下降),但在许多时期内,平均值仍然会下降。如果该值开始持续上升,那么您可能会遇到问题,例如学习率太高,或者可能存在错误。再次感谢,我是否可以知道这也可能是因为我的培训数据不够好,无法进行分类?这是因为我的识别项目是从图像中识别24个静态ASL符号,一些形状可能类似,所以这是我的疑问。非常感谢,因为我只使用原始像素值,所以我认为