PyTorchが人気があるとみて、始めようとしました。
論文の実装に使われるくらいだから一筋縄では行かなさそうだね。
TensorFlow+Kerasでニューラルネットワークのチュートリアルをやってみて、すごく体系化されていて使いやすくなってるなと感じていました。
そこで、PyTorchも最近使われ始めていて、同じように簡単にネットワークが構築できるんだとうな、と勝手に感じていました。そこで、PyTorchでも同じようにチュートリアルのようなものがないかと探していましたが、意外と細かな設定ができるようで、ニューラルネットワークの仕組みなどもある程度知っていないと構築できないような雰囲気がありました。
PyTorchには、60分で理解できる、チュートリアルがありますので、順番にやっていこうと思いました。
初回は、テンソルを扱うところからのチュートリアルでした。
テンソルってなんだろう・・・
テンソルについて調べていたら、チュートリアルに入っていませんでした・・・
テンソルとは?
線形代数という数学の分野で勉強する概念です。テンソルは、数字の並びをより抽象的に表現しているもので、よく使われるテンソルには、次のようなものがあります。
スカラー
普通の数字です。「0階のテンソル」と言われます。
ベクトル
スカラーが並んだものです。「1階のテンソル」と言われます。
Pythonプログラムでは、numpyで1次元配列や、1列だけの2次元配列で表現されたりしています。numpyでベクトル表現をしてみました。
import numpy as np
vec = np.array([0,1,2,3])
#1次元配列
print(vec)
#reshapeで縦方向に
print("ベクトル")
vec = vec.reshape(-1,1)
print(vec)
一般的に、ベクトルは縦に表現されるようです。
「vec.reshape(-1,1)」のように、ベクトルの方向を縦、横に変更することを「転置」というそうです。
[0 1 2 3]
ベクトル
[[0]
[1]
[2]
[3]]
行列
行列は、「2階のテンソル」で、視覚的には表と同じように見ることができます。
機械学習のデータでは、行列形式で列に「特徴量」、行には固有のデータという形でデータが提供されることが多いです。
例えば、scikit-learnのアヤメのデータのような感じです。
from sklearn.datasets import load_iris
import pandas as pd
panda_box = load_iris()
X = pd.DataFrame(panda_box.data, columns=panda_box.feature_names)
print(X)
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
.. ... ... ... ...
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
[150 rows x 4 columns]
3階のテンソル
3階のテンソルは、行列を複数並べたものになります。これは、画像データなどによくみられる形になります。
FashionMNISTという衣料品の画像データが3階のテンソルのデータ形式になっています。一枚の画像だけを取り出すと、28×28の行列データになるのですが、この行列が60000枚並んでいます。
[60000,28,28]という形状のデータになっています。
これ以上に4階、5階とテンソルは次元数を増やしていくことができるようです。
4階以上は実際には想像できていないので、このくらい例があればなんとなくテンソルを扱えそうな気がしてきました。
PyTorchの特徴
早速、PyTorchのチュートリアルをやりたかったのですが、最初にテンソルというものを扱うチュートリアルだったので、テンソルについて詳しく調べました。
PyTorchでは、数学的な概念のテンソルの計算をGPUで実行できるなど、計算の高速化にも配慮されているそうです。実際には、numpyでもテンソルの計算はできるのですが、GPUなどで高速化している点が大きいみたいです。さらに、使い勝手もNumPyに似せているので、NumPyの高速版のようなイメージのライブラリらしいです。
次回こそは、チュートリアルやります・・・
サンプルプログラムをGitHubに置くようにしました。