質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

483閲覧

【ゼロから作るdeep learning1】 7章 im2colの実装は、なぜ出力特徴マップ毎に値を格納しているのでしょうか。

kenmero

総合スコア30

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2022/12/15 17:16

質問

掲題の通り、書籍のim2colの実装は、下記のように出力特徴マップのサイズでデータを格納した後、
データをリサイズしております。

私的に出力特徴マップでデータを格納するのはイメージがつきにくく、フィルター毎に計算を行うのだから、
フィルター毎にデータを格納した後、データをリサイズすればいいのではと思い、
下記順番に変えて、実装してみたところ、同じ結果を得る事ができました。
(実装は、最後に記載します。)

python

1# 特徴マップのサイズでデータを格納 2col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) 3 4# フィルターのサイズでデータを格納 5col = np.zeros((N, C, out_h, out_w, filter_h, filter_w))

同じ結果が得られることから、解読のしやすさの観点からも
フィルターサイズ毎にデータを格納した方がいいのでは?と思ってしまうのですが、
何かデメリットがあるのでしょうか?
※例えば、特徴マップでデータを格納した方が、ループ数が少なく、処理速度が速くなる?等

ご教授頂けますと、幸いです。

実装① 書籍版(特徴マップサイズで格納)

python

1def im2col(input_data, filter_h, filter_w, stride=1, pad=0): 2 N, C, H, W = input_data.shape 3 out_h = (H - filter_h + 2*pad) // stride + 1 4 out_w = (W - filter_w + 2*pad) // stride + 1 5 6 # 行列の前後にパディング 7 img = np.pad(input_data, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant') 8 # 戻り値初期化 9 col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) 10 11 # 格納 12 for y in range(filter_h): 13 y_max = y + stride*out_h 14 y_max2 = y + filter_h 15 for x in range(filter_w): 16 x_max = x + stride*out_w 17 x_max2 = x + filter_w 18 col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride] 19 20 col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1) 21 return col

実装② オリジナル(フィルターサイズで格納)

python

1 2# 3def im2col2(input_data, filter_h, filter_w, stride=1, pad=0): 4 N, C, H, W = input_data.shape 5 out_h = (H - filter_h + 2*pad) // stride + 1 6 out_w = (W - filter_w + 2*pad) // stride + 1 7 8 # 行列の前後にパディング 9 img = np.pad(input_data, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant') 10 # 戻り値初期化 11 col = np.zeros((N, C, out_h, out_w, filter_h, filter_w)) 12 13 # 格納 14 # 出力縦サイズでループ 15 for y in range(out_h): 16 y_max = y + filter_h 17 18 # 出力横サイズでループ 19 for x in range(out_w): 20 x_max = x + filter_w 21 col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride] 22 col = col.transpose(0, 2, 3, 1, 4, 5).reshape(N*out_h*out_w, -1) 23 return col

比較結果

python

1x1 = np.random.rand(1, 3, 7, 7) 2col1 = im2col(x1, 5, 5, stride=1, pad=0) 3col2 = im2col2(x1, 5, 5, stride=1) 4 5# アンマッチ数 6np.sum(col1 != col2) 7> 0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問