FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

「機械学習と深層学習」をやってみる(7. 深層学習: 畳み込みニューラルネットワーク)

機械学習と深層学習」をやってみる。今回は第5章の深層学習のうち、畳み込みニューラルネットワークを実践してみる。

深層学習、いわゆるディープラーニングは、これまでのニューラルネットワークの階層をより深くしたものだが、以下の問題がある。

そこで、これらを解決するためのネットワークの構成として、畳み込みニューラルネットワークと自己符号化器のネットワークが挙げられている。

畳み込みニューラルネットワークは、画像認識などの処理に利用されることの多いネットワークの形態で、「畳み込み層」と「プーリング層」の2つから構成されている。

「畳み込み層」はいわゆる画像のフィルタリングなどの処理に似ており、隣接する人工ニューロンとの関係を計算することによって、エッジを抽出したり画像の特徴を抽出することができるようになる。 一方で「プーリング層」は画像の位置ずれを認識する処理に似ており、隣接する人工ニューロンの中で特徴のある値を抽出することによって、画像の特徴を抽出する。

次に、自己符号化器は単層のネットワークだが、入力と同一の出力を生成するように学習が行われる。内部の層は入出力層よりも少ない人工ニューロンで構成されており、入力値の特徴を記憶するという役割を持っている。

ネットワークの内において自己符号化器を複数段構成することによって入力値の特徴を要約し、最後に画像識別のためのニューラルネットワークを付け加えることで入力信号の識別を行うようなニューラルネットを構築することができる。

f:id:msyksphinz:20170620001241p:plain

今回は、まず畳み込みニューラルネットワークC言語を用いて実装してみる。

github.com

大きく2つの関数が定義されており、

  • conv(double filter[][FILTERSIZE], double e[][INPUTSIZE], double convout[][INPUTSIZE]) 畳み込み演算を実行する。入力値に対して畳み込み演算を実行する。
  • maxpooling (double convout[][INPUTSIZE], int i, int j) (i,j)位置のニューロンに対して、最大値を抽出するプーリング演算を実施する。

これにより、まずは畳み込み演算により画像の特徴が抽出され、プーリング層により画像の特徴が要約されるというわけだ。

$ ./cp < ../book/ch5/data1.txt
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000

0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 3.000 0.000 0.000 0.000 0.000

0.000 3.000 0.000
0.000 3.000 0.000
0.000 3.000 0.000