分からないこと
「ゼロから作るDeepLearning」という書籍を学習中です。
その第7章に畳み込みニューラルネットワークの解説がありim2colという関数が登場するのですが、その関数内で扱われる多次元配列(numpyのndarray型)同士の代入の動作が理解できません。
colという6次元の配列(np.zerosで生成)にimgという4次元配列(畳み込み層に対する入力データ)を代入する式に関して、
次元の小さい4次元配列がブロードキャストされて代入先と同じ6次元に拡張されるのは理解できるのですが、ブロードキャストのルールに則ると小さい方の次元の"先頭"に次元が追加されるらしく、そうなると代入元と代入先との次元の中身が異なってしまうのではと疑問に思っています。
具体的には、代入先の配列が(N, C, filter_h, filter_w, out_h, out_w)…①, 代入元が(N, C, h, w)なので代入元を拡張すると(N, C, N, C, h, w)…②となり、①と②の配列のそれぞれの次元の大きさが一致していない(特に3, 4次元目の部分)ように見えます。
これはそもそもブロードキャストの仕組みについての解釈が間違っているのでしょうか?
正しいとしても代入の仕組みがいまいち分かりません。
私自身多次元配列やCNNに詳しくないので前提などが間違っている可能性がありますが、何卒ご教示いただければ幸いです。
im2colのソースコード
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 + 2*pad - filter_h)//stride + 1 4 out_w = (W + 2*pad - filter_w)//stride + 1 5 6 img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant') 7 col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) # ここで代入先のゼロ配列を生成 8 9 for y in range(filter_h): 10 y_max = y + stride*out_h 11 for x in range(filter_w): 12 x_max = x + stride*out_w 13 col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride] 14 15 col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1) 16 return col
該当のソースコード
python
1col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/03 07:48
2020/05/03 08:05