はじめに
この記事ではPytorchでディープラーニングをやる前に、必要最低限のtorch.Tensorの操作をメモしたものです。したがってこの記事ではニューラルネットワークを書いていくための情報は直接的には得られません。
以下の記事ではchainerをやっていた人を想定して書いていましたが、今回は純粋にPytorchだけの操作を淡々と書いていきます。
Tensorの作成
乱数から作る
正規分布
各要素がそれぞれ標準正規分布(平均0、分散1)から発生します。
一様分布
各要素がそれぞれ一様分布から発生します。
区間がなので0が出ることはあっても1が出ることはありません。
permutation
一次元のLongTensorを作ります。
を引数に入れたら、
の数がランダムで並んだ数列が作られます。
ランダムなindexを作りたい時に利用。
指定して作る
要素が全て0
要素が全て1
ステップの大きさを指定した数列
torch.arrage(start, end, step)という形式で作ります。
区間はであり、endの数は含まれません。
ステップの数を指定した数列
torch.linspace(start, end, num_step)という形式で作ります。
区間はであり、endも含まれます。
Tensorの型
FloatTensorでサイズ指定
intを複数与えると、そのサイズのFloatTensorが作られます。値は適当に初期化されます。
下記ではtorch.Tensorを使っていますが、標準の型がFloatになっています。(torch.FloatTensorを使っても同じ)
FloatTensorにリストを渡す
リストを渡すと、それをそのままFloatTensorにします。
LongTensor
整数を扱う場合はlong型を使います(int型も別途ありますが、ニューラルネットのラベルとして受け付けてくれませんので、よほど使う機会はないです)。
メソッドで型を変換することもできます。
要素へのアクセス
Pythonで慣れ親しんだ方法で要素へアクセスができます。
Torchの絶対押さえておく関数・メソッド
numpy周り
numpyへの変換
torch.Tensor.numpy()メソッドでtorch.Tensorをnumpy.arrayに変換できます。
numpyからの変換
numpyのarrayをtorch.from_numpy()に渡すと、対応するTensorへ変換してくれます。ただし、変換されたTensorの型には注意しておきましょう。
特にnumpyのint32はIntTensorになりますが、一方でPytorchではLongTensorを使うのが標準なので注意が必要です。
GPU周り
cpuからgpuへ
.cuda()メソッドで簡単にgpu用の型に変更できます。
また、torch.cuda.Tensorで直接gpu用のTensorを作ることもできます。
gpuからcpuへ
.cpu()メソッドで簡単にcpu用の型に変更できます。
Tensorの形を知る
.size()メソッドでtorchのサイズを得ることができます。
メソッドなので引数を与えることができ、与えたaxisのサイズを直接得られます。まとめてサイズを得てから、indexにアクセスしても同じように指定したaxisのサイズを知ることができます。
Tensorの連結
torch.cat()
torch.Tensorをリスト入れてして渡すことで、それらを連結したTensorを返してくれます。
連結する軸はdimによって指定します。
torch.stack()
torch.Tensorをリストにして渡すことで、新しい軸に沿ってTensorを連結します。以下ではTensorを4つ渡したので、0番目の軸に沿ったサイズが4になっています。
dim=1と指定すれば、1番目の軸方向にTensorを積んでいくことになります。
Tensorのスライシング
torch.chunk
torch.chunk()によって、渡したTensorを指定した個数に切り分けてくれます。切り分ける方向はdimによって指定します。切り分ける個数と、戻り値の個数は等しくしておかなければいけません。
あるいは、戻り値を1つにすれば、タプルとして返ってきます。
切り分ける方向をdim=1とすれば、以下のように列を切ってくれます。
torch.split
こちらも切り分けてくれるメソッドですが、何個の要素ごとに切るかを指定します。以下では、3×8のテンソルを、dim=1方向に3つずつに分けるように指示しています。
dim=1方向には要素が8つしか無いため、最後だけ3×2のTensorが格納されます。こちらは切り分けられた結果、何個も戻り値を持つかは計算しなければわからないため(単に割り算するだけだけど)、基本的にはタプルで受け取ります。
軸の操作
torch.squeeze
torch.squeezeは要素数が1のみの軸を削除してくれます。
dimで削除したい軸を指定することも可能です。仮に指定した軸の要素数が1でない場合は何も実行されません。
torch.Tensor.view
Tensorのサイズを変えたい場合にはviewメソッドを使います(numpyでのreshapeに対応)。
-1を指定した軸は、要素数を自動で調整してくれます。
torch.Tensor.transpose
指定した2つの軸を交換します。
あくまで指定した軸を交換するものであって、以下のように、軸を好きなように並べ替えようと思った場合にはエラーを起こします。
最後に
torch.Tensorへの操作は基本的にVariableで包んだ後でも使えます。とりあえず最低限ココラヘンを知っていれば、あとはPythonの操作と組み合わせていろいろできると思います。