0

由于算法的实现是正确的(我检查了数百次),我想我误解了一些理论事实。
我假设:假设
j 指的是隐藏层侧,k 指的是输出层
∂E/∂wjk 通过以下方式计算:

outputNeuron[k].errInfo=(target[k]-outputNeuron[k].out)*derivate_of_sigmoid(outputNeuron[q].in);
∂E/∂wjk=outputNeuron[k].errInfo*hiddenNeuron[j].out;

对于∂E/∂wij,其中“i”指的是输入层,“j”指的是隐藏层,它有点长。
每个隐藏单元 (Zj, j = 1, ... ,p) 将其增量输入(来自输出层中的单元)相加,

errorInfo_in[j]=从 k=1 到 m(输出单元数)的总和: outputNeuron[k].errInfo*w[j][k]

然后我计算隐藏单元的错误信息:

hiddenNeuron[j].errInfo=errorInfo_in[j]*derivated_sigmoid(hiddenNeuron[j].in);

最后,∂E/∂wij 是:

hiddenNeuron[j].errInfo*x[i](其中 x[i] 是输入单元的输出)

我按照此处的描述应用 RPROP http://www.inf.fu-berlin.de/lehre/WS06/Musterererkennung/Paper/rprop.pdf
对于输入和隐藏以及隐藏输出之间的所有权重。
我正在尝试识别由 '#' 和 '-' 、 9(rows)x7(columns) 组成的字母。
几个时期后,MSE 卡在 172 处。
我知道 RPROP 是批量学习,但我正在使用在线学习,因为我读到它仍然有效。

4

1 回答 1

1

RPROP 不适用于纯在线学习,它可能适用于 mini-batch 学习,前提是 mini-batch 足够大。MSE 的绝对值不能很好地指示任何事情,尤其是在黄金标准值未知的自定义数据集上。

最好先在逻辑门(AND、OR、XOR)等简单事物上测试新实现的 NN 算法,然后再转向更复杂的事物。这样,您将始终对自己的代码和方法充满信心。对于字符识别任务,您可能还想在众所周知的数据集(例如 MNIST)上进行测试,其中预期结果是已知的,您可以将您的结果与以前的工作进行比较。

对于分类任务,人们通常希望测量分类的准确性,因为它是比 MSE 更好的性能指标。

于 2015-04-07T10:07:01.917 回答