【深度學習】AlexNet網絡實現貓狗分類

【深度學習】AlexNet網絡實現貓狗分類

AlexNet簡介

AlexNet是一種卷積神經網絡(Convolutional Neural Network,CNN)模型,它在2012年的ImageNet圖像分類挑戰賽中取得了重大突破,引發了深度學習在計算機視覺領域的熱潮。下面是對AlexNet模型和CNN模型的關系以及原理的解釋:

  1. AlexNet模型是一種CNN模型:
  • AlexNet是一種典型的卷積神經網絡模型,它由多個卷積層、池化層和全連接層組成,通過這些層的堆疊和組合來提取圖像的特征并進行分類。

  • CNN模型的原理:

  • CNN是一種專門用于處理具有網格結構的數據(如圖像)的深度學習模型。它通過卷積層和池化層來提取圖像的局部特征,并通過全連接層進行分類。

  • 卷積層通過卷積操作對輸入圖像進行特征提取,通過滑動一個卷積核(filter)在圖像上進行局部特征的提取,生成特征圖(feature map)。

  • 池化層通過降采樣操作減小特征圖的尺寸,并保留主要的特征信息。

  • 全連接層將池化層輸出的特征圖轉換為一維向量,并通過全連接神經網絡進行分類。

3.AlexNet模型的原理:

  • AlexNet模型是由Alex Krizhevsky等人提出的,它在CNN模型的基礎上進行了一些創新和改進。
  • AlexNet模型的網絡結構包括多個卷積層、池化層和全連接層,其中使用了ReLU激活函數來增強非線性特性。

4.AlexNet模型的特點包括:

  • 使用多個卷積層和池化層進行特征提取,通過堆疊多個卷積層來逐漸提取更高級別的特征。

  • 使用了局部響應歸一化(Local Response Normalization)層來增強模型的泛化能力。

  • 使用了Dropout層來減少過擬合。

  • 使用了大規模的訓練數據和數據增強技術來提高模型的性能。

  • AlexNet模型在ImageNet圖像分類挑戰賽中取得了顯著的成績,為后續的深度學習模型的發展奠定了基礎。

總結來說,AlexNet模型是一種經典的CNN模型,它通過卷積層、池化層和全連接層來提取圖像的特征并進行分類。AlexNet模型在深度學習的發展中起到了重要的作用,對后續的CNN模型設計和圖像分類任務產生了深遠的影響。

代碼:

1.導入所需的庫:
torch:PyTorch庫,用于構建和訓練神經網絡模型。
torch.nn:PyTorch的神經網絡模塊,包含了構建神經網絡所需的類和函數。
torch.optim:PyTorch的優化器模塊,包含了各種優化算法。
torchvision.transforms:PyTorch的圖像轉換模塊,用于對圖像進行預處理。
warnings:Python的警告模塊,用于忽略警告信息。
torch.utils.data:PyTorch的數據加載模塊,用于加載和處理數據。
torchvision.datasets:PyTorch的數據集模塊,包含了常用的圖像數據集。
torchvision.models:PyTorch的預訓練模型模塊,包含了一些經典的神經網絡模型。

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import warnings
from torch.utils.data import DataLoader
from torchvision.datasets import ImageFolder
from torchvision.models import alexnet
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽

2.數據預處理并加載數據:

# 檢查是否有可用的GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
#cuda顯卡warnings.filterwarnings("ignore")# 數據預處理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加載訓練數據和測試數據
train_dataset = ImageFolder("dataset/train", transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)test_dataset = ImageFolder("dataset/test", transform=transform)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

通過torch.cuda.is_available()函數判斷是否有可用的GPU,并將設備設置為’cuda’或’cpu’。
使用torchvision.transforms.Compose函數定義了一系列的圖像轉換操作,包括調整大小、轉換為張量、歸一化等。
使用torchvision.datasets.ImageFolder類加載訓練數據集和測試數據集,并應用之前定義的數據預處理操作。
使用torch.utils.data.DataLoader類將數據集包裝成可迭代的數據加載器,設置批量大小和是否打亂數據。
3.定義AlexNet模型:

