p_2_6

回答日時: 2019/02/14
Q: im2colのソースコードで、理解できない部分があるので、教えてください。

ソースを解読すると、下記のようになっています。
()カッコのなかは、サイズを書いています

<Reshape前>
col_0 = N, C, fil_H(3), fil_W(3), out_H(2), out_W(2)
col <= col.transpose( 0, 4, 5, 1, 2, 3)
col _1 = N, out_H(2), out_W(2), C, fil_H(3), fil_W(3)
col <= col.transpose( N*out_h*out_w, -1 )
col _2 = ( N * out_h * out_w ) , ( C * fil_H(3) * fil_W(3) )

ソースの可読性を上げるなら、<Reshape前>から3*3の領域を抜き取り、
の段階に一気に行けそうですが、
なぜをするのでしょうか?
から  への移行理由が分かれが理解できそうですが、うまく理解できていません。
添付の図も合わせて参照してください。

A: numpyの行列の演算をまとめてやろうとした時に、3*3の領域がn個に対して3*3のfilterが1つで積を求めることになります。これを3*3の部分を明示的に区別するために1次元に直しています。
実際は下記のような演算が可能です。
“`
import numpy as npa = np.array([i for i in range(18)]).reshape(2, 3, 3)
b = np.array([2 for i in range(9)]).reshape(1, 3, 3)
a*b
“`
backword時も、加算するだけなので、これベースでかけます。