基於 PyTorch 的 CNN 影像分類器實現。
簡介
由於卷積神經網路 (CNN) 能夠識別影像中的空間特徵,因此已廣泛應用於影像分類應用中。PyTorch 是一個流行的開源機器學習庫,它提供了構建和訓練神經網路(包括 CNN)的支援。本文將介紹如何使用 PyTorch 構建基於 CNN 的影像分類器。
資料集
在深入探討實現細節之前,讓我們先了解一下資料集。本教程將使用 CIFAR-10 資料集,它包含 60,000 張 32x32 的彩色影像,分為 10 個類別,每個類別包含 6,000 張影像。這些類別包括卡車、船、青蛙、馬、鳥、貓、鹿、汽車、飛機和汽車。資料集包含 10,000 張測試影像和 50,000 張訓練影像。
資料預處理
構建基於 CNN 的影像分類器的第一步是預處理資料。在程式碼中,我們將對影像畫素值進行歸一化,使其範圍在 0 到 1 之間。我們還將使用各種資料增強技術來擴充套件資料集並減少過擬合。資料增強技術包括隨機旋轉、隨機裁剪和隨機水平翻轉。
構建 CNN
資料預處理完成後,我們可以開始構建 CNN。我們的 CNN 架構將包含多個卷積層、最大池化層和全連線層。
訓練 CNN
定義 CNN 後,我們就可以使用 CIFAR-10 資料集來訓練它。為此,我們將利用 PyTorch 內建的神經網路訓練功能,包括定義損失函式和最佳化器。
我們將使用交叉熵損失函式,它通常用於分類任務。我們將使用隨機梯度下降 (SGD) 作為最佳化器,學習率為 0.001,動量為 0.9。
評估 CNN
成功訓練 CNN 後,我們可以透過分析測試資料集來評估其效能。我們可以透過迭代資料集並評估 CNN 的準確率來實現這一點。
程式碼
以下是用 PyTorch 實現的簡單基於 CNN 的影像分類器的示例,
import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim # Define the CNN architecture 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(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x # Preprocess the data transform = transforms.Compose( [transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), 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=32, 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=32, shuffle=False, num_workers=2) # Train the network net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 # Evaluate the network correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
輸出
[1, 2000] loss: 2.168 [1, 4000] loss: 1.828 [1, 6000] loss: 1.639 [1, 8000] loss: 1.552 [1, 10000] loss: 1.490 [2, 2000] loss: 1.407 [2, 4000] loss: 1.378 [2, 6000] loss: 1.324 [2, 8000] loss: 1.297 [2, 10000] loss: 1.269 [3, 2000] loss: 1.190 [3, 4000] loss: 1.170 [3, 6000] loss: 1.142 [3, 8000] loss: 1.126 [3, 10000] loss: 1.108 [4, 2000] loss: 1.031 [4, 4000] loss: 1.037 [4, 6000] loss: 1.016 [4, 8000] loss: 1.005 [4, 10000] loss: 1.002 [5, 2000] loss: 0.932 [5, 4000] loss: 0.944 [5, 6000] loss: 0.932 [5, 8000] loss: 0.913 [5, 10000] loss: 0.913 [6, 2000] loss: 0.831 [6, 4000] loss: 0.835 [6, 6000] loss: 0.846 [6, 8000] loss: 0.835 [6, 10000] loss: 0.829 [7, 2000] loss: 0.745 [7, 4000] loss: 0.759 [7, 6000] loss: 0.762 [7, 8000] loss: 0.763 [7, 10000] loss: 0.753 [8, 2000] loss: 0.670 [8, 4000] loss: 0.696 [8, 6000] loss: 0.690 [8, 8000] loss: 0.701 [8, 10000] loss: 0.690 [9, 2000] loss: 0.614 [9, 4000] loss: 0.635 [9, 6000] loss: 0.646 [9, 8000] loss: 0.641 [9, 10000] loss: 0.631 [10, 2000] loss: 0.562 [10, 4000] loss: 0.577 [10, 6000] loss: 0.597 [10, 8000] loss: 0.592 [10, 10000] loss: 0.586 Accuracy of the network on the 10000 test images: 68 %
此輸出顯示了訓練後網路在測試集上的準確率以及每次訓練迭代時的損失。如您所見,測試集上的準確率峰值為 68%,並且損失在 10 次訓練時期內逐漸下降。此結果可能不是最先進的,但它確實展示了使用 PyTorch 訓練 CNN 進行影像分類的基本步驟。
結論
總之,本文介紹瞭如何使用 PyTorch 構建基於 CNN 的影像分類器。該過程包括資料預處理,包括歸一化和資料增強。CNN 架構由卷積層、最大池化層和全連線層組成。訓練使用交叉熵損失和隨機梯度下降最佳化器在 CIFAR-10 資料集上進行。然後在測試資料集上評估和評估 CNN 的準確率。有了這些知識,您現在就可以開始構建自己的影像分類模型並進一步瞭解計算機視覺。