第6章
小さなモデルを動かしたい
ここでは、PyTorch のモデルに入力を通して、出力が返ってくる一連の流れを見ます。
今日は何をしたい?
モデルとは、入力を受け取って出力を返す「部品の組み合わせ」です。PyTorch では nn.Sequential を使って部品を順につなぎ、ひとつのモデルとして扱います。
model(x) という一行が、実際には「入力をモデルに通して答えを作る」動きだと分かることが目標です。まずはとても小さなモデルで、形がどう変わるかを追います。
shape はこう流れます。
(1, 4)
→
Linear(4, 8)
→
(1, 8)
→
ReLU
→
(1, 8)
→
Linear(8, 2)
→
(1, 2)
Linear(4, 8) の 4 は入力の数、8 は出力の数です。次の層の入力もこの 8 に合わせます。
確認コード
import torch
import torch.nn as nn
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = nn.Sequential(
nn.Linear(4, 8),
nn.ReLU(),
nn.Linear(8, 2),
).to(device)
x = torch.randn(1, 4, device=device)
y = model(x)
print("入力 shape:", x.shape)
print("出力 shape:", y.shape)このコードを chapter06.py として保存して、python chapter06.py で実行します。
入力 shape: torch.Size([1, 4])
出力 shape: torch.Size([1, 2])
shape の先頭にある 1 は「1個分のデータ」を意味します(バッチサイズと呼びます)。数字 4 個を受け取り、最後は 2 個の答えへ変えていると読めます。
モデルを通したら shape が変わった — それが確認できればこの章は OK です。数値の中身は気にしなくて大丈夫です。
どこがROCm?
コードの .to(device) でモデルと入力を両方 GPU に置くと、model(x) の中の行列計算がすべて GPU 側で動きます。nn.Linear は内部では行列の掛け算と足し算を行っているので、GPU の得意な計算そのものです。
ここで出てきたPython
- nn.Sequential(...) — 部品を順につなぐ
- nn.Linear(4, 8) — 数字 4 個を受け取り 8 個に変換する部品(行列計算を行う)
- nn.ReLU() — マイナスの値を 0 にする部品。直線的な計算だけでは表現力が限られるため、間に挿みます
- model(x) — モデルを関数のように呼ぶ
ReLU と Linear の補足(クリックで開く)
ReLU は「マイナスを 0 にする簡単な部品」くらいに思えば十分です。Linear(4, 8) の 4 は入力の数、8 は出力の数です。次の層の入力もこの 8 に合わせます。
よくあるつまずき
- 入力の最後の大きさが Linear(4, 8) の 4 と合わないと止まります。
- 入力だけ GPU、モデルは CPU のままだと device の不一致で止まることがあります。
- ReLU は「マイナスを 0 にする簡単な部品」くらいに思えば十分です。
1分演習
最後の nn.Linear(8, 2) を nn.Linear(8, 3) に変えて、出力 shape がどう変わるかを見てみましょう。