提示:原始連結:點這裡
文章目錄
- 前言
- 一、訓練圖像分類器
-
- 1. 加載資料集
- 2. 定義卷積神經網絡
- 3. 定義損失函數和優化器
- 4. 訓練網絡
- 5. 根據測試資料測試網絡
- 總結
前言
提示:本篇部落客要是記錄pytorch的學習過程,當作是一個筆記來使用。
本篇内容:訓練圖像分類器,步驟如下:
1. 使用torchvision加載并标準化 CIFAR10 訓練和測試資料集
2. 定義卷積神經網絡
3. 定義損失函數
4. 根據訓練資料訓練網絡
5. 在測試資料上測試網絡
一、訓練圖像分類器
當我們必須處理圖像,文本,音頻或視訊資料時,可以使用 NumPy 加載資料。 然後,可以将該數組轉換為torch.*Tensor。
- 對于圖像,Pillow,OpenCV 等包很有用
- 對于音頻,請使用 SciPy 和 librosa 等包
- 對于文本,基于 Python 或 Cython 的原始加載,或者 NLTK 和 SpaCy 很有用
針對視覺,我們建立了一個名為 torchvision 的包,其中包含用于常見資料集(例如 Imagenet,CIFAR10,MNIST 等)的資料加載器,以及用于圖像(即 torchvision.datasets和torch.utils.data.DataLoader)的資料轉換器。
# 導入所需要的包
import torch
import torchvision
import torchvision.transforms as transforms
1. 加載資料集
TorchVision 資料集的輸出是[0, 1]範圍的PILImage圖像。 我們将它們轉換為歸一化範圍[-1, 1]的張量。
transform = transforms.Compose()
trainset = torchvision.datasets.CIFAR10()
trainloader = torch.utils.data.DataLoader()
testset = torchvision.datasets.CIFAR10()
testloader = torch.utils.data.DataLoader()
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
1. torchvision.transforms.Compose()類。這個類的主要作用是串聯多個圖檔變換的操作。
2. torchvision.datasets:一些加載資料的函數及常用的資料集接口
3. torch.utils.data.DataLoader:簡單來講DataLoader就是用來包裝所使用的資料,每次抛出一批資料
2. 定義卷積神經網絡
參考:這裡,pytorch的nn.Module中蘊含了很多常見的網絡模型,調用即可【注:還未學到nn.Module子產品的相關知識,下面貼一下原文中的調用代碼幫助大家了解。】
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
net = Net()
3. 定義損失函數和優化器
這裡使用的是損失函數和優化器是:分類交叉熵損失和帶有動量的 SGD,調用方法存在于pytorch的 nn子產品 和 optim子產品,後面會對該部分進行詳細的學習。
4. 訓練網絡
此部分:隻需要周遊資料疊代器,然後将輸入饋送到網絡并進行優化即可,請參考下述代碼片段。
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
# 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')
5. 根據測試資料測試網絡
此部分:資料集在網絡中進行了2次訓練,但是我們需要檢查網絡是否學到了什麼。是以,我們将通過預測神經網絡輸出的類别标簽并根據實際情況進行檢查來進行檢查。 如果預測正确,則将樣本添加到正确預測清單中。
具體步驟如下:
1. 顯示測試集中的圖像以使其熟悉
2. 重新加載儲存的模型(注意:這裡不需要儲存和重新加載模型,我們隻是為了說明如何這樣做)
3. 輸出是 10 類的能量。 一個類别的能量越高,網絡就認為該圖像屬于特定類别。
4. 最後,通過網絡的訓練,可以得出哪些類的表現良好,哪些類的表現不佳
總結
本文介紹了如何使用pytorch架構去訓練一個圖像分類器模型,通過此篇筆記希望 對如何使用pytorch架構建立一個完整的訓練模型 有一個初步的了解。