どすえのブログ

ソフトウェア開発ブログ

PyTorchのTensorの生成と要素アクセス

PyTorchのテンソルtorch.Tensorは単一データ型の要素のみを含む多次元テンソルである。

本記事におけるPyTorchのバージョンは1.10.0である。

import numpy as np
import torch

print(torch.__version__)
# 1.10.0

torch.Tensorの生成

torch.Tensortorch.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

dtypetorch.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)

devicetorch.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または1torch.Tensortorch.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.TensorPythonの数値型に変換するには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.Tensordtypeを変換するには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

dtypedeviceを同時に変換することも可能。

x = torch.tensor([[1, 2, 3], [4, 5, 6]])
device = torch.device('cuda:0')
x.to(device, dtype=torch.float64)