有名な「ゼロから作るDL」🐟 第7章に出てくる"im2col"。
im2colの定義式について問う問題が、某E資格対策講座の教材で出題されましたので、
図に書いて自分用にメモを取りました。
「視覚的に、なんとなく」 わかってもらえたら幸いです。
im2colのソースコードはどなたでも閲覧可能です。
リンク先githubの39〜68行目が該当します。
im2colの概要については、「ゼロつく」 やその他にお譲りします..。
今回はこのソースコード中の
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
という式 だけ に注目して、解説します!(せまい!)
一応、E資格講座の質問担当様にも、理解に間違いがないかチェックしていただきました。
この式、一見簡単そうに見えますが、よくよく見ると「?」 となるのはぼくだけでしょうか?
1.
まずは簡単のため、前提条件はこんな感じとします。
4 × 4の画像がRGBの3チャンネルあるとします。
ストライドやフィルターの大きさは以下の通り。
pythonでは、例えば
"0:4:2"という表記は、「0列目から4列目まで、2つ飛ばしで」という意味です。
2.
3.
4.
5.
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
の式の右辺の意味は、4.までで(あくまでなんとなく)ご理解いただけたかと思います。
では、この右辺=左辺 とはどういうことか? というと、、
(4つの図は、それぞれ右辺にあたるものが左側、
左辺にあたるものが右側 にあるのでご注意ください)
以上が、
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
の視覚的な理解になります。
おまけ
なお、その次に続く、最後の式
col = col.transpose(0, 4, 5, 1, 2, 3).reshape(Nout_hout_w, -1)
は、詳細までは力尽きて視覚化できませんでしたが、
以下の図のような変換をしている式とのことです。
( (x,y)=(0,0) の時の例だけ載せています )
なんでこの式でこういう変換になるのか、途中を図示できる方はぜひぜひお願いします..
ぼくにはわからない..
おしまいです