PyTorch 2.0 チュートリアル : 入門 : クイックスタート (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/17/2023 (2.0.0)
* 本ページは、PyTorch 2.0 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:
- Introduction to PyTorch : Learn the Basics : QuickStart
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
PyTorch 2.0 チュートリアル : 入門 : クイックスタート
このセクションは機械学習の一般的なタスクのための API を通り抜けます。深く調べるためには各セクションのリンクを参照してください。
データで作業する
PyTorch は データで作業するために 2 つのプリミティブ を持ちます : torch.utils.data.DataLoader と torch.utils.data.Dataset です。Dataset はサンプルとそれらに対応するラベルをストアし、そして DataLoader は Dataset 周りの iterable をラップします。
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor
PyTorch は TorchText, TorchVision と TorchAudio のようなドメイン固有のライブラリを提供します、それらの総てはデータセットを含みます。このチュートリアルのためには、TorchVision データセットを使用していきます。
torchvision.datasets モジュールは CIFAR, COCO のような多くの現実世界ビジョンデータのための Dataset オブジェクトを含みます (ここ に完全なリスト)。このチュートリアルでは、FashionMNIST データセットを使用します。総ての TorchVision データセットは 2 つの引数を含みます : サンプルとラベルをそれぞれ変更する transform と target_transform です。
# Download training data from open datasets.
training_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor(),
)
# Download test data from open datasets.
test_data = datasets.FashionMNIST(
root="data",
train=False,
download=True,
transform=ToTensor(),
)
Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to data/FashionMNIST/raw/train-images-idx3-ubyte.gz 0%| | 0/26421880 [00:00<?, ?it/s] 0%| | 32768/26421880 [00:00<01:26, 306604.75it/s] 0%| | 65536/26421880 [00:00<01:27, 302366.70it/s] 0%| | 131072/26421880 [00:00<00:59, 438313.10it/s] 1%| | 229376/26421880 [00:00<00:42, 620032.07it/s] 2%|1 | 491520/26421880 [00:00<00:20, 1260594.02it/s] 4%|3 | 950272/26421880 [00:00<00:11, 2256649.96it/s] 7%|7 | 1933312/26421880 [00:00<00:05, 4452880.11it/s] 15%|#4 | 3833856/26421880 [00:00<00:02, 8570696.42it/s] 26%|##6 | 6946816/26421880 [00:00<00:01, 14781929.65it/s] 38%|###8 | 10059776/26421880 [00:01<00:00, 18985788.84it/s] 50%|####9 | 13172736/26421880 [00:01<00:00, 21873436.37it/s] 62%|######1 | 16252928/26421880 [00:01<00:00, 23539490.27it/s] 73%|#######3 | 19398656/26421880 [00:01<00:00, 25053163.04it/s] 84%|########4 | 22282240/26421880 [00:01<00:00, 25361776.82it/s] 96%|#########6| 25395200/26421880 [00:01<00:00, 26282442.81it/s] 100%|##########| 26421880/26421880 [00:01<00:00, 16019259.44it/s] Extracting data/FashionMNIST/raw/train-images-idx3-ubyte.gz to data/FashionMNIST/raw Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw/train-labels-idx1-ubyte.gz 0%| | 0/29515 [00:00<?, ?it/s] 100%|##########| 29515/29515 [00:00<00:00, 268401.63it/s] 100%|##########| 29515/29515 [00:00<00:00, 267106.14it/s] Extracting data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz 0%| | 0/4422102 [00:00<?, ?it/s] 1%| | 32768/4422102 [00:00<00:14, 300215.49it/s] 1%|1 | 65536/4422102 [00:00<00:14, 299012.55it/s] 3%|2 | 131072/4422102 [00:00<00:09, 434989.97it/s] 5%|5 | 229376/4422102 [00:00<00:06, 616860.41it/s] 11%|#1 | 491520/4422102 [00:00<00:03, 1254530.61it/s] 21%|##1 | 950272/4422102 [00:00<00:01, 2249909.47it/s] 44%|####3 | 1933312/4422102 [00:00<00:00, 4433531.48it/s] 87%|########6 | 3833856/4422102 [00:00<00:00, 8537407.99it/s] 100%|##########| 4422102/4422102 [00:00<00:00, 5021248.98it/s] Extracting data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz 0%| | 0/5148 [00:00<?, ?it/s] 100%|##########| 5148/5148 [00:00<00:00, 23598116.93it/s] Extracting data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw
DataLoader への引数として Dataset を渡します。これはデータセットに対する iterable をラップし、そして自動バッチ化、サンプリング、シャッフルとマルチプロセス・データローディングをサポートします。ここでは 64 のバッチサイズを定義します i.e. データローダ iterable の各要素は 64 の特徴量とラベルのバッチを返します。
batch_size = 64
# Create data loaders.
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)
for X, y in test_dataloader:
print(f"Shape of X [N, C, H, W]: {X.shape}")
print(f"Shape of y: {y.shape} {y.dtype}")
break
Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28]) Shape of y: torch.Size([64]) torch.int64
PyTorch のデータのロード について更に読んでください。
モデルを作成する
PyTorch でニューラルネットワークを定義するため、nn.Module から継承したクラスを作成します。__init__ 関数でネットワーク層を定義して forward 関数でデータがどのようにネットワークを通り抜けるか指定します。ニューラルネットワークの演算を高速化するためには、利用可能であればそれを GPU に移します。
# Get cpu or gpu device for training.
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(f"Using {device} device")
# Define model
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10)
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
model = NeuralNetwork().to(device)
print(model)
Using cuda device NeuralNetwork( (flatten): Flatten(start_dim=1, end_dim=-1) (linear_relu_stack): Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU() (2): Linear(in_features=512, out_features=512, bias=True) (3): ReLU() (4): Linear(in_features=512, out_features=10, bias=True) ) )
PyTorch のニューラルネットワークの構築 について更に読んでください。
モデル・パラメータの最適化
モデルを訓練するためには、損失関数と optimizer を必要とします。
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
単一訓練ループ内で、モデルは訓練データセット (バッチでそれに供給されます) 上で予測を行ない、モデルのパラメータを調整するために予測誤差を逆伝播します。
def train(dataloader, model, loss_fn, optimizer):
size = len(dataloader.dataset)
model.train()
for batch, (X, y) in enumerate(dataloader):
X, y = X.to(device), y.to(device)
# Compute prediction error
pred = model(X)
loss = loss_fn(pred, y)
# Backpropagation
optimizer.zero_grad()
loss.backward()
optimizer.step()
if batch % 100 == 0:
loss, current = loss.item(), (batch + 1) * len(X)
print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")
モデルが学習していることを確認するためにテスト・データセットに対してそのパフォーマンスも確認します。
def test(dataloader, model, loss_fn):
size = len(dataloader.dataset)
num_batches = len(dataloader)
model.eval()
test_loss, correct = 0, 0
with torch.no_grad():
for X, y in dataloader:
X, y = X.to(device), y.to(device)
pred = model(X)
test_loss += loss_fn(pred, y).item()
correct += (pred.argmax(1) == y).type(torch.float).sum().item()
test_loss /= num_batches
correct /= size
print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
訓練プロセスは幾つかの反復 (エポック) に渡り実行されます。各エポックの間に、モデルはより良い予測を行なうためにパラメータを学習します。各エポックでモデルの精度と損失をプリントします ; 総てのエポックで精度が増加して損失が減少することを見たいです。
epochs = 5
for t in range(epochs):
print(f"Epoch {t+1}\n-------------------------------")
train(train_dataloader, model, loss_fn, optimizer)
test(test_dataloader, model, loss_fn)
print("Done!")
Epoch 1 ------------------------------- loss: 2.302412 [ 64/60000] loss: 2.292397 [ 6464/60000] loss: 2.267150 [12864/60000] loss: 2.255388 [19264/60000] loss: 2.241509 [25664/60000] loss: 2.204662 [32064/60000] loss: 2.223426 [38464/60000] loss: 2.183599 [44864/60000] loss: 2.180763 [51264/60000] loss: 2.134327 [57664/60000] Test Error: Accuracy: 32.9%, Avg loss: 2.137714 Epoch 2 ------------------------------- loss: 2.155482 [ 64/60000] loss: 2.147562 [ 6464/60000] loss: 2.082107 [12864/60000] loss: 2.096438 [19264/60000] loss: 2.044011 [25664/60000] loss: 1.982758 [32064/60000] loss: 2.018132 [38464/60000] loss: 1.935154 [44864/60000] loss: 1.940222 [51264/60000] loss: 1.860425 [57664/60000] Test Error: Accuracy: 52.8%, Avg loss: 1.860213 Epoch 3 ------------------------------- loss: 1.900081 [ 64/60000] loss: 1.871681 [ 6464/60000] loss: 1.743501 [12864/60000] loss: 1.789350 [19264/60000] loss: 1.671200 [25664/60000] loss: 1.636742 [32064/60000] loss: 1.660616 [38464/60000] loss: 1.561917 [44864/60000] loss: 1.585734 [51264/60000] loss: 1.480441 [57664/60000] Test Error: Accuracy: 59.1%, Avg loss: 1.496636 Epoch 4 ------------------------------- loss: 1.565609 [ 64/60000] loss: 1.534411 [ 6464/60000] loss: 1.376746 [12864/60000] loss: 1.455095 [19264/60000] loss: 1.331492 [25664/60000] loss: 1.341156 [32064/60000] loss: 1.352300 [38464/60000] loss: 1.280237 [44864/60000] loss: 1.311671 [51264/60000] loss: 1.207966 [57664/60000] Test Error: Accuracy: 62.9%, Avg loss: 1.238052 Epoch 5 ------------------------------- loss: 1.314819 [ 64/60000] loss: 1.298932 [ 6464/60000] loss: 1.128401 [12864/60000] loss: 1.236510 [19264/60000] loss: 1.112616 [25664/60000] loss: 1.148940 [32064/60000] loss: 1.163219 [38464/60000] loss: 1.104978 [44864/60000] loss: 1.141441 [51264/60000] loss: 1.048284 [57664/60000] Test Error: Accuracy: 64.4%, Avg loss: 1.076668 Done!
モデルを訓練する について更に読んでください。
モデルをセーブする
モデルをセーブする一般的な方法は (モデルパラメータを含む) 内部状態辞書をシリアライズすることです。
torch.save(model.state_dict(), "model.pth")
print("Saved PyTorch Model State to model.pth")
Saved PyTorch Model State to model.pth
モデルをロードする
モデルをロードするためのプロセスはモデル構造の再作成と状態辞書のそれへのロードを含みます。
model = NeuralNetwork()
model.load_state_dict(torch.load("model.pth"))
<All keys matched successfully>
このモデルは今では予測を行なうために利用できます。
classes = [
"T-shirt/top",
"Trouser",
"Pullover",
"Dress",
"Coat",
"Sandal",
"Shirt",
"Sneaker",
"Bag",
"Ankle boot",
]
model.eval()
x, y = test_data[0][0], test_data[0][1]
with torch.no_grad():
pred = model(x)
predicted, actual = classes[pred[0].argmax(0)], classes[y]
print(f'Predicted: "{predicted}", Actual: "{actual}"')
Predicted: "Ankle boot", Actual: "Ankle boot"
モデルのセーブ & ロード について更に読んでください。
以上