konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【DeepLearning特訓】CNN入門

E資格向けの自習アウトプット
自分用メモ

CNN(Convolutional Neural Network)は、畳み込みニューラルネットワークと呼ばれる、畳み込みという圧縮に似た(圧縮ではない)処理で入力次元を削減しつつ、特徴量をあぶり出していく手法です
主に画像のクラス分類や物体検出、領域分割(セグメンテーション)などに使われることが多い模様

CNNの概念

画像データは、ちょっとした解像度のデータでも入力データとしては非常に大きい次元になる。チャネル数 x H x W (カラーだとRGB 3チャネル)
ちょっとしたスマホのカメラでも何万画素になるので、各層のパラメータもすごくでかくなりがち
また画像は人間の目からすると、見た目は変わらない1ピクセルずらしたただけでも入力データとしては、全く別物と扱われてしまう
これを改善する処理が 畳み込み(Convolution)プーリング(Pooling)
近い位置の情報も統合して圧縮したりするので、少しの移動にも強い

処理の流れは以下な感じ
f:id:konchangakita:20210113192830p:plain

畳み込み

画像データは3次元(チャネル数 x H x W )の形状であり、空間的に近いピクセルは似たような値であったり、逆にとおいピクセルは同士は関わりが薄かったり、RGBそれぞれは関連性があったりとその形状に特徴がある
畳み込み層は、この3次元の形状は維持しながら、カーネル(フィルタ)を使って特徴量をあぶり出してゆく

やってることは、画像のフィルター処理のようなもの
カーネル(フィルタ)をずらしながら積和演算を繰り返していく
f:id:konchangakita:20210113202414p:plain
重みとバイアスは学習パラメータ

学習パラメータであるカーネル(フィルタ)が共有され使いまわしできるので、メモリの使用量が減る

重要な設定項目

パディング:隅っこのピクセルは使われる回数が少なくなるので、周りゼロ埋めする
f:id:konchangakita:20210113223855p:plain

numpyでは、np.pad を使うだけ

gazo = np.arange(9).reshape(3,3)
np.pad(gazo, 1, 'constant')

===
array([[0, 0, 0, 0, 0],
       [0, 0, 1, 2, 0],
       [0, 3, 4, 5, 0],
       [0, 6, 7, 8, 0],
       [0, 0, 0, 0, 0]])

ストライド:1度のフィルタ計算をどれだけずらすか
f:id:konchangakita:20210114124854p:plain
f:id:konchangakita:20210114124948p:plain

プーリング

局所的な領域から重要は特徴のみを抽出する
学習パラメータを持たず、実装はシンプルだが強力
小さな移動があっても同じ結果を返してくれる

最大値プーリング、カーネル内の最大値を一つ返す
平均値プーリング、カーネル内での平均値を返す
f:id:konchangakita:20210113234753p:plain


まとめ

画像処理は IoT でも需要なので、熱心にお勉強中
試験でもここはパーフェクトしたい
この後は、Python実装のためのお作法をおさえていきます