第4章
NumPyからPyTorchへ移りたい
ここでは、「数字の表」という見方を PyTorch の tensor にそのままつなげます。
今日は何をしたい?
NumPy の配列と PyTorch の tensor が、どちらも shape や dtype を持つ「数字のまとまり」だと分かることが目標です。まずは似ているところを見て、あとで GPU に進みやすくします。
- この章のゴールは NumPy 配列 → PyTorch tensor への変換を確認する ことです。
- shape / dtype の読み方は第2・3章と同じです。新しいのは .device という属性だけです。
- ROCm の本番(GPU に乗せる)は次章です。この章は「乗せる前の準備」にあたります。
確認コード
torch.tensor() の動作について(クリックで開く)
torch.tensor(x_np) は NumPy 配列のデータをコピーして PyTorch tensor を作ります。コピーなので、この後 NumPy 側を変えても tensor は変わりません(メモリを共有したい場合は torch.from_numpy(x_np) を使いますが、変更が連動するため混乱しやすく、最初は torch.tensor() を使うのが安全です)。
import numpy as np
import torch
x_np = np.array([[1, 2],
[3, 4]], dtype=np.float32)
x_t = torch.tensor(x_np)
print("--- NumPy ---")
print(x_np.shape, x_np.dtype)
print("--- PyTorch tensor ---")
print(x_t.shape, x_t.dtype, x_t.device)このコードを chapter04.py というファイル名で保存して、python chapter04.py と実行します。
形はほぼ同じでも、PyTorch の tensor には .device という属性が加わっています。いまはまず、shape と dtype を同じ気分で読めることが大事です。
実行するとこう出ます
表示の違いについて(クリックで開く)
- shape の見え方が少し違います。NumPy は (2, 2)(タプル)、PyTorch は torch.Size([2, 2]) と表示されますが、意味は同じです。x_t.shape[0] で行数を取り出すのも NumPy と同じ書き方です。
- dtype も表示が違います。NumPy は float32、PyTorch は torch.float32 と出ます。同じ型を指しています。
- device: cpu と出ています。tensor を作っただけではまだ CPU 上です。GPU に乗っていないことを確認してください(次章で cuda に変わります)。
どこがROCm?
NumPy 配列は CPU 専用ですが、PyTorch tensor は .to("cuda") または .cuda() を呼ぶだけで GPU へ移動できます。ROCm 版 PyTorch では、この「cuda」という名前が AMD GPU(ROCm)への転送口になっています(第1章の torch.cuda と同じ理由です)。
現在 device: cpu と出ているのは「まだ GPU を使っていない」状態です。次章でこれを device: cuda:0 に変えると、第1章で確認した AMD GPU が実際に動き始めます。
PyTorch で tensor を直接作る方法
NumPy を経由せずに tensor を作ることもできます。演習で使うので確認しておきましょう。
# リストから直接作る(NumPy の np.array() に相当)
t1 = torch.tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.float32)
# ゼロで埋めた表を作る(NumPy の np.zeros() に相当)
t2 = torch.zeros(2, 3, dtype=torch.float32)
# 1 で埋めた表を作る
t3 = torch.ones(3, 4, dtype=torch.float32)
print(t1.shape, t1.device)
print(t2.shape, t2.device)どれも作った直後は device: cpu です。shape / dtype の考え方は NumPy と同じです。
ここで出てきたPython
- 2 つのライブラリを import する
- 変数名を分けて、NumPy と PyTorch の値を見比べる
- .shape、.dtype、.device のような属性を読む
- torch.tensor([[...]]) で直接 tensor を作る。dtype=torch.float32 の指定方法に注意(NumPy は np.float32、PyTorch は torch.float32)。
うまくいかなかったら
結果パターン別の次の一手(クリックで開く)
- パターンA: device: cpu と出た → 正常。この章はクリア。次章で GPU に移動します。
- パターンB: ModuleNotFoundError: No module named torch → torch 未導入。ROCm 版のインストールコマンドを PyTorch 公式サイトで確認(pip install torch は CUDA 版が入るので注意)。
- パターンC: dtype が torch.float64 になった → NumPy 配列の dtype が float64 のままです。dtype=np.float32 を明示して作り直します。
よくあるつまずき
- tensor を作っただけでは GPU には乗っていません。device: cpu と出ていれば CPU 上です。GPU に移すのは次章です。
- NumPy は float32、PyTorch は torch.float32 と表示が違いますが同じ型を指しています。
- NumPy の shape はタプル (2, 2)、PyTorch は torch.Size([2, 2]) と表示が違いますが、[0] でインデックスアクセスできるなど動作は同じです。
- torch.tensor(x_np) はデータをコピーします。NumPy 側を書き換えても tensor は変わりません(意図しない連動バグを防げます)。
1分演習
NumPy を使わず、PyTorch だけで 2 行 3 列 の tensor を直接作って、shape と device を表示してみましょう。上の「PyTorch で tensor を直接作る方法」セクションを参考にしてください。
確認したい点: ① shape が torch.Size([2, 3]) になっているか、② device が cpu と出ているか(この時点ではまだ cpu が正解です)。