では、さっそくPyTorchを動かしてみようと思います。
ライブラリのインポート
from __future__ import print_function import torch
さっそく「__future__」とはなんぞや? という疑問が生じました。
(スーパー初心者ですので)
”__future__”というのは、python2系を動かす際、互換性のないpython3系も動かせるようにするためのものらしいです(参考)。
ということは、python3を使っている私の環境だと1行目は不要ということかもしれませんね。入れたらダメということはないと思いますので、チュートリアル通りに動かしてみることにします。
テンソルの作成
■ 初期化なし
初期化されていない\(5*3\)のマトリックスを作成します。
x = torch.empty(5, 3) print(x)
# -----出力----- tensor([[-3.1582e+35, 4.5570e-41, -3.1582e+35], [ 4.5570e-41, 3.8235e-14, 7.2296e+31], [ 5.6015e-02, 4.4721e+21, 1.8042e+28], [ 8.1477e-33, 1.3563e-19, 1.6114e-19], [ 2.8175e+20, 4.5103e+16, 1.4585e-19]])
この結果を見る限り、使用するデータ型で取りうる値全体の範囲でランダムな値を格納するみたいです。
同じ値がちょいちょい出てきているのがなぜか気になりますが、とりあえず、箱だけ作るとイメージしておくことにします。
■ ランダムに初期化
ランダムに初期化された \(5*3\) のマトリクスを作成します。
x = torch.rand(5, 3) print(x)
# -----出力----- tensor([[0.5287, 0.4393, 0.9229], [0.3146, 0.8343, 0.1759], [0.0451, 0.3627, 0.3233], [0.2978, 0.5777, 0.9817], [0.3242, 0.8804, 0.8938]])
ほほう、確かにランダムな値が入っていますね。ランダムで初期化をする際には、マイナスの値は入らないんですね。
■ ALLゼロ
次に、全部ゼロが入ったlong型の5×3のマトリクスです。
ここでは”dtype”でデータ型も一緒に指定しています。
numpyの場合も、np.zeros()で配列を作れるので、感覚的にわかりやすいですね。
x = torch.zeros(5, 3, dtype=torch.long) print(x)
5×3の配列が作成されました。
# -----出力----- tensor([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])
dtypeをfloatに指定すると「0」->「0.」に変わります。
小数点以下がありますよ、ということですね。これはPythonでも同じなので、特に気にすることはありませんが。
# -----出力----- tensor([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
★ちなみにlong型は4バイトの符号型の整数を表現するためのもので、 \(-2^{31}~+2^{31}-1\) まで表せるものだそうです。データ型もいまいちよくわかっていないので、よく使うものだけでも勉強したいと思います。
■ 値の直接指定
値を直接指定してテンソルを作ることもできます。
x = torch.tensor([5.5, 3]) print(x)
小数と整数が混在していますが、精度の高い方に合わせてデータ型が決まります。
# -----出力----- tensor([5.5000, 3.0000])
多分ですが、この配列はfloat型です。
試しに、double型を指定してテンソルを作ってみたところ、出力が以下のようになりました。
—–出力—–
tensor([5.5000, 3.0000], dtype=torch.float64)
小数値はfloat型が一般的(デフォルト?)なので、あえて出力に型を書いていないのでしょう。
■ 既存テンソルベース
あとは、既存のテンソルを使って新しいテンソルを作ることもできます。
データ型とかサイズとかを合わせないとダメなケースがたくさんあると思いますので、これは覚えておいた方が良さそうです。
既存のテンソルxのサイズ・型変換、1埋めを行ったテンソルを作ります。
x = x.new_ones(5, 3, dtype=torch.double) print(x)
サイズ1×2のテンソルxが5×3に変わり、型もdoubleになっています。
# -----出力----- tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64)
全部変わってるじゃん!!って思いました。
型以外にも、後々出てくるdeviceの設定とか、requires_gradの設定とかを改めてやらなくていい分、全く新しいのを作るよりも楽になるのでしょうかね。
上で作ったテンソルと同じサイズで、ランダム値が入ったテンソルを作ります。データタイプも合わせて変えています。
x = torch.randn_like(x, dtype=torch.float) print(x)
こんな感じです。
dtype=torch.float64の文字が消えていますので、double->floatになったことがわかります。
# -----出力----- tensor([[ 0.9637, -0.9373, -0.2481], [-0.6289, -0.1012, -0.3534], [ 0.5662, 0.7798, 1.5038], [ 1.0916, -0.3201, -1.7198], [ 1.3004, 1.4057, -0.6745]])
■ サイズ確認
テンソルのサイズを調べるためには、「.size()」を使います。
print(x.size())
# -----出力----- torch.Size([5, 3])
これはPythonと同じですね。出力はタプルなので、行と列をそれぞれ、
row, col = x.size()
として別個で変数に入れることもできます。
というわけで、今日はここまで。