てゆーか、ニューラルネットワークってなんだったっけ?
入出力数とか層数などは気にせずこんな風にニューロンを使った関数がニューラルネットワークでした。そして層が比較的深いものを多層パーセプトロンといいました。よく見ると入出力がベクトル
になっていますね。いいんです。実際データなんてベクトル形式なんです。各学生のテストのデータも、競馬のデータも株価も終値とかを横並びにしてベクトルです。しかーーし!
これ今日僕がとって虹なんですけど。こんな風に画像を入力としたい場合はベクトルじゃなくないですか?実際サイズは(691 × 502)ですし、しかもRGBなんです。RGBはレッド・グリーン・ブルーの略です、つまり3次元。 この画像のニューラルネットワークの入力として使いたいとするとこのままだと無理なので作戦を考える必要があります。- とりあえずグレースケールにする(RGBからモノクロ)
- 各行を横に並べてのベクトルにするもしくは縦に並べたベクトルにする
それは無理やりすぎる
ごもっともです。行列をベクトルにするなんて邪道すぎますね。行列入力できるニューラルネットワークが畳み込みニューラルネットワーク(Convolutional Neural Network)
なんです。そう、画像に特化したニューラルネットワーク。けどどうやって行列入力可能にしたんや?
その前に、そもそもなんで画像をベクトルとして扱うべきでないかというと たとえばこの画像、四角で囲ったところを1ピクセルだとします。ここだけ見ても何もわからなくないですか?というのはこのピクセルから学習できそうなことはあるのか?ということです。一方で こう見るとどうですか?虹がハッキリと映っていてさっきよりは意味あるピクセルになっていますよね、つまり、コンピューターが画像を学習するには今までのようなベクトルの要素単位ではなくもっと大きな範囲を1単位として見る必要があるからです。それが畳み込み
なんです。この場合だと真ん中の行列がコンピューターの目となりKernel matrixといったりします。これをずらしていって手前の出力を作るんですがとりあえず一気に定式化します。- 入力シェイプは フィルタ数: K フィルタサイズ: F スライド幅: S パディング: P
- 出力シェイプは
- 縁の畳み込み回数が増える
- パラメータの更新数が増える
- カーネルのサイズを調節できる
スライド幅: 1
スライド幅: 2
緑のブロックにカーネルを重ね合わせ線型結合を計算します。この際、スライド幅が適切でないシェイプが少数になるのでそこだけ注意。 CNNでは畳み込みに加えてPoolingという操作があります。これは画像の縮小です。今までのニューラルネットワークでは隠れ層のノード数を減らすことで次元を落としていました。これを行列入力においても可能にしようというものです。 具体的な方法はMax-poolingというものです。のKernelでスライド幅2だと次のようになります。 定式化すると- 入力: フィルタサイズ: F スライド幅: S
- 出力: