Pytorch使用VGG16模型進(jìn)行預(yù)測貓狗二分類實(shí)戰(zhàn)
1. VGG16
1.1 VGG16 介紹
深度學(xué)習(xí)已經(jīng)在計(jì)算機(jī)視覺領(lǐng)域取得了巨大的成功,特別是在圖像分類任務(wù)中。VGG16是深度學(xué)習(xí)中經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)之一,由牛津大學(xué)的Karen Simonyan和Andrew Zisserman在2014年提出。VGG16網(wǎng)絡(luò)以其深度和簡潔性而聞名,是圖像分類中的重要里程碑。
VGG16是Visual Geometry Group的縮寫,它的名字來源于提出該網(wǎng)絡(luò)的實(shí)驗(yàn)室。VGG16的設(shè)計(jì)目標(biāo)是通過增加網(wǎng)絡(luò)深度來提高圖像分類的性能,并展示了深度對(duì)于圖像分類任務(wù)的重要性。VGG16的主要特點(diǎn)是將多個(gè)小尺寸的卷積核堆疊在一起,從而形成更深的網(wǎng)絡(luò)。
1.1.1 VGG16 網(wǎng)絡(luò)的整體結(jié)構(gòu)
VGG16網(wǎng)絡(luò)由多個(gè)卷積層和全連接層組成。它的整體結(jié)構(gòu)相對(duì)簡單,所有的卷積層都采用小尺寸的卷積核(通常為3x3),步幅為1,填充為1。每個(gè)卷積層后面都會(huì)跟著一個(gè)ReLU激活函數(shù)來引入非線性。
VGG16網(wǎng)絡(luò)主要由三個(gè)部分組成:
輸入層:接受圖像輸入,通常為224x224大小的彩色圖像(RGB)。
卷積層:VGG16包含13個(gè)卷積層,其中包括五個(gè)卷積塊。
全連接層:在卷積層后面是3個(gè)全連接層,用于最終的分類。
VGG16網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
1、一張?jiān)紙D片被resize到(224,224,3)。
2、conv1兩次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為64,輸出為(224,224,64),再2X2最大池化,輸出net為(112,112,64)。
3、conv2兩次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為128,輸出net為(112,112,128),再2X2最大池化,輸出net為(56,56,128)。
4、conv3三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為256,輸出net為(56,56,256),再2X2最大池化,輸出net為(28,28,256)。
5、conv4三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為512,輸出net為(28,28,512),再2X2最大池化,輸出net為(14,14,512)。
6、conv5三次[3,3]卷積網(wǎng)絡(luò),輸出的特征層為512,輸出net為(14,14,512),再2X2最大池化,輸出net為(7,7,512)。
7、利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,4096)。共進(jìn)行兩次。
8、利用卷積的方式模擬全連接層,效果等同,輸出net為(1,1,1000)。
最后輸出的就是每個(gè)類的預(yù)測。
1.2 Pytorch使用VGG16進(jìn)行貓狗二分類實(shí)戰(zhàn)
在這一部分,我們將使用PyTorch來實(shí)現(xiàn)VGG16網(wǎng)絡(luò),用于貓狗預(yù)測的二分類任務(wù)。我們將對(duì)VGG16的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行適當(dāng)?shù)男薷?,以適應(yīng)我們的任務(wù)。
1.2.1 數(shù)據(jù)集準(zhǔn)備
首先,我們需要準(zhǔn)備用于貓狗二分類的數(shù)據(jù)集。數(shù)據(jù)集可以從Kaggle上下載,其中包含了大量的貓和狗的圖片。在下載數(shù)據(jù)集后,我們需要將數(shù)據(jù)集劃分為訓(xùn)練集和測試集。訓(xùn)練集文件夾命名為train,其中建立兩個(gè)文件夾分別為cat和dog,每個(gè)文件夾里存放相應(yīng)類別的圖片。測試集命名為test,同理。
import torch import torchvision import torchvision.transforms as transforms # 定義數(shù)據(jù)轉(zhuǎn)換 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加載數(shù)據(jù)集 train_dataset = ImageFolder("train", transform=transform) test_dataset = ImageFolder("test", transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size)
1.2.2 構(gòu)建VGG網(wǎng)絡(luò)
import torch.nn as nn class VGG16(nn.Module): def __init__(self): super(VGG16, self).__init__() self.features = nn.Sequential( # Block 1 nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # Block 2 nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # Block 3 nn.Conv2d(128, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # Block 4 nn.Conv2d(256, 512, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # Block 5 nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), ) self.classifier = nn.Sequential( nn.Linear(512 * 7 * 7, 4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(4096, 2) # 輸出層,二分類任務(wù) ) def forward(self, x): x = self.features(x) x = torch.flatten(x, 1) # 展開特征圖 x = self.classifier(x) return x # 初始化VGG16模型 vgg16 = VGG16()
在上述代碼中,我們定義了一個(gè)VGG16類,其中self.features
部分包含了5個(gè)卷積塊,self.classifier
部分包含了3個(gè)全連接層。
1.2.3 訓(xùn)練和評(píng)估模型
import torch.optim as optim # 定義超參數(shù) batch_size = 32 learning_rate = 0.001 num_epochs = 10 model = VGG16() device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) # 定義損失函數(shù)和優(yōu)化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9) # 訓(xùn)練模型 total_step = len(train_loader) for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.to(device) labels = labels.to(device) # 前向傳播 outputs = model(images) loss = criterion(outputs, labels) # 反向傳播和優(yōu)化 optimizer.zero_grad() loss.backward() optimizer.step() if (i + 1) % 100 == 0: print(f"Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{total_step}], Loss: {loss.item()}") torch.save(model,'model/vgg16.pth') # 測試模型 model.eval() with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) print(outputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Accuracy on test images: {(correct / total) * 100}%")
在訓(xùn)練模型時(shí),我們使用交叉熵?fù)p失函數(shù)(CrossEntropyLoss)作為分類任務(wù)的損失函數(shù),并采用隨機(jī)梯度下降(SGD)作為優(yōu)化器。同時(shí),我們將模型移動(dòng)到GPU(如果可用)來加速訓(xùn)練過程。
到此這篇關(guān)于Pytorch使用VGG16模型進(jìn)行預(yù)測貓狗二分類實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Pytorch VGG16貓狗二分類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu?Server?20.04?LTS?環(huán)境下搭建vim?編輯器Python?IDE的詳細(xì)步驟
這篇文章主要介紹了Ubuntu?Server?20.04?LTS?環(huán)境下搭建vim?編輯器Python?IDE,首先是安裝配置vim-plug及安裝coc.nvim插件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08python 計(jì)算t分布的雙側(cè)置信區(qū)間
這篇文章主要介紹了python 計(jì)算t分布的雙側(cè)置信區(qū)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04python教程之利用pyautogui圖形自動(dòng)化擊敗重復(fù)性辦公任務(wù)
在使用Python做腳本的話,有兩個(gè)庫可以使用,一個(gè)為PyUserInput庫,另一個(gè)為pyautogui庫,就本人而言更喜歡使用pyautogui庫,該庫功能多,使用便利,下面這篇文章主要給大家介紹了關(guān)于python教程之利用pyautogui圖形自動(dòng)化擊敗重復(fù)性辦公任務(wù)的相關(guān)資料,需要的朋友可以參考下2022-03-03基于scrapy實(shí)現(xiàn)的簡單蜘蛛采集程序
這篇文章主要介紹了基于scrapy實(shí)現(xiàn)的簡單蜘蛛采集程序,實(shí)例分析了scrapy實(shí)現(xiàn)采集程序的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04selenium+python自動(dòng)化測試之使用webdriver操作瀏覽器的方法
這篇文章主要介紹了selenium+python自動(dòng)化測試之使用webdriver操作瀏覽器的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Python實(shí)現(xiàn)生成多種有規(guī)律的數(shù)字序列
在?Python?編程中,生成數(shù)字序列是一項(xiàng)常見且重要的任務(wù),本文將深入探討如何使用Python中的內(nèi)置函數(shù)、列表推導(dǎo)式、生成器等方式來生成多種有規(guī)律的數(shù)字序列,需要的可以參考下2024-03-03TensorFlow人工智能學(xué)習(xí)張量及高階操作示例詳解
這篇文章主要為大家介紹了TensorFlow人工智能學(xué)習(xí)張量及高階操作的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11