PyTorchのTensorの生成と要素アクセス
PyTorchのテンソルtorch.Tensor
は単一データ型の要素のみを含む多次元テンソルである。
本記事におけるPyTorchのバージョンは1.10.0
である。
import numpy as np import torch print(torch.__version__) # 1.10.0
torch.Tensor
の生成
torch.Tensor
はtorch.tensor
を使ってlist
から作成することができる。
t1 = torch.tensor([[1., -1.], [1., -1.]]) print(t1) # tensor([[ 1., -1.], # [ 1., -1.]])
numpy.ndarray
から作成することもできる。
t2 = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]])) print(t2) # tensor([[1, 2, 3], # [4, 5, 6]])
torch.Tensor
のデータ型はdtype
属性で取得できる。
print(t1.dtype) # torch.float32 print(t2.dtype) # torch.int64
dtype
にtorch.dtype
型の値を渡すことで、指定した型のtorch.Tensor
を生成することができる。
t3 = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]), dtype=torch.int32) print(t3) # tensor([[1, 2, 3], # [4, 5, 6]], dtype=torch.int32)
device
にtorch.device
型の値を渡すことで、指定したデバイス上のメモリにtorch.Tensor
を配置することができる。
CPUメモリに配置する場合:
device = torch.device('cpu') t4 = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]), device=device) print(t4.device) # cpu
(1個目の)GPUメモリに配置する場合:
device = torch.device('cuda:0') t5 = torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]), device=device) print(t5.device) # cuda:0
なお、GPUが有効出ない場合は以下のエラーが出る。
AssertionError: Torch not compiled with CUDA enabled
全要素が0
または1
のtorch.Tensor
はtorch.zeros
およびtorch.ones
を使って生成することができる。その際、第一引数にtorch.Tensor
のサイズを指定する。
t = torch.zeros([2, 4]) print(t) # tensor([[0., 0., 0., 0.], # [0., 0., 0., 0.]]) t = torch.ones([2, 4]) print(t) # tensor([[1., 1., 1., 1.], # [1., 1., 1., 1.]])
torch.Tensor
の要素へのアクセス
torch.Tensor
の要素にはlist
と同様のインデックス操作とスライス操作を使ってアクセスできる。ただし、要素はtorch.Tensor
型で返る。
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) print(x[1][2]) # tensor(6) print(x[1][1:]) # tensor([5, 6])
代入も可能。
x[0][1] = 8 print(x) # tensor([[1, 8, 3], # [4, 5, 6]])
要素が1つだけのtorch.Tensor
をPythonの数値型に変換するにはitem()
メソッドを使う。
print(x[1][2].item()) # 6
なお、要素が1つだけであれば多次元テンソルであっても数値型に変換できる。
x = torch.tensor([[1]]) print(x.item()) # 1
一方、複数の要素を含む場合は次のようなエラーが出る。
x = torch.tensor([1,1]) # ValueError: only one element tensors can be converted to Python scalars
torch.Tensor
の型変換
torch.Tensor
のdtype
を変換するにはto()
メソッドを使う。
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) x.to(torch.float64) print(x.dtype) # torch.int64
to()
メソッドでdevice
の移動も可能。
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) device = torch.device('cuda:0') x.to(device) print(x.device) # cuda:0
dtype
とdevice
を同時に変換することも可能。
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) device = torch.device('cuda:0') x.to(device, dtype=torch.float64)