アルゴリズムの実装は正しいので (何百回もチェックしました)、理論上の事実を誤解していると思います。
jがhiddenlayer
側を指し、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 を適用します
。
「#」と「-」で構成される文字、9(行)x7(列)を認識しようとしています。
MSE は、数エポック後に 172 でスタックします。
RPROP がバッチ学習であることは知っていますが、とにかく機能すると読んだので、オンライン学習を使用しています。