畳み込みニューラルネットワークの紹介#
畳み込みニューラルネットワークの全体的なまとめ#
畳み込みニューラルネットワーク(Convolutional Neural Networks、CNN)は、ニューヨーク大学の Yann Lecun によって 1998 年に提案され、その本質は多層パーセプトロンです。これは、畳み込み計算を含み、深い構造を持つ前向きニューラルネットワーク(Feedforward Neural Networks)の一種であり、深層学習(Deep Learning)の代表的なアルゴリズムの一つです。畳み込みニューラルネットワークは、他のニューラルネットワークと同様に、逆伝播アルゴリズムを使用して訓練されますが、ネットワークの構造が異なります。
畳み込みニューラルネットワークの基本的な特徴#
多層階層ネットワーク構造を持つ#
畳み込みニューラルネットワーク(CNN)は、最初の本当に成功した多層階層構造のネットワークであり、堅牢性を持つ深層学習手法と見なされています。これは、データの空間的関連性を掘り下げることによって、ネットワーク内の訓練可能なパラメータの数を減少させ、前向き伝播ネットワークの逆伝播アルゴリズムの効率を改善します。
CNN では、画像の小さな領域(「局所感知領域」とも呼ばれる)が階層構造の下層の入力データとして扱われ、情報は前向きにネットワーク内の各層を通過し、各層はフィルターで構成されており、観測データのいくつかの顕著な特徴を取得できるようになっています。局所感知領域は、画像内の境界や角などの基本的な特徴を取得できるため、この方法は移動、伸縮、回転に対する相対的な不変性を提供することができます。
CNN の階層間の密接な関連性と空間情報は、特に画像の処理と理解に適しており、画像から豊富な関連特性を自動的に抽出することができます。
サンプルに対して複雑な前処理が不要#
畳み込みニューラルネットワーク(CNN)の分類モデルは、従来のモデルとは異なり、二次元画像をモデルに直接入力し、出力端で分類結果を提供することができます。その利点は明らかで、複雑な前処理が不要で、特徴抽出とパターン分類を完全にブラックボックスに入れ、継続的な最適化を通じてネットワークに必要なパラメータを取得し、出力層で必要な分類結果を提供します。CNN の特徴抽出層のパラメータは訓練データから学習されるため、人工的な特徴抽出を回避し、訓練データから学習します。
局所接続、強い一般化能力を持つ#
畳み込みニューラルネットワーク(CNN)の一般化能力は他の方法よりも顕著に優れており、パターン分類、物体検出、物体認識などの分野で広く応用されています。畳み込みニューラルネットワークを使用してパターン分類器を構築し、畳み込みニューラルネットワークを汎用のパターン分類器として、グレースケール画像に直接使用します。
畳み込みニューラルネットワーク(CNN)は、局所感知領域、重みの共有、空間または時間におけるダウンサンプリングを組み合わせることによって、データ自体に含まれる局所性などの特徴を最大限に活用し、ネットワーク構造を最適化し、一定の程度の移動や変形に対する不変性を保証します。したがって、CNN は移動、スケーリング、その他の形状の歪みに対する不変性を持つ二次元または三次元画像を認識するために使用できます。
畳み込みニューラルネットワーク(CNN)は、深層の教師あり学習下の機械学習モデルであり、非常に強い適応性を持ち、データの局所的特徴を掘り下げ、グローバルな訓練特徴と分類を抽出します。その重みの共有構造ネットワークは、生物の神経ネットワークにより似ており、パターン認識の各分野で良好な成果を上げています。
重みの共有、ネットワークパラメータを減少させる#
畳み込みニューラルネットワーク(CNN)の重みの共有特性は、解決する必要のあるパラメータの数を減少させることができます。畳み込み層では、各ニューロンがデータウィンドウに接続する重みは固定されており、各ニューロンは 1 つの特徴にのみ注目します。複数のフィルター(畳み込みカーネル)を使用して画像を畳み込むと、複数の特徴マップ(Feature Map)が得られ、同じ特徴マップのニューロンは重みを共有し、ネットワークパラメータを減少させます。これは、畳み込みネットワークが全結合ネットワークに対して持つ大きな利点の一つです。
一方で、重みの共有はネットワークの複雑さを同時に低下させ、多次元入力信号(音声、画像)をネットワークに直接入力する特性は、特徴抽出と分類プロセスにおけるデータの再配置を回避します。
隠れ層のパラメータの数は隠れ層のニューロンの数とは無関係で、フィルターのサイズとフィルターの種類の数にのみ関係しています。隠れ層のニューロンの数は、元の画像(つまり入力のサイズ、すなわちニューロンの数)、フィルターのサイズ、およびフィルターが画像内をスライドするステップサイズに関係しています。
CNN ネットワーク構造と基本原理#
典型的な CNN は 3 つの主要部分(畳み込み層、プーリング層、全結合層)で構成され、合計で 5 つの層があります。
- 入力層
- 畳み込み層
- 活性化層
- プーリング層
- 全結合層
簡単に説明すると:
畳み込み層は画像内の局所的な特徴を抽出する役割を担い、プーリング層はパラメータの次元を大幅に削減します(次元削減);全結合層は従来のニューラルネットワークの部分に似ており、望ましい結果を出力します。
典型的な CNN は、以下で言及される 3 層構造だけでなく、レイヤーを組み合わせて多層構造を形成します。例えば、LeNet-5 の構造は、畳み込み層 – プーリング層 - 畳み込み層 – プーリング層 – 畳み込み層 – 全結合層です。
入力層 -------- 前処理#
従来のニューラルネットワーク / 機械学習と同様に、モデルには入力の前処理操作が必要です。一般的な 3 つの前処理方法は、平均を取り除く、正規化、PCA/SVD による次元削減などです。
畳み込み層 —— 特徴抽出#
畳み込み層は、1 つの畳み込みカーネルで画像全体をスキャンします。このプロセスは、フィルター(畳み込みカーネル)を使用して画像の各小領域をフィルタリングし、これらの小領域の特徴値を取得することと理解できます。
まとめ:畳み込み層は畳み込みカーネルのフィルタリングを通じて画像内の局所的な特徴を抽出し、上記の人間の視覚の特徴抽出に似ています。
活性化層#
活性化とは、実際には畳み込み層の出力結果に対して非線形マッピングを行うことです。
活性化関数を使用しない場合(実際には活性化関数が f (x)=x である場合)、この場合、各層の出力は前の層の入力の線形関数です。神経ネットワーク層がいくつあっても、出力は入力の線形結合であり、隠れ層がない場合と同じ効果になり、最も基本的なパーセプトロンになります。
一般的に使用される活性化関数には:
- Sigmoid 関数(遅い)
- Tanh 関数(テキストと音声処理に良好な効果)
- ReLU(速いが効果は良くない)
- Leaky ReLU
- ELU
- Maxout
今回は ReLU 関数を使用しました。
プーリング層(ダウンサンプリング)—— データの次元削減、過学習の回避#
プーリング層は簡単に言えばダウンサンプリングまたはアンダーサンプリングであり、主に特徴の次元削減、データとパラメータの数の圧縮、過学習の軽減、モデルの耐障害性の向上に使用されます。主に以下があります:
- Max Pooling:最大プーリング
- Average Pooling:平均プーリング
全結合層 —— 出力結果#
前述の畳み込み + 活性化 + プーリングを経て、最終的に出力結果に到達します。モデルは学習した高品質の特徴画像を全結合層に渡します。実際、全結合層の前にニューロンの数が過大で学習能力が強い場合、過学習が発生する可能性があります。したがって、ドロップアウト操作を導入して、神経ネットワーク内の一部のニューロンをランダムに削除し、この問題を解決します。また、局所的な正規化(LRN)、データ拡張などの操作を行い、堅牢性を高めることもできます。
全結合層に到達したとき、これは単純な多クラス神経ネットワーク(例:BP 神経ネットワーク)として理解でき、softmax 関数を通じて最終的な出力を得て、全体のモデルの訓練が完了します。
手書き認識プロセスの概要#
- データセットを取得
- 訓練データセット
- GUI プログラムを実行
- GUI プログラムでマウスで手書き入力
- CNN を使用して全結合層から認識結果を出力
訓練環境、訓練結果と GUI インターフェースの表示(テストセットのランダム抽出とマウス手書き入力を含む)#
訓練環境#
システム環境#
wsl(Windows Subsystem for Linux)を選択
Linux では、Python に存在する小さなバグは比較的少なく、日常使用では Windows が便利であるため、wsl(Windows Subsystem for Linux)を選択しました。また、以前に wsl に conda 環境をインストールしていたため、再構成の必要はありませんでした。
Python 環境#
Miniconda を選択
Anaconda は非常に重く、インストールサイズは 2GB を超え、通常使用しないソフトウェア(例:Python IDE:Spyder)を多数インストールします。ほとんどの場合、より現代的なエディタ(例:VS Code)を使用しているため、授業前に私のコンピュータの Python 環境は Miniconda でした。
Python 依存関係のインストール#
すでに conda 環境をインストールしているので、pip を使用して依存関係を管理する必要はなく、直接 conda を使用して管理できます。私はこのような仮想環境の構成ファイルenvironment.yml
を作成し、conda env create --file environment.yml
を通じて必要な依存関係のすべてをインストールしました。具体的には、私は当時他の人のブログを参考にしました(1)。
name: aiclass_handwriting
channels:
- defaults
dependencies:
- python=3.6 # Python 3.6バージョンを選択
- tensorflow
- numpy
- matplotlib
- pylint
- autopep8
- notebook
- PyQt
- PyQtGraph
エディタ#
VS Code を選択
エディタもチュートリアルとは異なり、主に以前の開発環境がそうだったためです。
具体的には、私は当時チュートリアルを参考にしました(2)。
コンピュータハードウェア#
Lenovo R9000P 2021 バージョン
訓練結果#
下の図は今回の実験の loss 曲線です。

最終的なテスト精度は 98.7% です。
GUI インターフェースの表示#
初期画面#
ランダム抽出#
手書き認識#
プロセス中の問題と体験#
問題#
テストセットと訓練セットが重複している可能性#
この実験はテストセットと訓練セットを区別していないようで、一定のリークが発生し、マウス手書き入力の Softmax が MNIST からランダムに抽出されたセットよりも著しく低くなっています(私の訓練が理想的な目標に達していないか、コードの理解が不十分である可能性もあります)。
wsl でのフォント表示に最初に問題があった#
デフォルト設定は Windows 環境であり、デフォルトフォントは Linux で中国語文字が欠落しているため、フォントを置き換えることで解決しました。
訓練が遅い#
より小さなデータセットを使用して訓練します。
体験#
データセットのサイズが精度に与える影響は、訓練層数の影響よりもはるかに小さいです。
コーディングは非常に面白いプロセスです。
参考資料リンク#
[1] Anaconda を使用しないでください:適切な機械学習環境を設定する方法は? https://blog.spencerwoo.com/2020/02/dont-use-anaconda
[2] wsl で Visual Studio Code を使用する https://dowww.spencerwoo.com/3-vscode/3-0-intro.html