重ポンド共有:PyTorchを使用してMNIST手書き識別コードを実現

28718 ワード

@本文は公衆番号に由来する:csdn 2299、公衆番号に注目できるプログラマー学府が好きです.今日はPyTorchを使ってMNIST手書き識別コードを実現することを共有します.参考価値があります.皆さんに役に立つことを望んでいます.一緒に編集者について来てみましょう
記事の目次
  • 実験環境
  • MNISTデータセット紹介
  • インポートパッケージ
  • 定義スーパーパラメータ
  • データセット
  • 定義ネットワーク
  • 実例化ネットワーク
  • 訓練関数
  • を定義する
  • テスト関数
  • を定義する
  • 訓練開始
  • 実験結果
  • 実験環境
    win10 + anaconda + jupyter notebook
    Pytorch1.1.0
    Python3.7
    gpu環境(オプション)
    MNISTデータセットの紹介
    MNISTは6万枚の28 x 28の訓練サンプル、1万枚のテストサンプルを含み、CVの「Hello Word」と言える.本論文で使用したCNNネットワークはMNISTデータの識別率を99%に向上させた.次は実戦を始めます.
    パッケージのインポート
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.optim as optim
    from torchvision import datasets, transforms
    torch.__version__
    
    スーパーパラメータの定義
    BATCH_SIZE=512
    EPOCHS=20
    DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    データセット
    PyTorchに付属しているdatasetを直接使用し、DataLoaderを使用してトレーニングデータとテストデータをそれぞれ読み取ります.データセットをダウンロードした場合はFalseを選択できます
    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=BATCH_SIZE, shuffle=True)
     
    test_loader = torch.utils.data.DataLoader(
        datasets.MNIST('data', train=False, transform=transforms.Compose([
                  transforms.ToTensor(),
                  transforms.Normalize((0.1307,), (0.3081,))
                ])),
        batch_size=BATCH_SIZE, shuffle=True)
    
    ネットワークの定義
    このネットワークは、2つのボリューム層と2つの線形層を含み、最後に10次元、すなわち0〜9 10個の数字を出力する.
    class ConvNet(nn.Module):
      def __init__(self):
        super().__init__()
        self.conv1=nn.Conv2d(1,10,5) # input:(1,28,28) output:(10,24,24) 
        self.conv2=nn.Conv2d(10,20,3) # input:(10,12,12) output:(20,10,10)
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)
      def forward(self,x):
        in_size = x.size(0)
        out = self.conv1(x)
        out = F.relu(out)
        out = F.max_pool2d(out, 2, 2) 
        out = self.conv2(out)
        out = F.relu(out)
        out = out.view(in_size,-1)
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out,dim=1)
        return out
    
    インスタンス化されたネットワーク
    model = ConvNet().to(DEVICE) #       gpu 
    optimizer = optim.Adam(model.parameters()) #   Adam   
    
    トレーニング関数の定義
    def train(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+1)%30 == 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(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() #         
          pred = output.max(1, keepdim=True)[1] #          
          correct += pred.eq(target.view_as(pred)).sum().item()
     
      test_loss /= len(test_loader.dataset)
      print('
    Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)
    '
    .format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset)))
    訓練を始める
    for epoch in range(1, EPOCHS + 1):
      train(model, DEVICE, train_loader, optimizer, epoch)
      test(model, DEVICE, test_loader)
    
    じっけんけっか
    Train Epoch: 1 [14848/60000 (25%)]  Loss: 0.375058
    Train Epoch: 1 [30208/60000 (50%)]  Loss: 0.255248
    Train Epoch: 1 [45568/60000 (75%)]  Loss: 0.128060
     
    Test set: Average loss: 0.0992, Accuracy: 9690/10000 (97%)
     
    Train Epoch: 2 [14848/60000 (25%)]  Loss: 0.093066
    Train Epoch: 2 [30208/60000 (50%)]  Loss: 0.087888
    Train Epoch: 2 [45568/60000 (75%)]  Loss: 0.068078
     
    Test set: Average loss: 0.0599, Accuracy: 9816/10000 (98%)
     
    Train Epoch: 3 [14848/60000 (25%)]  Loss: 0.043926
    Train Epoch: 3 [30208/60000 (50%)]  Loss: 0.037321
    Train Epoch: 3 [45568/60000 (75%)]  Loss: 0.068404
     
    Test set: Average loss: 0.0416, Accuracy: 9859/10000 (99%)
     
    Train Epoch: 4 [14848/60000 (25%)]  Loss: 0.031654
    Train Epoch: 4 [30208/60000 (50%)]  Loss: 0.041341
    Train Epoch: 4 [45568/60000 (75%)]  Loss: 0.036493
     
    Test set: Average loss: 0.0361, Accuracy: 9873/10000 (99%)
     
    Train Epoch: 5 [14848/60000 (25%)]  Loss: 0.027688
    Train Epoch: 5 [30208/60000 (50%)]  Loss: 0.019488
    Train Epoch: 5 [45568/60000 (75%)]  Loss: 0.018023
     
    Test set: Average loss: 0.0344, Accuracy: 9875/10000 (99%)
     
    Train Epoch: 6 [14848/60000 (25%)]  Loss: 0.024212
    Train Epoch: 6 [30208/60000 (50%)]  Loss: 0.018689
    Train Epoch: 6 [45568/60000 (75%)]  Loss: 0.040412
     
    Test set: Average loss: 0.0350, Accuracy: 9879/10000 (99%)
     
    Train Epoch: 7 [14848/60000 (25%)]  Loss: 0.030426
    Train Epoch: 7 [30208/60000 (50%)]  Loss: 0.026939
    Train Epoch: 7 [45568/60000 (75%)]  Loss: 0.010722
     
    Test set: Average loss: 0.0287, Accuracy: 9892/10000 (99%)
     
    Train Epoch: 8 [14848/60000 (25%)]  Loss: 0.021109
    Train Epoch: 8 [30208/60000 (50%)]  Loss: 0.034845
    Train Epoch: 8 [45568/60000 (75%)]  Loss: 0.011223
     
    Test set: Average loss: 0.0299, Accuracy: 9904/10000 (99%)
     
    Train Epoch: 9 [14848/60000 (25%)]  Loss: 0.011391
    Train Epoch: 9 [30208/60000 (50%)]  Loss: 0.008091
    Train Epoch: 9 [45568/60000 (75%)]  Loss: 0.039870
     
    Test set: Average loss: 0.0341, Accuracy: 9890/10000 (99%)
     
    Train Epoch: 10 [14848/60000 (25%)] Loss: 0.026813
    Train Epoch: 10 [30208/60000 (50%)] Loss: 0.011159
    Train Epoch: 10 [45568/60000 (75%)] Loss: 0.024884
     
    Test set: Average loss: 0.0286, Accuracy: 9901/10000 (99%)
     
    Train Epoch: 11 [14848/60000 (25%)] Loss: 0.006420
    Train Epoch: 11 [30208/60000 (50%)] Loss: 0.003641
    Train Epoch: 11 [45568/60000 (75%)] Loss: 0.003402
     
    Test set: Average loss: 0.0377, Accuracy: 9894/10000 (99%)
     
    Train Epoch: 12 [14848/60000 (25%)] Loss: 0.006866
    Train Epoch: 12 [30208/60000 (50%)] Loss: 0.012617
    Train Epoch: 12 [45568/60000 (75%)] Loss: 0.008548
     
    Test set: Average loss: 0.0311, Accuracy: 9908/10000 (99%)
     
    Train Epoch: 13 [14848/60000 (25%)] Loss: 0.010539
    Train Epoch: 13 [30208/60000 (50%)] Loss: 0.002952
    Train Epoch: 13 [45568/60000 (75%)] Loss: 0.002313
     
    Test set: Average loss: 0.0293, Accuracy: 9905/10000 (99%)
     
    Train Epoch: 14 [14848/60000 (25%)] Loss: 0.002100
    Train Epoch: 14 [30208/60000 (50%)] Loss: 0.000779
    Train Epoch: 14 [45568/60000 (75%)] Loss: 0.005952
     
    Test set: Average loss: 0.0335, Accuracy: 9897/10000 (99%)
     
    Train Epoch: 15 [14848/60000 (25%)] Loss: 0.006053
    Train Epoch: 15 [30208/60000 (50%)] Loss: 0.002559
    Train Epoch: 15 [45568/60000 (75%)] Loss: 0.002555
     
    Test set: Average loss: 0.0357, Accuracy: 9894/10000 (99%)
     
    Train Epoch: 16 [14848/60000 (25%)] Loss: 0.000895
    Train Epoch: 16 [30208/60000 (50%)] Loss: 0.004923
    Train Epoch: 16 [45568/60000 (75%)] Loss: 0.002339
     
    Test set: Average loss: 0.0400, Accuracy: 9893/10000 (99%)
     
    Train Epoch: 17 [14848/60000 (25%)] Loss: 0.004136
    Train Epoch: 17 [30208/60000 (50%)] Loss: 0.000927
    Train Epoch: 17 [45568/60000 (75%)] Loss: 0.002084
     
    Test set: Average loss: 0.0353, Accuracy: 9895/10000 (99%)
     
    Train Epoch: 18 [14848/60000 (25%)] Loss: 0.004508
    Train Epoch: 18 [30208/60000 (50%)] Loss: 0.001272
    Train Epoch: 18 [45568/60000 (75%)] Loss: 0.000543
     
    Test set: Average loss: 0.0380, Accuracy: 9894/10000 (99%)
     
    Train Epoch: 19 [14848/60000 (25%)] Loss: 0.001699
    Train Epoch: 19 [30208/60000 (50%)] Loss: 0.000661
    Train Epoch: 19 [45568/60000 (75%)] Loss: 0.000275
     
    Test set: Average loss: 0.0339, Accuracy: 9905/10000 (99%)
     
    Train Epoch: 20 [14848/60000 (25%)] Loss: 0.000441
    Train Epoch: 20 [30208/60000 (50%)] Loss: 0.000695
    Train Epoch: 20 [45568/60000 (75%)] Loss: 0.000467
     
    Test set: Average loss: 0.0396, Accuracy: 9894/10000 (99%)
    
    締め括りをつける
    実際のプロジェクトのワークフロー:データセットを見つけて、データを前処理して、私たちのモデルを定義して、スーパーパラメータを調整して、テスト訓練して、更に訓練の結果を通じてスーパーパラメータを調整してあるいはモデルを調整します.
    あなたの大学を読む时に独学pythonを选んだことに感谢して、仕事をしてコンピュータの基础のよくない损を食べたことを発见して、学歴がだめなのは仕方がない事で、あさって补うことしかできなくて、そこでコードの外で自分の逆袭の道を开いて、绝えずpythonの核心の知识を学んで、深くコンピュータの基础知识を研究して、整理しました私は私たちのPython学習ボタンqun:2509333691に置いて、もしあなたも平凡ではないならば、私と一緒にコードの外で、絶えず成長しましょう!
    実はここには技術があるだけでなく、技術以外のものもあります.例えば、どのように精緻なプログラマーになるか、「キックアス」ではなく、プログラマー自体が高貴な存在ではないでしょうか.[クリックして参加]あなた自身が高尚な人になりたいと思って、がんばって!