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

时间:2015-09-02 11:48:30

标签: matlab neural-network

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

g =  inline('logsig(x)');
[row, col] = size(input);
numofInputNeurons = col;

weight_input_hidden = rand(numofInputNeurons, numofFirstHiddenNeurons);
weight_hidden_output = rand(numofFirstHiddenNeurons, numofOutputNeurons);

epochs = 0;    
errorMatrix = [];

while(true)
    if(totalEpochs > 0 && epochs >= totalEpochs)
        break;
    end
    totalError = 0;
    epochs = epochs + 1;
    for i = 1:row
        targetRow = zeros(1, numofOutputNeurons);
        targetRow(1, target(i)) = 1;

        hidden_output = g(input(1, 1:end)*weight_input_hidden);
        final_output = g(hidden_output*weight_hidden_output);

        error = abs(targetRow - final_output);
        error = sum(error);
        totalError = totalError + error;

        if(error ~= 0)
             delta_final_output = learningRate * (targetRow - final_output) .* final_output .* (1 - final_output);
             delta_hidden_output = learningRate * (hidden_output) .* (1-hidden_output) .* (delta_final_output * weight_hidden_output');

            for m = 1:numofFirstHiddenNeurons
                for n = 1:numofOutputNeurons
                    current_changes = delta_final_output(1, n) * hidden_output(1, m);
                    weight_hidden_output(m, n) = weight_hidden_output(m, n) + current_changes; 
                end
            end

            for m = 1:numofInputNeurons
                for n = 1:numofFirstHiddenNeurons
                    current_changes = delta_hidden_output(1, n) * input(1, m);
                    weight_input_hidden(m, n) = weight_input_hidden(m, n) + current_changes;       
                end
            end
        end
    end

    totalError = totalError / (row);
    errorMatrix(end + 1) =  totalError;

    if(errorThreshold > 0 && totalEpochs == 0 && totalError < errorThreshold)
            break;
    end

 end

1 个答案:

答案 0 :(得分:2)

我在代码中看到了一些需要修复的明显错误:

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);

。 。 。不是输出图层激活的增量。它有一些额外的不需要的因素。

输出层中logloss objective function和sigmoid激活的正确delta将是:

delta_final_output = (final_output - targetRow);

根据您的目标功能,还有其他可能性,未显示。原始代码是 close 以纠正均方误差,如果您更改了符号并删除了因子learningRate

,这可能仍然有效

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

delta_hidden_output = learningRate * (hidden_output) .* (1-hidden_output) .* (delta_final_output * weight_hidden_output');

。 。 。不是隐藏图层激活的增量。由于某种原因,您乘以learningRate(与其他delta相结合,这意味着您有一个learningRate平方因子)。

正确的delta将是:

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个错误,我可能错过了一些。但我认为现在已经绰绰有余了。