単純な CNN を用いた画像分類(PyTorch のサンプルプログラムを使用)

ユースケース: PyTorch の動作確認を行いたい.CNN (PyTorch を使用)について練習したい

次のWebページに記載のソースコード(単純な CNN を用いた画像分類)を実行してみる

関連する外部ページhttps://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py

先人に感謝

PyTorch の Web ページ: http://pytorch.org

GitHub の PyTorch の Webページ: https://github.com/pytorch/pytorch

前準備

PyTorch 2.3 (NVIDIA CUDA ツールキット11.8 用)のインストール(Windows 上)

次のコマンドを実行することにより, PyTorch 2.3 (NVIDIA CUDA ツールキット 11.8 用)がインストールされる.

  1. Windows で,コマンドプロンプト管理者として実行

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. PyTorch の公式ページを確認

    PyTorch の公式ページ: https://pytorch.org/index.html

  3. 次のようなコマンドを実行(実行するコマンドは,PyTorch のページの表示されるコマンドを使う).

    次のコマンドを実行することにより, PyTorch 2.3 (NVIDIA CUDA 11.8 用)がインストールされる. 但し,Anaconda3を使いたい場合には別手順になる.

    事前に NVIDIA CUDA のバージョンを確認しておくこと(ここでは,NVIDIA CUDA ツールキット 11.8 が前もってインストール済みであるとする).

    PyTorch で,GPU が動作している場合には,「torch.cuda.is_available()」により,True が表示される.

    python -m pip install -U --ignore-installed pip
    python -m pip uninstall -y torch torchvision torchaudio torchtext xformers
    python -m pip install -U torch torchvision torchaudio numpy --index-url https://download.pytorch.org/whl/cu118
    
    python -c "import torch; print(torch.__version__, torch.cuda.is_available())" 
    

関連する外部ページ

サイト内の関連ページ

関連項目NVIDIA CUDA ツールキット, PyTorch

単純な CNN を用いた画像分類(PyTorch のサンプルプログラムを使用)

  • Python プログラムの実行

    Python プログラムの実行

    Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

    Python のまとめ: 別ページ »にまとめ

    python
    
    1. インポート
      import torch
      import torchvision
      import torchvision.transforms as transforms
      

      Ubuntu での実行結果例

    2. CIFAR 10 のダウンロード
      transform = transforms.Compose(
          [transforms.ToTensor(),
           transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
      
      trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
      trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)
      
      testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
      testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)
      
      classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
      

      Ubuntu での実行結果例

    3. CNN の定義
      import torch.nn as nn
      import torch.nn.functional as F
      
      class Net(nn.Module):
          def __init__(self):
              super(Net, self).__init__()
              self.conv1 = nn.Conv2d(3, 6, 5)
              self.pool = nn.MaxPool2d(2, 2)
              self.conv2 = nn.Conv2d(6, 16, 5)
              self.fc1 = nn.Linear(16 * 5 * 5, 120)
              self.fc2 = nn.Linear(120, 84)
              self.fc3 = nn.Linear(84, 10)
          def forward(self, x):
              x = self.pool(F.relu(self.conv1(x)))
              x = self.pool(F.relu(self.conv2(x)))
              x = x.view(-1, 16 * 5 * 5)
              x = F.relu(self.fc1(x))
              x = F.relu(self.fc2(x))
              x = self.fc3(x)
              return x
      

      Ubuntu での実行結果例

    4. GPU デバイスがあれば,それを使いたい
      net = Net()
      device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
      net.to(device)
      

      Ubuntu での実行結果例

    5. 損失関数と最適化の定義
      import torch.optim as optim
      
      criterion = nn.CrossEntropyLoss()
      optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
      

      Ubuntu での実行結果例

    6. 学習

      inputs, labels = data[0].to(device), data[1].to(device)」は,GPUでもプログラムが動くようにするための処理

      for epoch in range(2):  # loop over the dataset multiple times
          running_loss = 0.0
          for i, data in enumerate(trainloader, 0):
              # get the inputs; data is a list of [inputs, labels]
              inputs, labels = data[0].to(device), data[1].to(device)
              # zero the parameter gradients
              optimizer.zero_grad()
              # forward + backward + optimize
              outputs = net(inputs)
              loss = criterion(outputs, labels)
              loss.backward()
              optimizer.step()
              # print statistics
              running_loss += loss.item()
              if i % 2000 == 1999:    # print every 2000 mini-batches
                  print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000))
                  running_loss = 0.0
      
      print('Finished Training')
      

      Ubuntu での実行結果例

    7. テストデータを用いたテスト
      dataiter = iter(testloader)
      d = dataiter.next()
      images, labels = d[0].to(device), d[1].to(device)
      
      # print images
      imshow(torchvision.utils.make_grid(images))
      outputs = net(images)
      _, predicted = torch.max(outputs, 1)
      print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))
      print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
      

      Ubuntu での実行結果例