デモをダウンロード - 2.77 MB (元のアドレス) 手書き文字認識.zip ソースコードをダウンロード - 70.64 KB (元のアドレス) nn手書き文字ソース.zip 導入 これは、Mike O'Neill による素晴らしい記事「手書き数字の認識のためのニューラル ネットワーク」に基づいて、人工ニューラル ネットワークを使用して手書き数字の認識を実装する例です。過去数年間に多くのシステムや分類アルゴリズムが提案されてきましたが、手書き認識はパターン認識において依然として困難なタスクです。 Mike O'Neill のプログラムは、ニューラル ネットワーク アルゴリズム、特にニューラル ネットワークの畳み込み部分による一般的な手書き認識について学習したいプログラマーにとって優れた例です。このプログラムは MFC/C++ で書かれているので、慣れていない人にとっては少し難しいです。そこで、いくつかのプログラムを C# で書き直すことにしました。私のプログラムは良い結果を達成しましたが、まだ優れているわけではありません (収束速度、エラー率などの点で)。しかし、これはプログラムの基本に過ぎず、目的はニューラル ネットワークの理解を助けることなので、少し乱雑で再構築する必要があります。私はこれをライブラリとして再構築しようとしています。これにより、INI ファイルを通じてパラメータを柔軟かつ簡単に変更できるようになります。いつか望み通りの結果が達成できることを願っています。 文字検出 パターン検出と文字候補検出は、私のプログラムで直面しなければならない最も重要な問題の 1 つです。実際、私は Mike のプログラムを別のプログラミング言語で再実装したいだけでなく、文書画像内の文字を認識したいと思っています。インターネットで見つけた非常に優れた物体検出アルゴリズムを提案する研究がいくつかありますが、私のような趣味のプロジェクトには複雑すぎます。娘に絵を教えているときに発見した方法がこの問題を解決しました。もちろん、まだ制限はありますが、最初のテストでは期待を上回る結果となりました。通常、文字候補の検出は、行検出、単語検出、文字検出に分かれており、それぞれ異なるアルゴリズムが使用されます。私のアプローチはこれとは少し異なります。検出には同じアルゴリズムが使用されます:
同様に:
パラメータ hStep (水平ステップ) と vStep (垂直ステップ) を変更することで、行、単語、または文字を簡単に検出できます。 bTopStart を true または false に変更することで、長方形の境界を上から下、左から右に検出することもできます。長方形は widthMin と d によって制約されます。私のアルゴリズムの最大の利点は、同じ行にない単語や文字列を検出できることです。 文字候補の認識は次のように実現できます。
文字認識 元のプログラムの畳み込みニューラル ネットワーク (CNN) には、基本的に入力層を含めて 5 つの層があります。畳み込みアーキテクチャの詳細については、Mike と Simard 博士の論文「ビジュアル ドキュメント分析のための畳み込みニューラル ネットワークの最新技術」で説明されています。この畳み込みネットワークの全体的なスキームは、単純な特徴を高解像度で抽出し、それをより低い解像度の複雑な特徴に変換することです。より低い解像度を生成する最も簡単な方法は、サブレイヤーを 2 倍にサブサンプリングすることです。これは、畳み込みカーネルのサイズの参照を提供します。カーネルの幅は、1 つのユニット (奇数サイズ) を中心として選択され、情報が失われない程度のオーバーラップ (1 つのユニットに対して 3 のオーバーラップは小さすぎます) があり、冗長になりすぎません (7 のオーバーラップは大きすぎます。5 のオーバーラップでは 70% を超えるオーバーラップが実現されます)。したがって、このネットワークでは畳み込みカーネルのサイズとして 5 を選択します。入力をパディングする(特徴セルが境界の中央にくるように入力を大きくする)と、パフォーマンスは大幅に向上しません。したがって、パディングは使用されず、サブサンプリングのためにカーネル サイズは 5 に設定され、各畳み込み層は特徴サイズを n から (n-3)/2 に縮小します。 MNIST の初期入力画像サイズは 28x28 なので、2 回目の畳み込み後に生成される整数サイズはおよそ 29x29 になります。 2 層の畳み込みの後、5x5 の特徴サイズは 3 層目の畳み込みには小さすぎます。 Simard 博士はまた、最初のレイヤーの機能が 5 つ未満の場合、パフォーマンスが低下し、5 つを超えてもパフォーマンスは向上しないことを強調しました (Mike は 6 つを使用しました)。同様に、2 番目のレイヤーでは、50 個未満の機能ではパフォーマンスが低下しましたが、それ以上 (100 個) の機能では改善は見られませんでした。ニューラルネットワークの概要は次のとおりです。 レイヤー #0: MNIST データベースからの手書き文字のグレースケール画像。29 x 29 ピクセルにパディングされています。入力層には 29x29 = 841 個のニューロンがあります。 レイヤー #1: 6 つの特徴マップを持つ畳み込みレイヤーです。ニューロンは 13×13×6 = 1014 個、重みは (5×5+1)×6 = 156 個、レイヤー #1 から前のレイヤーへの接続は 1014×26 = 26364 個あります。 レイヤー 2: 50 個の特徴マップを持つ畳み込みレイヤーです。ニューロンは 5x5x50 = 1250 個、重みは (5x5 + 1)x6x50 = 7800 個、レイヤー #2 から前のレイヤーへの接続は 1250x(5x5x6 + 1) = 188750 個あります。 (Mike の記事にある 32500 の接続ではありません)。 レイヤー #3: 100 ユニットを持つ完全接続レイヤーです。ニューロンは 100 個、重みは 100 x (1250 + 1) = 125100 個、接続は 100 x 1251 = 125100 個あります。 レイヤー #4: 最も大きく、10 個のニューロン、10×(100+1)=1010 個の重み、10×101=1010 個の接続を備えています。 バックプロパゲーション バックプロパゲーションは、最後のレイヤーから始めて最後のレイヤーに到達するまで前進し、各レイヤーでの重みの変化を更新するプロセスです。 標準的なバックプロパゲーションでは、各重みは次の式に従って更新されます。 (1) ここで、eta は「学習率」であり、通常は 0.0005 のような小さな数値で、トレーニング中に徐々に減少します。ただし、収束が遅いため、このプログラムでは標準的なバックプロパゲーションは使用されません。代わりに、LeCun 博士が論文「Efficient BackProp」で提案した「Randomized Diagonal Levenberg-Marquardt」と呼ばれる 2 次手法が適用されます。Mike は、これは標準的なバックプロパゲーションと同じではないと述べていますが、この理論は私のような初心者がコードをより簡単に理解するのに役立つはずです。 Levenberg-Marquardt 法では、rw は次のように計算されます。 二乗コスト関数が次の通りであると仮定します。 勾配は次のようになります。 ヘッセン人は以下の規則に従います。 ヘッセ行列の簡略化された近似はヤコビ行列であり、これは N×O 次元の半行列です。 ニューラル ネットワークでヘッセ行列の対角成分を計算するためのバックプロパゲーション手順はよく知られています。ネットワーク内の各層には次のものがあると仮定します。 (7) ガウス-ニュートン近似(|'(y)を含む項を削除)を使用すると、次の式が得られます。 (8) (9) 同様に: ランダム対角レーベンバーグ・マルカート法 実際、完全なヘッセ行列情報を使用する手法 (Levenberg-Marquardt、Gaus-Newton など) は、ランダム モードではなくバッチ モードでトレーニングされた非常に小さなネットワークにのみ適用できます。レベンバーグ・マルカートアルゴリズムのランダムパターンを得るために、ルカン博士は、各パラメータに関する2次導関数の推定値を操作してヘッセ行列の対角線を計算するというアイデアを提案しました。瞬間的な2次微分は、式(7,8,9)に示すように、逆伝播法によって得ることができる。これらの運用推定値があれば、それを使用して各パラメータの個別の学習率を計算できます。 ここでeはグローバル学習率であり、 は、h ki に関する対角2次微分の演算推定値です。 m は、2 次導関数が小さい場合 (つまり、最適化がエラー関数の平坦な部分で行われる場合) に hki がドリフトするのを防ぐパラメーターです。 2 次導関数は、トレーニング セットのサブセット (トレーニング セットの 500 個のランダム パターン / 60000 個のパターン) で計算できます。これらは非常にゆっくりと変化するため、数サイクルごとに再推定するだけで済みます。元のプログラムでは、対角ヘッセ行列はサイクルごとに再推定されます。 以下は C# の 2 次導関数計算関数です。
トレーニングと実験 MFC/C++ と C# の間には互換性がないにもかかわらず、私のプログラムは元のプログラムと似ています。 MNIST データベースを使用して、ネットワークは 60,000 のトレーニング セット パターンのうち 291 件の誤認を実行しました。つまり、エラー率はわずか 0.485% です。しかし、10,000 パターンのうち 136 個が誤認され、エラー率は 1.36% でした。結果は基本テストほど良くはありませんが、自分の手書き文字セットで実験するには十分です。入力画像はまず上から下に向かって文字グループに分割され、次に各グループ内の文字が左から右に向かって検出され、29x29 ピクセルにサイズ変更されて、ニューラル ネットワーク システムによって認識されます。このソリューションは私の基本的な要件を満たしており、手書きの数字も正しく認識できます。使いやすさを向上させるために、AForge.Net の画像処理ライブラリに検出機能を追加しました。しかし、これは余暇にプログラミングしただけなので、修正が必要なバグがたくさんあると思います。時間の経過によるバックプロパゲーションがその一例です。各エポックでは約 3800 秒のトレーニング時間がかかりますが、実際には 2400 秒しかかかりません。 (私のコンピューターは Intel Pentium Dual-Core E6500 プロセッサを使用しています)。マイクのプログラムと比べると、かなり遅いです。また、手書き文字のより優れたデータベースを作成したり、他の人と協力して実験を継続したり、自分のアルゴリズムを使用して実際のアプリケーションを開発したりしたいと考えています。 オリジナルリンク: https://www.codeproject.com/Articles/143059/Neural-Network-for-Recognition-of-Handwritten-Di 著者: Vietdungiitb [この記事は51CTOコラムニスト「雲家コミュニティ」によるオリジナル記事です。転載の許可を得るには51CTOを通じて原作者に連絡してください] この著者の他の記事を読むにはここをクリックしてください |
<<: 2018年に人工知能がビジネスに及ぼす10のインパクト
>>: ブロックチェーン投資の10大リスクポイント。これらを理解していないなら投資しないでください!
今日では、大規模言語モデル (LLM) とその高度なヒント戦略の出現により、特に古典的な NLP タ...
人工知能を正しく使用するために、いくつかの提案があります。人工知能を実際に使用する際にこれらの提案を...
人工知能 (AI) を使用した予測分析により、企業は過去のデータに基づいて将来の結果を予測し、運用効...
[元記事は51CTO.comより] 2021年7月12日、上海紫竹コートヤードホテルで、神府改革革...
人気の短編動画アプリ「TikTok」(Douyinの海外版)は、主にアルゴリズムのおかげで、世界中で...
[[428985]] [51CTO.com クイック翻訳]今日の人工知能の繁栄は、人工ニューラルネッ...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
[[414016]]ヘルスケア業界における人工知能と機械学習の役割を理解するには、ヘルスケア業界にお...
[[385301]]核となる考え方は、次のように簡単にまとめることができます。ニューラル ネットワー...
[[413003]]アルゴリズムの問題を解決するときに CPP でよく使用されるコンテナ テクニ...
近年、生成 AI とクラウドの融合に関心が集まっているのには理由があります。人工知能 (AI) とク...
ルールを研究し、ランキングの計算方法を大まかに推定した人もいます。今日のランキング = 今日のダウン...
5月26日、チューリング賞受賞者で米国工学アカデミー会員のジョン・ヘネシー氏が、2021年中国国際ビ...
翻訳者|朱 仙中レビュー | Chonglou導入携帯電話、気候センサー、金融市場取引、車両や輸送コ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...