『pytorch & 深層学習プログラミング』 入門編
この関数が行っている行列の変換の仕方が分かりづらかった。
本書よりもっと単純な行列でその変換の仕方を見る。
import numpy as np
n1 = np.arange(1,13,1)
n2 = n1.reshape(2,3,2)
n2
この行列をnp.transpose
関数で変換してみると
n3 = np.transpose(n2, (0,2,1))
print(n3)
n3.shape
正直言うと、この変換がどのような法則で行われているのかわからなかった。公式ドキュメントにはこの変換で軸を入れ替えると書いてあるが、それは分かるのである。実際にこの変換がどのような法則によって行われているのか、自分なりにかみ砕いて説明する。
▪ 3段階で変換
変換は3段階に分けて考えると分かりやすい。
- 全体の構造を把握
- 一番内側の(最小の)格子 [] の中身が、元の行列のどの部分に相当するか
- 次に来る格子が、元の行列のどの部分に相当するか
である。具体的に上の例ではどういうことなのかは以下の通り
n3.shape
で構造を確認- 新しくできた行列の[1,3,5]がどのようにして生成されたかを考える。
- 新しくできた行列の[2,4,6]がどのように生成されたかを考える。
▪ 2つ目に生成される格子は何か
新たな行列では[2,4,6]が次に来ている。これはどういうことなのかというのが、3.で分かるようになっている。
先ほどと同じ要領で、とりあえず[2,4,6]か[7,9,11]を取り出せば良いという事は何となくわかるはずである。では、どちらが正解なのか。
▪ 2つ目の格子の取り出し方
次に来る格子を判断するためにはnp.transpose(a,b,c)
のbに注目すると良い。これが次の格子を選ぶ際の軸となる。今回はnp.transpose(0,2,1)
なので、2に注目する。軸2について大切なのは(元の行列において)1,2や3,4方向で数えるという意味だけである。このように数え方の方向性が分かれば、元の行列から[1,3,5]の次に取ってくる格子の中身は、1,2方向(横方向)に進んで[2,4,6]にすると理解することが出来るはずである。決して[7,9,11]ではないという事だ。
n4 = np.arange(0,24,1)
n5 = n4.reshape(2,3,4)
print(f'n5のshapeは {n5.shape}で、中身は以下の通り')
print(n5)
n6 = np.transpose(n5,(1,2,0))
print(f'n6のshapeは{n6.shape}で、中身は以下の通り')
print(n6)
また説明するのは大変なので例を載せて終了にするが、分かっただろうか。先ほどと同じように、出来る最小格子は[0,12]や[1,13]や[4,16]などだと分かれば、あとは何とかなるはずである。