【フレームワークを使用せず】ゼロから作る物体検出AIモデル
【No.10】ニューラルネットワークの実装(3層のNN構築-概要)
1. 本記事について
本記事は、これまでの内容(ニューラルネットワークの理解その1〜4)を踏まえ、ニューラルネットワークをpythonプログラムに落とし込んでいきます。
本記事はこれまで実装してきた処理を使用して、簡単なニューラルネットワーク(NN)を実装していきます。
(前回は、重みの更新について解説しました。)
ニューラルネットワークの実装(入力層・Affine前半〜重みの更新)を見てから、本記事を見ることをお勧めします。
注意事項として、本シリーズではpythonの基礎的な解説、numpyの基礎的な解説は割愛させていただきます。特に、numpy配列やshape等頻出なので、その辺の知識が不十分の場合は、そちらの習得を先に行うことをお勧めします。
本シリーズを進めていくにあたり、参考にさせていただく書籍があります。オライリー・ジャパンから出版されている「ゼロから作るDeep Learning ーPythonで学ぶディープラーニングの理論と実装」です。
本記事は、上記書籍を参考にさせていただいております。
2. 構築するNNの概要
前回迄実装してきた各処理を使って、簡単なニューラルネットワーク(以下NN)を構築し、実際に学習と推論を行ってみます。
これから行うことは、①NNの概要を決定、②NNをpythonで構築、③構築したNNで楽手と推論
です。今回は①を行います。
使用する関数
まず、前回迄実装してきた各処理(クラス)を以下に列挙します。
・Affine・Leaky ReLU
・loss(SSE)
・SGD(今回は使用しない)
・Momentum
これらを使用します。
入力
次に、NNに入力するものを確認します。入力は画像データです。サイズは28*28でモノクロ画像です。
図1の様に数字が描かれている画像です。
入力する画像は「0」から「2」が描かれたものを使用します。
NNを使って、入力画像が「0」の画像なのか「1」の画像なのか「2」の画像なのか判定してもらおうと思っています。
アーキテクチャ
次に、NNの構成(アーキテクチャ)を考えます。
要は、中間層を何層にするとか、第2層目のノードは何個にするとかを決めます。
今回中間層は3層にします。
各層のノード数は以下とします。
中間層1層目:400
中間層2層目:100
中間層3層目:3
(出力層) :3
入力層は画像サイズに合わせて28*28*1=784としています。
もし入力がカラー画像だったら28*28*3=2352となります。
画像データを1次元化してネットワークに流すのは微妙なのですが、今回は中間層にAffineを使用するのでこの様にしています
(本シリーズの後半で、画像の形状そのままで処理可能なネットワーク(CNN)を解説しますので、お待ちいただければと思います)。
中間層はAffineを使用し、Affineの後に活性化関数Leaky ReLUを使用します。
3層目については恒等関数です(つまり、活性化関数を使用しないことと同義)。
出力層は何もしません。出力層でよくある処理が、多クラス分類をする際にソフトマックス関数を入れ込む等です。
実は今回も多クラス分類なので、最後にソフトマックス関数、ロス関数にクロスエントロピー誤差を使用するのが王道かと思いますが、今回はそれらは扱いません。理由は、YOLOv1で上記いずれも使用していないからです。
ロス関数
ロス関数を決めます。SSE(2乗和誤差)を使用します。
式1
2つの中間層を経て、ロス関数で誤差を算出します。
重み更新
誤差を算出したら、それを元に逆伝播を実施します。逆伝播によって各重みの勾配(dW)が計算されるので、dWを使って重みを更新します。
今回Momentumを使用します。SGDでなくMomentumを使用する理由は、YOLOv1でMomentumを使用しているからです。
次回は定義したアーキテクチャや関数を実際にpythonで書いてみようと思います。
3. まとめ
今回はニューラルネットワークの実装(3層のNN構築-概要)について解説しました。
次回も是非みてみてください!
4. 参考文献
斎藤康毅 著 「ゼロから作るDeep Learning ーPythonで学ぶディープラーニングの理論と実装」
Link
Search