PyTorch:MNIST数据集手写数字识别
生活随笔
收集整理的這篇文章主要介紹了
PyTorch:MNIST数据集手写数字识别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
MNIST 包括6萬張28x28的訓(xùn)練樣本,1萬張測試樣本,很多教程都會對它”下手”幾乎成為一個 “典范”,可以說它就是計算機視覺里面的Hello World。所以我們這里也會使用MNIST來進行實戰(zhàn)。
前面在介紹卷積神經(jīng)網(wǎng)絡(luò)的時候說到過LeNet-5,LeNet-5之所以強大就是因為在當時的環(huán)境下將MNIST數(shù)據(jù)的識別率提高到了99%,這里我們也自己從頭搭建一個卷積神經(jīng)網(wǎng)絡(luò),也達到99%的準確率。
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms首先,我們定義一些超參數(shù)。
BATCH_SIZE = 512 # 大概需要2G的顯存 EPOCHS = 20 # 總共訓(xùn)練批次 DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")因為Pytorch里面包含了MNIST的數(shù)據(jù)集,所以我們這里直接使用即可。 如果第一次執(zhí)行會生成data文件夾,并且需要一些時間下載,如果以前下載過就不會再次下載了。
由于官方已經(jīng)實現(xiàn)了dataset,所以這里可以直接使用DataLoader來對數(shù)據(jù)進行讀取。
# 下載訓(xùn)練集 train_loader = torch.utils.data.DataLoader(datasets.MNIST('data', train = True, download = True,transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1037,), (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.1037,), (0.3081,)) ])), batch_size = BATCH_SIZE, shuffle = True)下面我們定義一個網(wǎng)絡(luò),網(wǎng)絡(luò)包含兩個卷積層,conv1和conv2,然后緊接著兩個線性層作為輸出,最后輸出10個維度,這10個維度我們作為0-9的標識來確定識別出的是那個數(shù)字。
# 定義模型 class ConvNet(nn.Module):def __init__(self):super().__init__()#1*1*28*28self.conv1 = nn.Conv2d(1, 10, 5) self.conv2 = nn.Conv2d(10, 20, 3) 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) # 1* 10 * 24 *24out = F.relu(out)out = F.max_pool2d(out, 2, 2) # 1* 10 * 12 * 12out = self.conv2(out) # 1* 20 * 10 * 10out = F.relu(out)out = out.view(in_size, -1) # 1 * 2000out = self.fc1(out) # 1 * 500out = F.relu(out)out = self.fc2(out) # 1 * 10out = F.log_softmax(out, dim = 1)return out #生成模型和優(yōu)化器 model = ConvNet().to(DEVICE) optimizer = optim.Adam(model.parameters()) # 定義訓(xùn)練函數(shù) 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())) # 定義測試函數(shù) def test(model, device, test_loader):model.eval()test_loss =0correct = 0with 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') # 將一批的損失相加pred = output.max(1, keepdim = True)[1] # 找到概率最大的下標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))) # 最后開始訓(xùn)練和測試 for epoch in range(1, EPOCHS + 1):train(model, DEVICE, train_loader, optimizer, epoch)test(model, DEVICE, test_loader) Train Epoch: 20 [14848/60000 (25%)] Loss: 0.000499Train Epoch: 20 [30208/60000 (50%)] Loss: 0.002818
Train Epoch: 20 [45568/60000 (75%)] Loss: 0.011781
Test set: Average loss: 0.0249, Accuracy: 59469/60000 (99%)
總結(jié)
以上是生活随笔為你收集整理的PyTorch:MNIST数据集手写数字识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迁移上云方法论-6R
- 下一篇: PyTorch中的nn.Conv1d与n