PyTorchのチュートリアルで畳み込みが出てきてしましました。まだ畳み込みデビューしてないのに・・・
難しい内容だったのかな。
PyTorchの60分チュートリアルのニューラルネットワークに進もうと内容を見てみましたが、「畳み込み」という概念が出てきましたので、まずは畳み込みについて勉強です。
また、Pythonのクラスでニューラルネットワークを構築しますので、Pythonのクラスについても調べています。
今回の勉強でクリアしていきたいPyTorchのチュートリアル
こんな人の役にたつかも
・機械学習プログラミングの勉強をしている人
・畳み込みニューラルネットワークの「畳み込み」について知りたい人
・PyTorchのチュートリアルで迷子になった人
畳み込みニューラルネットワーク
PyTorchの60分チュートリアルの最初に構築しようとするのが、畳み込みニューラルネットワーク(Convolutional Neural Network, CNN )と呼ばれるものです。機械学習初学者には少しハードルが高いと感じつつ、畳み込みニューラルネットワークを理解するために調査です。
ニューラルネットワークに「畳み込み処理」という処理を追加したもので、人間の視覚を参考にしたもので、「画像認識」や「動画認識」の分野でよく使われる代表的なニューラルネットワークの種類です。
普通のニューラルネットワークでの画像処理
普通のニューラルネットワークとは、一般的な全結合のニューラルネットワークのことをイメージしています。
以前、FashionMNIST(衣料品画像の認識)やMNIST(手書き文字の認識)を行った時は、次のように、入力層に対して、1次元の配列として画像を渡していました。
入力は28×28で、784個存在しています。784個を一列に並べて、784個の入力へいれる、ということをしていました。それを10個のクラス分類へと変換するようなニューラルネットワークを勉強しました。
このように単純に画像のピクセルを並べて入力とする方法には、色々と問題があります。
このような方法では、
・画像の角度が少しずれていたり
・認識したい対象のサイズ感が違ったりする
このような相対的な位置の変化を捉え切ることができないようです。画像の中の物体の位置、角度、写っている大きさ、そのようなものには影響されないように物体を認識したいですよね。
確かに、機械学習的なスマートさに欠けますよね・・・
ということで先のような画像の位置的な問題を克服するために、写っている物体の特徴をうまいこと抽出してくれるような画像への処理が、畳み込み処理です。
畳み込みニューラルネットワーク(CNN)の全体像
画像を入れる先に「畳み込み層」と「プーリング層」というものが接続されます。
最後は、全結合のニューラルネットワークに入ります。
このような、「畳み込み層」+「プーリング層」はいくつか重ねることもあるようです。基本的には、畳み込みを行ってプーリングを行う、という流れで画像の特徴的な部分が抽出でき、そのデータが全結合ニューラルネットワーク(一般的なニューラルネットワーク)に入るようです。
畳み込み層とプーリング層
畳み込み層
畳み込み層では、「フィルタ」、またはカーネルと呼ばれる小さな枠を通すことで、元画像から特徴を抽出するような作業を行います。
フィルターは例のため、適当な数値を設定しています。このフィルターの値も、ネットワークの訓練で模索されて最適化されていきます。
実際、フィルターを利用して、次のように画像を変換しています。
上の図の赤右矢印のようなフィルタを動かす量を「ストライド」と言います。
フィルターの内部計算としては、①の場合、
「(0×1)+(0×0)+(0×1)+(0×0)+(6×0)+(7×0)+(0×1)+(5×0)+(0×1)=0」のように、フィルターとの掛け算の総和の計算が行われています。
フィルタはフォトショップやイラレの「効果」のようなイメージでしょうか、使うフィルタによって浮き彫りにされる特徴が変化します。映像をぼかしたり、輪郭をくっきりさせたり、そんな処理を取り入れているようなイメージです。
畳み込みニューラルネットワークでは、教師データが正解となるようにフィルタの値を調節します。訓練で最適な画像の特徴を見つけるようにフィルタを変化させていきます。
畳み込み層では、入力画像1つに対してかけるフィルタの数だけ、出力画像枚数が増えます。フィルタの数はあらかじめ手動で決めておかなければならないハイパーパラメータになっています。
プーリング層
プーリング層では、畳み込みを行った画像から、画像の特徴的な部分を取ってきて画像を圧縮する処理が行われます。
一般的に、「MAXプーリング」という処理が行われることが多いようです。
MAXプーリング
指定した範囲(2×2など)で画像を分割して、その範囲で一番大きい値を持ってくるような処理です。2×2の枠でプーリングをすると、画像サイズは縦横半分になります。画像を圧縮する、という処理になります。
2×2で畳み込みされた画像を区切ります。区切られた枠のなかの最大値を出力に当てはめます。
2×2でMAXプーリングすると、画像サイズが半分になります。
なんとなくイメージが掴めてきたような・・・いないような
概念を勉強したら、実際にプログラミングだね。
次の記事はこちらです。