【AIプログラミング】PyTorchのチュートリアルpart1-1、tensor型の計算など

AIプログラミング

PyTorchの最初のチュートリアルをやりました。なんだかまだニューラルネットワークっぽい感じではなかったです。

基礎的な部分のチュートリアルなんだね。

前回に引き続き、PyTorchのチュートリアルを行なっていきたいと思います。(今回からやっと入るのですが・・・)PyTorchは、scikit-learnのように、手順さえ知っていればOKみたいな雰囲気ではなく、ニューラルネットワークを詳細にカスタマイズもできそうなくらい基礎というものが必要そうですので、この際に細かく勉強していきたいなと感じました。

前回の記事のテンソルについてもご参照ください。

今回は、チュートリアルだけではわかりにくい点もあったので、独自の観点からの追記も多々いれておりますm__m

こんな人の役にたつかも

・機械学習プログラミングを勉強している人

・PyTorchに入門したい人

・PyTorchのチュートリアルをやっている人

スポンサーリンク

PyTorchチュートリアル(What is PyTorch)

今回参考にしたチュートリアルはこちらです。

PyTorchのimport

from __future__ import print_function
import torch

python3系を利用していると、1行目は必要ないはずです。

テンソルの作成

空のtensorを作成します。5行3列の2階のテンソル(行列)を作成しています。

x = torch.empty(5, 3)
print(x)
tensor([[3.9094e-36, 0.0000e+00, 5.0447e-44],
        [0.0000e+00,        nan, 0.0000e+00],
        [1.3788e-14, 1.8369e+28, 1.9433e-19],
        [3.3738e-12, 7.4086e+28, 6.9397e+22],
        [1.7260e+25, 2.2856e+20, 5.0948e-14]])

初期化はされていないみたいで、色々な値が入っています。

randメソッドでランダムな値で初期化したテンソルを作成します。

x = torch.rand(5, 3)
print(x)
tensor([[0.3082, 0.5270, 0.3674],
        [0.4574, 0.6412, 0.5187],
        [0.0847, 0.1587, 0.5561],
        [0.0908, 0.5013, 0.0632],
        [0.5202, 0.0063, 0.1726]])

zerosはゼロで初期化したテンソルを作成します。dtypeで数値の型を指定します。

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])

2階のテンソルも作成してみます。

x = torch.tensor([[5.5, 3],
                  [6.5, 4]])
print(x)
tensor([[5.5000, 3.0000],
        [6.5000, 4.0000]])

すでに作成したテンソルを再度定義し直す事もできます。 その時、指定していないパラメータ(テンソルのサイズとデータの型)は以前のものを引き継ぎます。

new_onesは1で埋めるメソッド。 xを5×3の行列と定義して、1で埋めます。そして、それぞれのデータはdouble型(float64型)とx自身のメソッドで定義し直すことができます。

x = x.new_ones(5, 3, dtype=torch.double) 
print(x)

テンソルをランダムな値で埋めて、データの型をfloat型に変更します。

テンソルのサイズは指定されていないので、xの5×3がそのまま引き継がれます。

x = torch.randn_like(x, dtype=torch.float)
print(x) 
tensor([[ 0.2749, -0.7095, -1.1419],
        [ 0.7068,  0.0535, -1.1837],
        [ 0.4491, -0.9849, -1.7568],
        [ 0.3122,  0.1760,  0.8036],
        [ 1.1279,  1.2446, -1.9494]])

テンソルのサイズ

テンソルのサイズを確認してみます。

print(x.size())
torch.Size([5, 3])

ちょうどnumpyのshapeのような存在ですね。

正直、テンソルの再定義とかはまだ利用場面が思い浮かばないな、使う時になって再度復習しようかな。

テンソルの計算

テンソルの計算、行列の計算ってなんだか苦手なんだよね。

計算自体は自動だから大丈夫。

スカラーとベクトル

正直、ここからはチュートリアルではなく、個人的な復習です^^;

x = 1
y = torch.tensor([4,5])

print(x)
print(y)
1
tensor([4, 5])
それぞれの要素にスカラーが足し合わされます。
print(x + y)
tensor([5, 6])

足し算は、次のように、addメソッドでも可能です。

print(torch.add(x, y))
tensor([5, 6])

resultという定義されたテンソルに足し算の結果を代入。

result = torch.empty(1,2)
torch.add(x, y, out=result)
print(result)

引き算も同様に行うことができます。

print(x - y)
tensor([-3, -4])

メソッドは覚えられないから、しばらくは「+」「ー」を使おうかな・・・

ベクトル+ベクトル

ベクトル同士の足し算、引き算は、同じサイズ同士である必要があります。

x2 = torch.tensor([1,2,3])
y2 = torch.tensor([4,5,6])

print(x2)
print(y2)
tensor([1, 2, 3])
tensor([4, 5, 6])

足してみます。

print(x2 + y2)
tensor([5, 7, 9])

次は、引いてみます。

print(x2 - y2)
tensor([-3, -3, -3])

サイズが違う場合、次のようにエラーが出ます。

x2 = torch.tensor([1,2])
y2 = torch.tensor([4,5,6])

print(x2)
print(y2)

テンソルのサイズがあっていません。

tensor([1, 2])
tensor([4, 5, 6])
print(x2 + y2)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-46-cef4b7956b00> in <module>()
----> 1 print(x2 + y2)

RuntimeError: The size of tensor a (2) must match the size of tensor b (3) at non-singleton dimension 0

行列の足し算引き算

まずは、スカラーと行列です。

x3 = 1
y3 = torch.tensor([[1,2,3],
                    [4,5,6]])

print(x3)
print(y3)
1
tensor([[1, 2, 3],
        [4, 5, 6]])
print(x3 + y3)

全ての要素に1が加算されました。

tensor([[2, 3, 4],
        [5, 6, 7]])

次に、ベクトルと行列です。行、または列が同じである必要があります。

まずは、サイズが(1×3)と(2×3)の加算です。

x4 = torch.tensor([1,2,3])
y4 = torch.tensor([[1,2,3],
                    [4,5,6]])

print(x4 + y4)

[(1+2), (2+2), (3+3)]
[(1+4), (2+5), (3+6)]

が行われます。

tensor([[2, 4, 6],
        [5, 7, 9]])

次に、サイズが(2×1)と(2×3)の加算です。

x5 = torch.tensor([[1],
                    [2]])
y5 = torch.tensor([[1,2,3],
                    [4,5,6]])

print(x5 + y5)
tensor([[2, 3, 4],
        [6, 7, 8]])

[(1+1), (1+2), (1+3)]
[(1+4), (2+5), (3+6)]

が行われました。

add_メソッドで、上書きして足し合わせることもできるようです。

y6.add_(x6)
print(y6)
tensor([[2, 4, 6],
        [6, 4, 2]])

y6に、x6とy6を足した結果が代入されました。

print(y6[:,0])

一列目の「2」と「6」が取り出されました。numpyと同じように「:」で全てを意味していて、行、列の順番に指定しています。numpyのスライス表記と同じ扱いができて便利です。

tensor([2, 6])

色々調べていたら、60分では終わりそうになかったです^^;

「What is PyTorch」のチュートリアルは途中くらいまで行きましたので、次回も引き続きチュートリアルの続きを行なっていきたいと思います。

タイトルとURLをコピーしました