菅間修正済み 2025/05/15
【原題】What is PyTorch?
【原著】Soumith Chintala
【元URL】https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html
【翻訳】電通国際情報サービスISID AIトランスフォーメーションセンター 徳原 光
【日付】2020年10月13日
【チュトーリアル概要】
本チュートリアルでは、PyTorchでの演算処理に用いるTorch Tensorについて、その操作方法を解説します。
PyTorchはPythonをベースとした科学計算ライブラリです。
PyTorchは以下に示す2つの機能を使用したいユーザーを対象としています。
from __future__ import print_function
import torch
【注意】
初期化されていない行列が宣言・作成されても、実際に使用されるまで明確な値は保有していません。
宣言時にメモリ上の割り当てられた適当な値が初期値として入っています。
初期化されていない、3×5行列を生成してみましょう:
x = torch.empty(5, 3)
print(x)
tensor([[4.2866e-36, 0.0000e+00, 3.3631e-44],
[0.0000e+00, nan, 6.4460e-44],
[1.1578e+27, 1.1362e+30, 7.1547e+22],
[4.5828e+30, 1.2121e+04, 7.1846e+22],
[9.2198e-39, 7.0374e+22, 1.4359e-36]])
次に、乱数によって初期化された3x5行列を生成してみましょう:
x = torch.rand(5, 3)
print(x)
tensor([[0.8021, 0.2195, 0.3325],
[0.1211, 0.7894, 0.2683],
[0.9716, 0.6030, 0.3051],
[0.1340, 0.8415, 0.5174],
[0.0918, 0.8619, 0.8378]])
long型の数値0で初期化された行列を生成する場合は次の通りです。
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
直接、数値を指定して行列を生成することもできます。
x = torch.tensor([5.5, 3])
print(x)
tensor([5.5000, 3.0000])
その他に、すでにあるtensorをもとに、新しくtensorを生成することもできます。
本メソッドで生成したテンソルは、テンソルの特性(例えばデータ型:dtypeなど)を、もとのtensorから引き継ぎます(ユーザーが値や特性を直接上書きしない限り)。
x = x.new_ones(5, 3, dtype=torch.double) # new_* methods take in sizes
print(x)
x = torch.randn_like(x, dtype=torch.float) # override dtype!
print(x) # result has the same size
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-0.5457, -0.4552, -2.0920],
[-0.6641, 0.9266, -0.6764],
[-0.7897, -1.8249, -0.0382],
[ 0.3420, -0.8151, 0.2744],
[ 1.0132, -1.1335, -0.6098]])
テンソルサイズ(size)≒テンソルの形、を求めてみます。
print(x.size())
torch.Size([5, 3])
【メモ】
torch.Sizeはタプルとなっているため、Pythonの通常のタプルと同様の操作が可能です。
テンソルの操作(変形・変換等)
PyTorchにはテンソルに対する操作(変形・変換等)が多く用意されています。
ここで、tensorを操作(変形・変換等)する追加の例を紹介します。
補足: 用例1
y = torch.rand(5, 3)
print(x + y)
tensor([[ 0.2193, -0.1546, -2.0828],
[ 0.1319, 1.4161, -0.4847],
[-0.5198, -0.9983, 0.3438],
[ 0.4004, -0.6043, 0.5200],
[ 1.4458, -1.1206, 0.2682]])
補足: 用例2
print(torch.add(x, y))
tensor([[ 0.2193, -0.1546, -2.0828],
[ 0.1319, 1.4161, -0.4847],
[-0.5198, -0.9983, 0.3438],
[ 0.4004, -0.6043, 0.5200],
[ 1.4458, -1.1206, 0.2682]])
補足: 出力先を引数で指定
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
tensor([[ 0.2193, -0.1546, -2.0828],
[ 0.1319, 1.4161, -0.4847],
[-0.5198, -0.9983, 0.3438],
[ 0.4004, -0.6043, 0.5200],
[ 1.4458, -1.1206, 0.2682]])
補足:テンソルそのものの変更(in-place:インプレース処理)
# adds x to y
y.add_(x)
print(y)
tensor([[-0.8722, -1.0651, -6.2668],
[-1.1964, 3.2693, -1.8376],
[-2.0993, -4.6481, 0.2674],
[ 1.0844, -2.2345, 1.0687],
[ 3.4721, -3.3877, -0.9513]])
【メモ】
メソッド名の後に_をつけることで、変数の内容を出力結果で置き換えることができます。
例えば、y.add_(x)の場合xとyの値を加算した結果はyに上書きして、格納されます。
NumPyと同様、インデクシングやスライシングを行うことも可能です。
print(x[:, 1])
tensor([-0.4552, 0.9266, -1.8249, -0.8151, -1.1335])
リサイズ: tensorの形を変えたい場合は torch.viewを使用してください:
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # -1を指定すると他に設定した次元の値から自動で計算
print(x.size(), y.size(), z.size())
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
.item()を使用すると、要素を1つしか持たないtensorから、中身の数値だけを取り出すことができます。
x = torch.randn(1)
print(x)
print(x.item())
tensor([0.1095]) 0.10949039459228516
PyTorchではTorch TensorからNumPy Arrayへの変換やその逆を簡単に行うことできます。
(Torch TensorがCPU上にある場合)Torch TensorとNumPy Arrayはメモリ上の同じ領域に配置され、変換することができます。
a = torch.ones(5)
print(a)
tensor([1., 1., 1., 1., 1.])
b = a.numpy()
print(b)
[1. 1. 1. 1. 1.]
メモリを共有しているため、Torch Tensorの値がNumPy Arrayにも反映されることが分かります。
a.add_(1)
print(a)
print(b)
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
NumPy ArrayからTorch 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)
CharTensorを除き、CPU上のすべてのTensorはNumPyへの変換、およびその逆(NumpyからTensor)に対応しています。
tensorは .to メソッドを使用することであらゆるデバイス上のメモリへと移動させることができます。
# let us run this cell only if CUDA is available
# We will use ``torch.device`` objects to move tensors in and out of GPU
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!
# 日本語訳注:
# tensor([1.8299], device='cuda:0')
# tensor([1.8299], dtype=torch.float64)
# のような出力(値は変わります)がセルのあとに表示されれば、GPUでのCUDAでのテンソル計算が成功しています。
# もし、何も表示されなければ、Google ColaroboratoryがGPU使用モードになっていないので、
# 下のセルの説明を読んで、GPUを使用可能な状態にしてみてください。
tensor([1.1095], device='cuda:0') tensor([1.1095], dtype=torch.float64)
(日本語訳注)
Google ColaboratoryでCUDA、すなわちGPUを使用可能にするには、上部メニューの「ランタイム」を選択し、「ランタイムのタイプを変更」で、「ハードウェア アクセラレータ」にGPUを選択します。
上記で、現在のランタイムの環境を確認し、GPUでなければ、GPUに設定して、上記セルを実行してみてください。