PyTorchのチュートリアル、数学的なこととかもっと知らないとちょっと厳しそうな感じがします・・・
ニューラルネットワークの構築まではまだかかりそうだね。
PyTorchのチュートリアルをやっています、チュートリアルの「what is PyTorch」が半分終わって、その続きを行っていきます。
前回の記事はこちらもご参考ください。
今回も、独断と偏見で寄り道するかもしれませんが、よろしくお願いいたしますm__m
テンソルの操作
tensorはnumpyのスライスのように、特定の要素のみ取り出すことができます。
先ほどのy6から、一列目だけを取り出すには、次のように表記することで一列目のみの要素を取り出すことができます。
print(y6[:,0])
一列目の「2」と「6」が取り出されました。numpyと同じように「:」で全てを意味していて、行、列の順番に指定しています。numpyのスライス表記と同じ扱いができて便利です。
tensor([2, 6])
テンソルのサイズの変更
1行目のrandm(4,4)で、(4×4)の行列を作成しています。
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
viewは、要素数を変化させます。4×4サイズの2階のテンソル、行列をview(16)とすることで、1階のテンソル、ベクトルになります。
また、zは、4×4の行列から2×8の行列へサイズ変更している様子になります。
zに指定した-1は、他の要素から推定されるという意味です。例えば、列が8になると、もともとxには16個のデータ(4×4)しかなく、必然的に2行になるので、-1は自動的に2を入れることになります。
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
次のように、要素数に矛盾が生じる場合、エラーになります。
y = x.view(15)
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-66-cb34f672ef4f> in <module>()
----> 1 y = x.view(15)
RuntimeError: shape '[15]' is invalid for input of size 16
1要素のみのテンソルをPythonの値に変換
x = torch.randn(1)
print(x)
print(x.item())
tensor([-0.9216])
-0.9215939044952393
ほぅ・・・
使い所が不明だったので、少し調べたところ、平均を取り出す時に使いそうです。 ちなみに、meanを利用することで、テンソルの平均値が取り出せるそうです。
x = torch.tensor([5.0, 4.0, 3.0])
average = x.mean()
print(average)
print(average.item())
tensor(4.)
4.0
他にも、たくさんの構文があるので、こちらで確認してね、というチュートリアルになっています・・・
Tensor、Numpyの相互変換
tensor→numpy
まずは、tensor型をnumpyへの変換です。
a = torch.ones(5)
print(a)
tensor([1., 1., 1., 1., 1.])
bにaのtensorをnumpyに変換して代入します。
b = a.numpy()
print(b)
[1. 1. 1. 1. 1.]
tensorの「a」とnumpyの「b」が連動しています。
a.add_(1)
print(a)
print(b)
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
今の所、この連動が便利なのかどうかはわかりませんが、今後役に立つこともありそうです。
numpy→tensor
tensorからの変換よりは少し文字数も多くてめんどくさくなっています。
ただ、同じようにこちらもnumpyとtensorを連動させることができるようです。
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
GPUでの実行指示
CUDAというNVIDIAのGPU並列処理する仕組みを利用して、CUDAで処理できるようなメソッドが「.to」とのことです。
CUDA環境ではないので、実行できませんでしたが、次のチュートリアルのプログラムのように、簡単にGPUでテンソルを処理するのか、CPUで処理するのかが記載できます。
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA device object
y = torch.ones_like(x, device=device) # directly create a tensor on GPU
x = x.to(device) # or just use strings ``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!
やっと初めのチュートリアルが終わりました。結構前知識が必要なチュートリアルです。
githubにプログラムを配置しました。