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