数字認識プログラムを作ろうとしています。数字の白/黒の画像をフィードすると、出力レイヤーが対応する数字を発火させます (出力レイヤーの 0 -> 9 ニューロンから 1 つのニューロンが発火します)。2 次元 BackPropagation ニューロン ネットワークの実装が完了しました。私のトポロジ サイズは [5][3] -> [3][3] -> 1 [10] です。つまり、1 つの 2-D 入力層、1 つの 2-D 非表示層、および 1 つの 1-D 出力層です。ただし、奇妙で間違った結果が得られます (平均エラーと出力値)。
この段階でのデバッグには時間がかかります。したがって、これが正しい設計であるかどうかを知りたいので、デバッグを続けます。私の実装のフローステップは次のとおりです。
ネットワークの構築: 出力層を除く各層に 1 つのバイアス (バイアスなし)。Bias の出力値は常に = 1.0 ですが、その Connections Weights は、ネットワーク内の他のすべてのニューロンと同様に、パスごとに更新されます。すべての重みの範囲は 0.000 -> 1.000 (負の値なし)
入力データ (0 | OR | 1) を取得し、n 番目の値を入力層の n 番目のニューロン出力値として設定します。
フィード フォワード: すべてのレイヤー (入力レイヤーを除く) の各ニューロン 'n' で:
- 前のレイヤーからこの n 番目のニューロンに接続されたニューロンの SUM (出力値 * 接続の重み) の結果を取得します。
- この SUM の TanHyperbolic - Transfer Function - を結果として取得します
- 結果をこの n 番目のニューロンの出力値として設定する
結果の取得: 出力層のニューロンの出力値を取得する
誤差逆伝播法:
- ネットワーク エラーの計算: 出力層で、SUM ニューロンの (ターゲット値 - 出力値)^2 を取得します。この SUM を出力レイヤーのサイズで割ります。SquareRoot を Result として取得します。平均誤差の計算 = (OldAverageError * SmoothingFactor * Result) / (SmoothingFactor + 1.00)
- 出力層勾配の計算: 各出力ニューロン 'n' について、n 番目の勾配 = (n 番目のターゲット値 - n 番目の出力値) * n 番目の出力値 TanHyperbolic Derivative
- 隠れ層勾配の計算: 各ニューロン 'n' について、SUM (この n 番目のニューロンからの重みの正接双曲線導関数 * 宛先ニューロンの勾配) を結果として取得します。(結果 * この n 番目の出力値) をグラデーションとして割り当てます。
- すべての重みを更新: 非表示層から入力層に戻り、n 番目のニューロンについて: NewDeltaWeight = (NetLearningRate * n 番目の出力値 * n 番目の勾配 + Momentum * OldDeltaWeight) を計算します。次に、新しい重みを (OldWeight + NewDeltaWeight) として割り当てます。
- プロセスを繰り返します。
これが数字の7に対する私の試みです。出力は Neuron # zero と Neuron # 6 です。Neuron 6 は 1 を運ぶ必要があり、Neuron # zero は 0 を運ぶ必要があります。私の結果では、6 以外のすべての Neuron は同じ値を運んでいます (# zero はサンプルです)。
長い投稿で申し訳ありません。これを知っていれば、それがどれほどクールで、1 つの投稿でどれだけ大きいかがわかるでしょう。前もって感謝します