PyTorchで開発を行う上で、最初に理解する必要があるのは、PyTorch独自のデータ型であるTensor型です。本記事ではTensor型のよく使う使い方をまとめました。
PyTorchに用意されている特殊なデータ型で、正確にはtorch.Tensorというデータ型です。配列のような型で、多数のデータを入力でき、それらの演算が可能です。また、Tensor型はGPUを使用して演算が可能という特徴があり、近年の深層学習がGPUベースの演算を多く使用することを鑑みると、非常に深層学習と親和性の高いデータ型と言えます。
Tensorを使用するためには、PyTorchが使える環境を構築した上で「import torch」を宣言します。
import torch
まずは、Tensorの作成方法について紹介します。
0で初期化されたTensorを作成するのが「zeros」です。以下に紹介する文法で、任意の次元のTensorを生成することができます。また「dtype」でデータ型を指定することも可能です。データ型を宣言しない場合にはfloat型(torch.FloatTensor)になります。
import torch
testmatrix1 = torch.zeros([5], dtype=torch.float)
testmatrix2 = torch.zeros([3, 4], dtype=torch.float)
testmatrix3 = torch.zeros([2, 2, 2], dtype=torch.int32)
print(testmatrix1)
print(testmatrix2)
print(testmatrix3)
0の場合のzerosと同様にonesを利用することで、1で初期化したTensorを生成できます。
import torch
testmatrix = torch.ones([3, 2], dtype=torch.float)
print(testmatrix)
任意の値でTensorを作成する場合には、以下のように「torch.tensor()」の中に配列を記述すればOKです。
import torch
testmatrix = torch.tensor([[1,2,3],[4,5,6]])
print(testmatrix)
リストのように直感的にアクセスすることができます。
import torch
testmatrix = torch.tensor([[1,2,3],[4,5,6]])
print(testmatrix[0]) # tensor([1, 2, 3])
print(testmatrix[0][1]) # tensor(2)
print(testmatrix[0,1]) # tensor(2)
print(testmatrix[0,:]) # tensor([1, 2, 3])
print(testmatrix[:,1]) # tensor([2, 5])
testmatrix[0][1]とtestmatrix[0,1]は同じ結果となり、1行2列目の要素にアクセスできます。
print(testmatrix[0,:])とすると、1行目(インデックスは0からスタートするので0)の要素を全て取り出すことができます。コロン(:)は全ての要素を参照することを示します。
前述の方法だと、取得した結果もTensor型になってしまいます。Tensor型ではなく数値として取得したい場合にはitem()が使えます。
import torch
testmatrix = torch.tensor([[1,2,3],[4,5,6]])
print(testmatrix[0][1]) # tensor(2)
print(testmatrix[0][1].item()) # 2
四則演算などの基本的な演算を行うことができます。
「testmatrix1 + 1」のようにスカラーを足すと全ての要素に1が加算されます。
「testmatrix1 + testmatrix2」と「torch.add(testmatrix1,testmatrix2)」は同一で、各要素が加算されます。サイズが違うもの同士を加減算してしまうとエラーが出ます。
import torch
testmatrix1 = torch.tensor([[1,2],[3,4]])
testmatrix2 = torch.tensor([[4,3],[2,1]])
print(testmatrix1 + 1) # tensor([[2, 3],[4, 5]])
print(testmatrix1 + testmatrix2) # tensor([[5, 5],[5, 5]])
print(torch.add(testmatrix1,testmatrix2)) # tensor([[5, 5],[5, 5]])
print(testmatrix1 - testmatrix2) # tensor([[-3, -1],[1, 3]])
print(torch.sub(testmatrix1,testmatrix2)) # tensor([[-3, -1],[1, 3]])
掛け算は、加減算と同様にtestmatrix1 * 2のようにスカラーを掛けると全ての要素が2倍されます。
testmatrix1 * testmatrix2のように二つのTensorを「*」を使って乗算した場合、各要素の積が計算されます。torch.mul(testmatrix1,testmatrix2)も同様です。直感的な行列演算における乗算とは異なるので注意してください。
行列同士の掛け算をする場合には「testmatrix1 @ testmatrix2」のように@で表記します。torch.mm(testmatrix1,testmatrix2)も同様です。
import torch
testmatrix1 = torch.tensor([[1,0],[0,1]])
testmatrix2 = torch.tensor([[4,3],[2,1]])
print(testmatrix1 * 2) # tensor([[2, 0],[0, 2]])
print(testmatrix1 * testmatrix2) # tensor([[4, 0],[0, 1]])
print(torch.mul(testmatrix1,testmatrix2)) # tensor([[4, 0],[0, 1]])
print(testmatrix1 @ testmatrix2) # tensor([[4, 3],[2, 1]])
print(torch.mm(testmatrix1,testmatrix2)) # tensor([[4, 3],[2, 1]])
基本は乗算と同じように除算も計算できます。
import torch
testmatrix1 = torch.tensor([[4,4],[2,2]])
testmatrix2 = torch.tensor([[4,4],[2,2]])
print(testmatrix1 / 2) # tensor([[2, 2],[1, 2]])
print(testmatrix1 / testmatrix2) # tensor([[1, 1],[1, 1]])
print(torch.div(testmatrix1,testmatrix2)) # tensor([[1, 1],[1, 1]])
1次元のTensorを2つの内積をdot(v1,v2)で計算することができます。以下の例だと14=(1×1)+(2×2)+(3×3)と計算されます。
import torch
testmatrix1 = torch.tensor([1,2,3])
testmatrix2 = torch.tensor([1,2,3])
print(torch.dot(testmatrix1,testmatrix2)) # tensor(14)
平均や標準偏差を出力する機能も用意されています。.mean()で平均を、.std()で標準偏差を出力します。
以下の例ではtestmatrix.mean(dim=0)とした場合には、1と3の平均及び2と4の平均が計算されます([2, 3])。testmatrix.mean(dim=1)とした場合には、1と2の平均及び3と4の平均が計算されます([1.5, 3.5])。
import torch
testmatrix = torch.FloatTensor([[1,2],[3,4]])
print(testmatrix.mean()) # tensor(2.5)
print(testmatrix.mean(dim=0)) # tensor([2,3])
print(testmatrix.mean(dim=1)) # tensor([1.5,3.5])
print(testmatrix.std()) # tensor(1.291)
print(testmatrix.std(dim=0)) # tensor([1.414,1.414])
print(testmatrix.std(dim=1)) # tensor([0.707,0.707])