ソースコードの実行
目次
行列の中身を見てみる。
import torch
import numpy as np
A=np.ones((2,3))
B=torch.ones((2,3),requires_grad=True)
print(A)
print(B)
> [[1. 1. 1.]
> [1. 1. 1.]]
>tensor([[1., 1., 1.],
> [1., 1., 1.]], requires_grad=True)
行列以外の情報も入っている。(下線部)
計算結果を同様に出力してみる。
x1=torch.ones(3,3,requires_grad=True)
x2=torch.eye(3,3,requires_grad=True)
y=x1+x2
print(y)
tensor([[2., 1., 1.],
[1., 2., 1.],
[1., 1., 2.]], grad_fn=<AddBackward0>)
偏微分した関数が格納されていることがわかる。
計算結果から計算前の数値にもアクセスできる。
D.grad_fn.next_functions
>((<AccumulateGrad at 0x7fb8e783ba90>, 0),
> (<AccumulateGrad at 0x7fb8df891050>, 0))
D.grad_fn.next_functions[0][0].variable
>tensor([[1., 1., 1.],
> [1., 1., 1.],
> [1., 1., 1.]], requires_grad=True)
D.grad_fn.next_functions[1][0].variable
>tensor([[1., 0., 0.],
> [0., 1., 0.],
> [0., 0., 1.]], requires_grad=True)
つまり、演算するたびに、計算の入力と出力が接続されていることがわかる。
graph TD
x1-->plus((+))
x2-->plus((+))
plus((+))-->y
重要:PyTorchは行列演算と並行して、計算グラフの構築を行なっている
💡 Tip: 計算グラフはいつ構築すべきか?
PyTorchは関数の実行時に構築するため、モデル学習時は各forward実行時に毎回グラフの構築が走る。
一方で、モデル学習直前に一度グラフを構築して、train中はそれを使い回せば、処理が早くなると考えられる。前者の考え方をdefine-by-run (グラフ構築と同時に実行) 後者の考え方をdefine-and-run(グラフ構築後実行)といい、ver1.0のことのtensorflowがそれに対応する。ただ、define-and-runはPythonらしい書き方ではなくなるため、少し書くのが難しいなどあった。