← Python and ROCm 教室へ戻る

第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

ReLU と Linear の補足(クリックで開く)

ReLU は「マイナスを 0 にする簡単な部品」くらいに思えば十分です。Linear(4, 8) の 4 は入力の数、8 は出力の数です。次の層の入力もこの 8 に合わせます。

よくあるつまずき

1分演習

最後の nn.Linear(8, 2)nn.Linear(8, 3) に変えて、出力 shape がどう変わるかを見てみましょう。