# 定義AlexNet模型
class AlexNet(nn.Module):def __init__(self, num_classes=2):super(AlexNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(64, 192, kernel_size=5, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(192, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 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=3, stride=2),)self.avgpool = nn.AdaptiveAvgPool2d((6, 6))self.classifier = nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return xmodel = AlexNet()# 將模型移動到GPU上
model = model.to(device)

創建一個繼承自torch.nn.Module的子類AlexNet,其中包含了AlexNet模型的網絡結構和前向傳播方法。
網絡結構包括卷積層、ReLU激活函數、最大池化層和全連接層。
通過self.features定義了卷積層和池化層的結構,通過self.classifier定義了全連接層的結構。
前向傳播方法將輸入數據經過卷積層、池化層、全連接層等操作,得到輸出結果。
創建一個AlexNet模型的實例對象model。
使用model.to(device)將模型移動到之前檢查的可用設備上。
4.定義損失函數和優化器:

# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

定義交叉熵損失函數nn.CrossEntropyLoss()。
定義隨機梯度下降優化器optim.SGD,設置學習率和動量。
5.定義學習率調度器:

# 定義學習率調度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)

使用optim.lr_scheduler.StepLR定義學習率調度器,設置學習率衰減的步長和衰減因子。
6.訓練模型:

# 訓練模型
epochs = 10  # 修改為您想要的訓練輪數
train_loss_list = []
train_acc_list = []
test_acc_list = []
for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()train_accuracy = correct / totaltrain_loss = running_loss / len(train_loader)train_loss_list.append(train_loss)train_acc_list.append(train_accuracy)# 測試模型correct = 0total = 0with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()test_accuracy = correct / totaltest_acc_list.append(test_accuracy)print("Epoch {} - Training loss: {:.4f} - Training accuracy: {:.4f} - Test accuracy: {:.4f}".format(epoch, train_loss, train_accuracy, test_accuracy))# 更新學習率scheduler.step()

使用range(epochs)循環進行指定輪數的訓練。
在每個epoch中,遍歷訓練數據集,將數據移動到設備上,通過前向傳播計算輸出,計算損失并進行反向傳播和優化。
計算訓練集的準確率和損失,并將其記錄在列表中。
在每個epoch結束后,使用測試數據集評估模型的準確率,并將其記錄在列表中。
打印每個epoch的訓練損失、訓練準確率和測試準確率。
使用學習率調度器更新學習率。
7.保存模型:

# 保存模型
torch.save(model.state_dict(), "alexnet.pth")

8.加載預訓練的模型參數:

model.load_state_dict(torch.load('alexnet.pth'))

9.將模型移動到CPU上進行預測:

model = model.to('cpu')

10.可視化預測結果:

examples = enumerate(test_loader)
_, (imgs, _) = next(examples)fig = plt.figure()
# for i in range(len(imgs)):
for i in range(20):img = imgs[i].numpy()img = img.transpose(1, 2, 0)img = (img + 1) / 2with torch.no_grad():output = model(torch.unsqueeze(imgs[i], 0))_, predicted = torch.max(output.data, 1)if predicted.item() == 0:pre_value = "狗"else:pre_value = "貓"plt.subplot(6, 5, i + 1)###########################plt.tight_layout()plt.imshow(img)plt.title("預測值: {}".format(pre_value))plt.xticks([])plt.yticks([])plt.show()

從測試數據集中獲取一批圖像數據。
對每個圖像進行預測,并將預測結果和圖像可視化展示出來。

運行結果:

在這里插入圖片描述注:數據集可以更換為自己的數據集

完整代碼:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import warnings
from torch.utils.data import DataLoader
from torchvision.datasets import ImageFolder
from torchvision.models import alexnet
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽# 檢查是否有可用的GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
#cuda顯卡warnings.filterwarnings("ignore")# 數據預處理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 加載訓練數據和測試數據
train_dataset = ImageFolder("dataset/train", transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)test_dataset = ImageFolder("dataset/test", transform=transform)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 定義AlexNet模型
class AlexNet(nn.Module):def __init__(self, num_classes=2):super(AlexNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(64, 192, kernel_size=5, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(192, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 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=3, stride=2),)self.avgpool = nn.AdaptiveAvgPool2d((6, 6))self.classifier = nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return xmodel = AlexNet()# 將模型移動到GPU上
model = model.to(device)# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)# 定義學習率調度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)# 訓練模型
epochs = 10  # 修改為您想要的訓練輪數
train_loss_list = []
train_acc_list = []
test_acc_list = []
for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()train_accuracy = correct / totaltrain_loss = running_loss / len(train_loader)train_loss_list.append(train_loss)train_acc_list.append(train_accuracy)# 測試模型correct = 0total = 0with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()test_accuracy = correct / totaltest_acc_list.append(test_accuracy)print("Epoch {} - Training loss: {:.4f} - Training accuracy: {:.4f} - Test accuracy: {:.4f}".format(epoch, train_loss, train_accuracy, test_accuracy))# 更新學習率scheduler.step()# 保存模型
torch.save(model.state_dict(), "alexnet.pth")# 加載預訓練的模型參數
model.load_state_dict(torch.load('alexnet.pth'))# 將模型移動到CPU上進行預測
model = model.to('cpu')examples = enumerate(test_loader)
_, (imgs, _) = next(examples)fig = plt.figure()
# for i in range(len(imgs)):
for i in range(20):img = imgs[i].numpy()img = img.transpose(1, 2, 0)img = (img + 1) / 2with torch.no_grad():output = model(torch.unsqueeze(imgs[i], 0))_, predicted = torch.max(output.data, 1)if predicted.item() == 0:pre_value = "狗"else:pre_value = "貓"plt.subplot(6, 5, i + 1)###########################plt.tight_layout()plt.imshow(img)plt.title("預測值: {}".format(pre_value))plt.xticks([])plt.yticks([])plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為“異常”努力是值得的

異常是OO語言處理錯誤的方式,在C中,鼓勵使用異常。侯捷再書中談起異常,“十年前撰寫“未將異常考慮在內的”函數是為一種美好實踐,而今我們致力于寫出“異常安全碼”。”可見異常安全的重要。 說起異常安全,首先就要是異常的出現…

Leetcode—213.打家劫舍II【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—213.打家劫舍II 算法思路 實現代碼 class Solution { public:// 左閉右開int rob1(vector<int>& nums, int start, int end) {int n nums.size();int f0 0, f1 0, new_f 0;for(int i start; i < end…

pytorch學習入門之 Variable(變量)

Variable(變量) autograd.Variable 是包的核心類. 它包裝了張量, 并且支持幾乎所有的操作. 一旦你完成了你的計算, 你就可以調用 .backward() 方法, 然后所有的梯度計算會自動進行. 你還可以通過 .data 屬性來訪問原始的張量, 而關于該 variable(變量)的梯度會被累計到 .…

初識 OpenCV

初識 OpenCV 簡介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個涵蓋了數百種計算機視覺算法的開源算法庫。 OpenCV 具有模塊化結構&#xff0c;這意味著該軟件包包含多個共享或靜態庫。其中包含以下模塊&#xff1a; Core functionality (core…

機器學習硬件十年:性能變遷與趨勢

本文分析了機器學習硬件性能的最新趨勢&#xff0c;重點關注不同GPU和加速器的計算性能、內存、互連帶寬、性價比和能效等指標。這篇分析旨在提供關于ML硬件能力及其瓶頸的全面視圖。本文作者來自調研機構Epoch&#xff0c;致力于研究AI發展軌跡與治理的關鍵問題和趨勢。 &…

【送書活動四期】被GitHub 要求強制開啟 2FA 雙重身份驗證,我該怎么辦?

記得是因為fork了OpenZeppelin/openzeppelin-contracts的項目&#xff0c;之后就被GitHub 要求強制開啟 2FA 雙重身份驗證了&#xff0c;一拖再拖&#xff0c;再過幾天帳戶操作將受到限制了&#xff0c;只能去搞一下了 目錄 2FA是什么為什么要開啟 2FA 驗證GitHub 欲在整個平臺…

消息隊列 - RabbitMQ

消息隊列 - RabbitMQ 1. 初識 MQ1.1 同步調用1.2 異步調用1.3.技術選型 2. RabbitMQ2.1 安裝2.2 收發信息2.2.1 交換機(Exchange)2.2.2 隊列2.2.3 綁定關系2.2.4 發送消息 2.3 數據隔離 1. 初識 MQ 微服務一旦拆分&#xff0c;必然涉及到服務之間的相互調用&#xff0c;之前講…

MySQL六 | 存儲引擎

目錄 存儲引擎 存儲引擎特點 存儲引擎選擇 Innodb與MyISAM區別 存儲引擎 默認存儲引擎:InnoDB show engines;#展示當前數據庫支持的存儲引擎 存儲引擎特點 特點InnoDBMyISAMMemory存儲限制64TB有有事務安全支持--鎖機制行鎖表鎖表鎖Btree鎖支持支持 支持 Hash索引--支…

編譯 Android gradle-4.6-all.zip 報錯問題記錄

編譯 Android gradle-4.6-all.zip 報錯問題記錄 方法一&#xff1a;替換資源&#xff1a;方法二&#xff1a;修改源方法三&#xff1a;修改版本 編譯時候無法下載 gradle-4.6-all Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip 方法一&#xf…

《一念關山》熱度破萬,愛奇藝古裝賽道出盡風頭

?劉詩詩重回古裝劇、新式武俠公路片、質感細膩的鏡頭美學......看點滿滿的《一念關山》頻頻登上熱搜&#xff0c;俘獲了大批觀眾的心。 開播首日熱度就刷新了愛奇藝2023年站內紀錄&#xff0c;《一念關山》作為2023年愛奇藝在古裝賽道的收官之作&#xff0c;口碑和熱度兼收。…

Linux內核-標準IO和系統IO的區別

概念 標準IO&#xff1a;指的是C語言實現的文件操作的函數 系統IO&#xff08;文件IO&#xff09;&#xff1a;指的是linux或windows或unix&#xff0c;實現文件操作的函數。 為什么要有兩種IO C語言要實現跨平臺&#xff0c;所以C語言在不同操作系統中實現文件操作方式是不一…

一文詳解Java反射

文章目錄 反射是什么&#xff1f;反射的作用所有方法匯總一、加載Class對象二、加載類的構造器對象三、加載類的成員變量四、加載類的成員方法 反射是什么&#xff1f; 反射就是&#xff1a;加載類&#xff0c;并允許以編程的方式解剖類中的某個成分&#xff08;成員變量&#…

實戰:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服務協同部署(包含解決瀏覽器訪問Linux部署服務器本地資源問題)

1. 背景 在該實戰中&#xff0c;我們將探討如何使用Docker Compose協同部署Nginx、Java、Mysql和Redis服務&#xff0c;實現一個視頻上傳與展示的應用。具體需求如下&#xff1a; Java應用負責上傳視頻和圖片資源到Nginx目錄下&#xff0c;作為資源服務器。Nginx服務作為靜態…

Numpy數組常用屬性匯總(第5講)

Numpy數組常用屬性匯總 (第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

【JavaEE進階】 Spring使用注解存儲對象

文章目錄 &#x1f334;序言&#x1f340;前置?作&#xff1a;配置掃描路徑&#x1f384;添加注解存儲 Bean 對象&#x1f333;類注解&#x1f6a9;為什么要這么多類注解&#x1f6a9;注解之間的聯系 &#x1f38b;?法注解 Bean&#x1f6a9;?法注解需要配合類注解使? ?總…

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能&#xff1b;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;國產GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能計算機&#xff1b;邊緣計算&#xff1b;大模型顯存占用&#xff1b;5G…

如何夸張孩子

你剛才很努力啊&#xff01;——表揚努力盡管艱難&#xff0c;但你一直沒有放棄——表揚耐心和堅持你做事情的態度非常不錯——表揚態度你在_____上進步了很多&#xff01;——表揚細節這個方法真有新意&#xff01;——表揚創意你和小伙伴合作得真棒&#xff01;——表揚合作精…

中國特供閹割版 RTX 4090 曝光,老黃這操作絕了

到了現在大伙兒應該發現&#xff1a;國內禁售 NVIDIA RTX 4090 顯卡這事兒基本實錘了。 實際上根據老美規定&#xff0c;從上個月 17 號開始&#xff0c;凡是公司主體在中國的顯卡品牌&#xff0c;就已經不能生產和銷售 RTX 4090。 以后廠商想要賣 4090 只能以整機形式出售&am…

藝術畫廊展廳網站制作的效果如何

藝術展廳往往有很多人前往&#xff0c;在主要城市有不少畫廊&#xff0c;對經營者來說&#xff0c;不同于銷售行業&#xff0c;其更多的是打造品牌吸引用戶前來或合作等形式&#xff0c;而由于行業特殊性&#xff0c;需要準屬性用戶才會前往。 因此在品牌打造及信息承載宣傳方…

防止企業敏感數據泄露

敏感數據泄露是指意外或故意泄露關鍵信息&#xff0c;例如個人身份信息&#xff08;PII&#xff09;、支付卡信息&#xff08;PCI&#xff09;、受保護的電子健康信息&#xff08;ePHI&#xff09;和知識產權&#xff08;IP&#xff09;&#xff0c;數據保護措施不足的組織會在…