PyTorch 2.0 チュートリアル : 入門 : クイックスタート

PyTorch 2.0 チュートリアル : 入門 : クイックスタート (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/17/2023 (2.0.0)

* 本ページは、PyTorch 2.0 Tutorials の以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく 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, TorchVisionTorchAudio のようなドメイン固有のライブラリを提供します、それらの総てはデータセットを含みます。このチュートリアルのためには、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"

モデルのセーブ & ロード について更に読んでください。

 

以上