14『画像の機械学習_畳み込み (Convolution)』
画像データをニューラルネットワークへ投入する際に、そのまま短冊をつなぎ合わせるように数列化(Linear化)して投入してもよいが、せっかくの2次元のデータの関連性が失われてしまう。2次元のまま特徴を抽出しながら圧縮しLinear化したほうが機械学習に有利とされているようです。この作業が畳み込み(covolution)で、任意サイズの行列(カーネルと呼ばれる重み行列とバイアス行列)を準備し(これらの行列の値が誤差逆伝播で学習するべきパラメータ)、このカーネルをもとの画像に覆いかぶせるように掛算(重み)と和(バイアス)により値をだして総和を求める。これをあらたな行列の値にするというものです。これを1ピクセルとか2ピクセルずつずらして(stride)、最終的に元よりも少し小さい画像ができる。この作業の前に行列の四方周囲にブランク値を埋めることもあります(padding)。この際には画像のサイズは小さくならないこともあります。このカーネルの値によって畳み込みされた画像はさまざまな特徴を含むようになり、機械学習で有用な情報値となり得ます。ここまでがconvolutionですが、さらに続いてpooling(プーリング)を行うことも多いです。これは2×2や3×3などの範囲から最大値や平均値を採用して新しい行列の値にするというものです。サイズ2×2、stride2のpoolingをおこなえば、画像サイズは半分になります。下の図の
[[0.5, 0, 0 ] [0, 0, 0 ] [0, 0, 0.5]]
がカーネル(今回は重みweightのみ)
元画像(12×12)、畳み込み後(10×10)、maxプーリング後(5×5)
畳み込み: カーネルサイズ3×3, padding0, stride1、最大値プーリング: サイズ2×2, stride2
最後にtorch.nn.functionalで同じ結果が得られることを確認