【PyTorchサンプルコード】MNISTのCNN・機械学習 – PyTorch入門講座

【サンプルコード】MNISTのCNN・機械学習 - PyTorch入門講座 by 子供プログラマー

 

PyTorch入門講座 – PyTorch公式サンプルのexamples:MNIST

 

Google ColaboratoryのJupyterノートブックの開発環境で、オープンソースのPythonの機械学習ライブラリのPyTorch(パイトーチ)を使って、GitHubに公開していただいているPyTorch公式サンプル「examples:mnist」の手書き数字画像認識のプログラムを動かす方法を解説しておきます。

* MNISTとは?
:手書き数字画像のデータセット「MNIST(Mixed National Institute of Standards and Technology database – エムニスト)」のこと。MNISTは、訓練用手書き数字画像「60,000枚」、テスト用画像「10,000枚」の画像データセットです。手書きの数字画像は「0〜9」の画像。

 

公式チュートリアルにあるColaboratoryのサンプルコード以外にもPyTorchのプログラムを動かしたい!

GitHubに公開されているPythonファイル形式(main.py)のサンプルコードの動かし方が分からない・・・

といった、機械学習プログラミング初学者の方の参考になることがありましたら幸いです。

自分のパソコンの環境で実行しようとしたらMNISTを取得するのに結構時間がかかり、その後エラー・・・でしたが、Google ColaboratoryのGPU環境で実行したら明らかに自分のパソコンで行うよりもスムーズでした。
無料で使えてしまうColaboratoryですが、すごいの一言です。

 




 

【MNIST】PyTorch入門 – PyTorch公式サンプルのexamples:mnistの動かし方を解説

 

 


視聴時間:4分10秒

動画では、Google ColaboratoryのJupyterノートブックで、GitHubに公開していただいているPyTorch公式サンプル「examples:mnist」の「main.py」「requirements.txt」を実行する方法等を解説しています。

今回は

・「examples-master」

内のフォルダ

・「mnist」

を圧縮し、Google Colaboratoryにアップロード後に解凍しコードを実行しています。

サンプルプログラムでは、「torch.nn」パッケージでニューラルネットワークを構築しているようです。「Conv2d」を使っているようですので、ディープラーニング(深層学習)の「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)ですね。
この記事を初回投稿時点では、まだ、PyTorchの構文に慣れていないのでサンプルコードを見ているとソワソワします…

 

 

PyTorchのexamples:mnistを動かすためのサンプルコード

 

 

すぐに使えるサンプルコードリンク:
pytorch-mnist-cnn-examples-howtorun-samplecode.ipynb(Google ColaboratoryのJupyterノートブック)

サンプルコードの使い方は動画を参照ください。

PyTorchの「examples」のダウンロードページはこちら:
pytorch/examples – examples-master | GitHub

 

 
***** サンプルコード:はじめ ******

#① 圧縮ファイルを解凍します。
!unzip mnist.zip

 

#② カレントディレクトリ(現在作業中のディレクトリ – フォルダ)を変更します。「mnist」のフォルダを指定します。

#元の状態に戻す場合は「%cd /content」のコードを実行します。
#他のカレントディレクトに変更する場合、一度、元の状態に戻してから新たにカレントディレクトリを変更すると上手くいくようでした。

cd mnist

 

#③ 「requirements.txt」をインストールします。
!pip install -r requirements.txt

 

#④ 「main.py」を実行します。
!python main.py

***** サンプルコード:ここまで ******

 

 

PyTorchのexamples:mnistのサンプルコード

 

 

GitHubに公開していただいている
「pytorch/examples:examples-master – mnist」
のライセンス情報

BSD 3-Clause License

Copyright (c) 2017,
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS”
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 

 

requirements.txt | PyTorchのexamples:mnistのサンプルコード

 

 

requirements.txt
***** サンプルコード:はじめ ******
torch
torchvision

***** サンプルコード:ここまで ******

* 「requirements.txt」では指定のパッケージを指定のバージョンで一括インストール出来るようです。
今回のサンプルコードでは、パッケージの指定はありますが、バージョンの指定は書いていないようです。

* torchvision:pytorchのコンピュータービジョン用のパッケージのこと。

 

 

main.py | PyTorchのexamples:mnistのサンプルコード

 

 

main.py
***** サンプルコード:はじめ ******
from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.optim.lr_scheduler import StepLR

class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.dropout1 = nn.Dropout2d(0.25)
self.dropout2 = nn.Dropout2d(0.5)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)

def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.conv2(x)
x = F.max_pool2d(x, 2)
x = self.dropout1(x)
x = torch.flatten(x, 1)
x = self.fc1(x)
x = F.relu(x)
x = self.dropout2(x)
x = self.fc2(x)
output = F.log_softmax(x, dim=1)
return output

def train(args, model, device, train_loader, optimizer, epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
if batch_idx % args.log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))

def test(args, model, device, test_loader):
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss
pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability
correct += pred.eq(target.view_as(pred)).sum().item()

test_loss /= len(test_loader.dataset)

print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))

def main():
# Training settings
parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
parser.add_argument('--batch-size', type=int, default=64, metavar='N',
help='input batch size for training (default: 64)')
parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N',
help='input batch size for testing (default: 1000)')
parser.add_argument('--epochs', type=int, default=14, metavar='N',
help='number of epochs to train (default: 14)')
parser.add_argument('--lr', type=float, default=1.0, metavar='LR',
help='learning rate (default: 1.0)')
parser.add_argument('--gamma', type=float, default=0.7, metavar='M',
help='Learning rate step gamma (default: 0.7)')
parser.add_argument('--no-cuda', action='store_true', default=False,
help='disables CUDA training')
parser.add_argument('--seed', type=int, default=1, metavar='S',
help='random seed (default: 1)')
parser.add_argument('--log-interval', type=int, default=10, metavar='N',
help='how many batches to wait before logging training status')

parser.add_argument('--save-model', action='store_true', default=False,
help='For Saving the current Model')
args = parser.parse_args()
use_cuda = not args.no_cuda and torch.cuda.is_available()

torch.manual_seed(args.seed)

device = torch.device("cuda" if use_cuda else "cpu")

kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {}
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=args.batch_size, shuffle=True, **kwargs)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=args.test_batch_size, shuffle=True, **kwargs)

model = Net().to(device)
optimizer = optim.Adadelta(model.parameters(), lr=args.lr)

scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma)
for epoch in range(1, args.epochs + 1):
train(args, model, device, train_loader, optimizer, epoch)
test(args, model, device, test_loader)
scheduler.step()

if args.save_model:
torch.save(model.state_dict(), "mnist_cnn.pt")

if __name__ == '__main__':
main()

***** サンプルコード:ここまで ******

 




 

by 子供プログラマー | プログラミング入門ウェブ教室