概要
機械学習系のコードを書いている際,突然次元やサイズの概念があやふやになってきたり,なんでここでsqueeze(unsqueeze)してるんだ?ってなって詰むことありませんか?
コードとにらめっこして分からなくなった時に深呼吸しながら眺める用の日記です.
ほとんどの人にはそんなの当たり前だろって感じだと思いますが,自分は文字だけ眺めてるとふと分からなくなるので...
あと配列とテンソルをそんなに区別せずに書いてますが許してください.
言ってること
(少なくともpytorchやnumpyでは)次元数は軸の数で,サイズは各軸の要素数だよ.
ベクトルの次元数と配列の次元数をごっちゃにして考え出すとわからなくなるよ.
サイズ1の次元とか考えたくねぇよ!
本文
多次元の配列を扱うときやNN系のコードを書いている際に,配列(やテンソル)の形がわからなくなることありませんか?
自分は往々にしてあります.そんな時,役に立つのが次元やサイズを確認する機能です.
例えば
tensor = torch.ones(2, 2, 2)
tensor.size() # ([2,2,2])
tensor.dim() # 3
はい,解決です.
ではありません.いや,ほとんどの場合はこれで解決です.
でも数式とにらめっこしながらプログラミングしていると,たまにモヤモヤが残ることがあります.
例えば,
ふむふむ,$C=Ax$で$A$が2*2行列で$x$が2次元ベクトルか.
>>> import torch
>>> x = torch.tensor([2, 3])
>>> A = torch.tensor([[1, 0],[0, 1]])
>>> torch.mv(A, x)
tensor([2, 3])
よし!一応次元数も確認しとくか.
>>> x.dim()
1
あれ?$x$って2次元じゃなかったっけ?→パニックでプログラム全消去
まあこんな簡単な式でこうなる人はいないと思いますが,配列というものを扱う以上次元数やサイズ数にまつわるエラーからは逃げられないと思います.
前置きが長くなりましたが,言いたいのは配列やテンソルはベクトル,行列を表せるだけでそのものではないよってことです.
ベクトルの感覚で言う次元数はpytorchのtensorで言うと各軸のsizeに当たります.
また,配列やテンソルにはサイズ1の次元も存在します.これは初心者が配列操作でエラーを出す時の典型的な躓きポイントな気がします.
配列を扱う際には,以下の画像のように同じものでも自分が扱っているものがどの形式で表されているのか,落ち着いて考えましょう.