AlexNet網絡搭建

AlexNet網絡模型搭建

環境準備

首先在某個盤符下創建一個文件夾,就叫AlexNet吧,用來存放源代碼。

然后新建一個python文件,就叫plot.py吧,往里面寫入以下代碼,用于下載數據集:

# FashionMNIST里面包含了許多數據集
from click.core import batch
from spacy.cli.train import train
from torchvision.datasets import FashionMNIST
from torchvision import transforms # 處理數據集,歸一化
import torch.utils.data as Data
import numpy as np
import matplotlib.pyplot as plt# 下載FashionMMIST數據集
train_data = FashionMNIST(root="./data", # 指定數據集要下載的路徑train=True,# 要訓練集# 將數據進行歸一化操作transform=transforms.Compose([transforms.Resize(size=224), # 調整數據的大小transforms.ToTensor() # 將數據轉換為tensor]),download=True # 開啟下載
)# 加載數據集集
train_loader = Data.DataLoader(dataset=train_data,# 要加載的數據集batch_size=64 ,# 批量數據大小shuffle=True, # 打亂數據順序num_workers=0, # 加載數據線程數量
)# 繪制出訓練集
for step,(b_x,b_y) in enumerate(train_loader):if step > 0:breakbatch_x = b_x.squeeze().numpy() # 將四維張量移除第一維,將數據轉換為numpy格式batch_y = b_y.numpy() # 將張量數據轉成numpy格式class_label = train_data.classes # 訓練集標簽
print("class_label,",class_label)# 繪圖
plt.figure(figsize=(12,5))
for ii in np.arange(len(batch_y)):plt.subplot(4,16,ii+1)plt.imshow(batch_x[ii, : , :],cmap=plt.cm.gray)plt.title(class_label[batch_y[ii]],size=10)plt.axis('off')plt.subplots_adjust(wspace=0.05)plt.show()

執行上述代碼后,就會開始下載所需要的數據集文件,只不過下載的速度比較慢,然后下載完成,項目的根目錄會多出data文件夾,以下是data的目錄結構:

--data--FashionMNIST--raw # 該文件夾下就存放數據集文件

搭建網絡模型

創建model.py文件,用于構建模型代碼。

import torch
from torch import nn  # nn層
from torchsummary import summary  # 查看網絡模型參數
import torch.nn.functional as F  # 用于dropout# 搭建模型
class AlexNet(nn.Module):def __init__(self):# 初始化網絡層super(AlexNet, self).__init__()self.ReLU = nn.ReLU()  # ReLU 激活函數# kernel_size=11 : 卷積核大小 11*11self.c1 = nn.Conv2d(in_channels=1, out_channels=96, kernel_size=11, stride=4)  # 第一層:卷積self.s2 = nn.MaxPool2d(kernel_size=3, stride=2)  # 第二層:最大池化層self.c3 = nn.Conv2d(in_channels=96, out_channels=256, kernel_size=5, padding=2)  # 第三層:卷積層self.s4 = nn.MaxPool2d(kernel_size=3, stride=2)  # 第四層:最大池化層self.c5 = nn.Conv2d(in_channels=256, out_channels=384, kernel_size=3, padding=1)  # 第五層:卷積層self.c6 = nn.Conv2d(in_channels=384, out_channels=384, kernel_size=3, padding=1)  # 第六層:卷積層self.c7 = nn.Conv2d(in_channels=384, out_channels=256, kernel_size=3, padding=1)  # 第七層:卷積層self.s8 = nn.MaxPool2d(kernel_size=3, stride=2)  # 第八層:最大池化層self.flatten = nn.Flatten()  # 第九層:平展層self.f1 = nn.Linear(6 * 6 * 256, 4096)  # 第十層:全連接層self.f2 = nn.Linear(4096, 4096)  # 第十一層:全連接層self.f3 = nn.Linear(4096, 10)  # 第十二層:全連接層# 前向傳播def forward(self, x):# 卷積完后,然后進行激活函數x = self.ReLU(self.c1(x))x = self.s2(x)x = self.ReLU(self.c3(x))x = self.s4(x)x = self.ReLU(self.c5(x))x = self.ReLU(self.c6(x))x = self.ReLU(self.c7(x))x = self.s8(x)x = self.flatten(x)  # 平展層x = self.ReLU(self.f1(x))  # 線性全連接層x = F.dropout(x, 0.5)x = self.ReLU(self.f2(x))x = F.dropout(x, 0.5)x = self.f3(x)  # 輸出層return x# 測試模型的搭建有沒有成功(僅測試)
if __name__ == "__main__":device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = AlexNet().to(device)print(summary(model, (1, 227, 227)))

模型訓練

創建一個model_train.py 文件

import copy
import timeimport torch
from torchvision.datasets import FashionMNIST
from torchvision import transforms
import torch.nn as nn
import torch.utils.data as Data
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltfrom model import AlexNet# 處理訓練集核數據集
def train_val_data_process():# 加載數據集train_data = FashionMNIST(root="./data",# 數據集所在路徑train=True, # 要訓練集# 將數據進行歸一化操作transform=transforms.Compose([transforms.Resize(size=227), # 修改數據的大小transforms.ToTensor() # 將數據轉成Tensor格式]),download=True # 開啟加載)# 隨機 劃分訓練集 和 驗證集train_data,val_data = Data.random_split(train_data, # 要劃分的數據集[round(0.8*len(train_data)), # 劃分80%給訓練集round(0.2*len(train_data)) # 劃分20%給驗證集])# 加載訓練集數據train_dataloader = Data.DataLoader(dataset=train_data,# 要加載的訓練集batch_size=32,# 每輪的訓練批次數shuffle=True,# 打亂數據順序num_workers=2,# 加載數據線程數量)# 加載驗證集數據val_dataloader = Data.DataLoader(dataset=val_data,# 要加載的驗證集batch_size=32,# 每輪的訓練批數shuffle=True,# 打亂數據順序num_workers=2,# 加載數據集的線程數量)return train_dataloader,val_dataloader# 模型訓練
def train_model_process(model,train_dataloader,val_dataloader,num_epochs):# model:需要訓練的模型,train_dataloader:訓練集數據,val_dataloader:驗證集數據,num_epochs:訓練輪數# 指定設備device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 定義優化器optimizer = torch.optim.Adam(model.parameters(),lr=0.001)# 定義交叉熵損失函數criterion = nn.CrossEntropyLoss()# 將模型放入到設備中進行訓練model.to(device)# 復制當前模型的參數best_model_wts = copy.deepcopy(model.state_dict())# 初始化參數,記錄模型的的精確度和損失值best_acc = 0.0 # 最高精確度train_loss_all = [] # 訓練集的總損失train_acc_all = [] # 訓練集的總精度val_loss_all = [] # 驗證集的總損失val_acc_all = [] # 驗證集的總精度since = time.time() # 記錄開始訓練的時間# 開始訓練模型 每輪參數for epoch in range(num_epochs):print("Epoch {}/{}".format(epoch,num_epochs-1))print("-"*10)# 初始化參數,記錄本輪的模型的損失之和精度train_loss = 0.0 # 訓練的損失train_corrects = 0  # 訓練的準確度val_loss = 0.0 # 驗證集的損失val_corrents = 0 # 驗證集的準確度train_num = 0 # 本輪訓練集的數量val_num = 0 # 本輪驗證集的數量# 取出每輪中的數據集進行訓練for step,(b_x,b_y) in enumerate(train_dataloader):b_x = b_x.to(device) # 將訓練集數據放入到設備當中b_y = b_y.to(device) # 將標簽數據放入到設備當中model.train() # 開啟模型訓練模式# 將每批次中的標簽數據放入到模型中,進行前向傳播output = model(b_x)# 查找每一行中最大值對應的行標,即預測值pre_lab = torch.argmax(output,dim=1)# 計算當前批次的損失值(模型的輸出,標簽)loss = criterion(output,b_y)# 每批次訓練完后,將梯度初始化成0optimizer.zero_grad()# 反向傳播計算loss.backward()# 更新參數optimizer.step()# 本批次損失值的累加train_loss += loss.item() * b_x.size(0)# 如果模型預測的結果正確,本批次的準確度+1train_corrects += torch.sum(pre_lab == b_y.data)# 本此次的訓練數據累加train_num += b_y.size(0)# 取出每輪中的數據進行驗證for step,(b_x,b_y) in enumerate(val_dataloader):# 將數據和標簽分別放入到設備中b_x = b_x.to(device)b_y = b_y.to(device)model.eval() # 設置模型為評估模式# 前向傳播,輸入一個批次,輸出該批次的對應的預測值output = model(b_x)# 查找每一行中最大值對應的行標,即預測值pre_lab = torch.argmax(output,dim=1)# 計算本此次的損失函數loss = criterion(output,b_y)# 本批次的損失函數累加val_loss += loss.item() * b_x.size(0)# 如果預測正確,那就本批次的精度度累加val_corrents += torch.sum(pre_lab==b_y.data)# 當前用于驗證的樣本數累加val_num += b_x.size(0)# 計算每輪次的損失值和準確率train_loss_all.append(train_loss / train_num) # 本輪訓練集的loss值train_acc_all.append(train_corrects.double().item() / train_num) # 本輪訓練集的準確率val_loss_all.append(val_loss / val_num) # 本輪驗證集的loss值val_acc_all.append(val_corrents.double().item() / val_num) # 本輪驗證集的準確率print("{} train loss:{:.4f} train acc: {:.4f}".format(epoch, train_loss_all[-1], train_acc_all[-1]))print("{} val loss:{:.4f} val acc: {:.4f}".format(epoch, val_loss_all[-1], val_acc_all[-1]))# 尋找最高準確度 和 模型的權重參數if val_acc_all[-1] > best_acc:best_acc = val_acc_all[-1] # 最高準確度best_model_wts = copy.deepcopy(model.state_dict()) # 最佳模型參數# 計算訓練耗時time_use = time.time() - sinceprint("訓練耗費的時間:{:.0f}m{:.0f}s".format(time_use//60,time_use%60))# 將最佳的模型參數保存torch.save(best_model_wts,"best_model.pth") # .pth是權重文件的后綴# 保存訓練好的模型參數train_process = pd.DataFrame(data={"epoch":range(num_epochs),"train_loss_all":train_loss_all,"train_acc_all":train_acc_all,"val_loss_all":val_loss_all,"val_acc_all":val_acc_all})return train_process# 定義繪圖的函數,繪制loss和準確度
def matplot_acc_loss(train_process):plt.figure(figsize=(12,4))# 繪制訓練集和驗證集的損失值圖像plt.subplot(1,2,1) # 一行兩列,第一列plt.plot(train_process['epoch'],train_process.train_loss_all,"ro-",label="train loss")plt.plot(train_process['epoch'],train_process.val_acc_all,"bs-",label="val loss")plt.legend() # 圖例plt.xlabel("epoch") # x軸標簽plt.ylabel("loss") # y軸標簽# 繪制訓練集和驗證集的準確度圖像plt.subplot(1,2,2) # 一行兩列,第二列plt.plot(train_process['epoch'],train_process.val_loss_all,"ro-",label="train acc")plt.plot(train_process['epoch'],train_process.val_acc_all,"bs-",label="va acc")if __name__ == '__main__':# 實例化自定義模型類model = AlexNet()# 加載數據集train_dataloader,val_dataloader = train_val_data_process()# 訓練模型train_process = train_model_process(model,train_dataloader,val_dataloader,20)# 繪制圖像matplot_acc_loss(train_process)

模型測試

創建一個model_test.py文件,用于模型的測試

import torch
import torch.utils.data as Data
from numpy.random import shuffle
from torchvision import transforms
from torchvision.datasets import FashionMNISTfrom model import AlexNet# 加載要訓練的數據
def test_data_process():# 加載測試集數據test_data = FashionMNIST(root="./data",# 指定數據集要下載的路徑train=False,# 不要訓練集數據# 數據歸一化操作transform=transforms.Compose([transforms.Resize(size=227), # 將數據轉成227*227大小transforms.ToTensor(),# 將數據轉成Tensor格式]),download=True # 加載數據)# 通過DataLoader加載器 來加載數據test_dataloader = Data.DataLoader(dataset=test_data,# 要加載的數據batch_size=1, # 每輪訓練的批次數shuffle=True, # 打亂數據集num_workers=0, # 加載數據集的線程數量)return test_dataloader# 測試模型
def test_model_process(model,test_dataloader):# 指定設備device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 將模型放入設備中model.to(device)# 初始化模型訓練的每輪參數test_correct = 0.0 # 準確度test_num = 0 # 測試樣本數量# 只進行前向傳播with torch.no_grad(): # 將梯度設置為0for test_data_x,test_data_y in enumerate(test_dataloader): # 遍歷每輪次# 由于上面設置批次為1,所以這里就不需要循環批次了test_data_x = test_data_x.to(device) # 將測試數據放入到設備中test_data_y = test_data_y.to(device) # 將標簽數據放入到設備中# 模型切換成評估模式model.eval()# 前向傳播 將測試數據放入到模型中output = model(test_data_x)# 查找每一行中最大值的行標pre_lab = torch.argmax(output,dim=1)# 模型預測的結果 將pre_lab 與 標簽數據 進行比較# 如果預測正確,則加1test_correct += torch.sum(pre_lab==test_data_y.data)# 測試樣本數量累加test_num += test_data_y.size(0)# 計算最終測試的準確率 每輪的準確度 / 總樣本數量test_acc = test_correct.double().item() / test_numprint("測試模型的準確率為:",test_acc)if __name__ == '__main__':# 加載模型model = AlexNet()# 加載訓練好的模型最佳參數model.load_state_dict(torch.load('best_model.pth'))# 加載測試的數據集test_dataloader = test_data_process()# 開始訓練# test_model_process(model, test_dataloader)# 模型具體的訓練過程device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 將模型放入到設備當中model = model.to(device)# 數據的類別classes = ('T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot')# 梯度設置為0with torch.no_grad():# 遍歷測試集中的 測試數據 和 標簽for b_x,b_y in test_dataloader:# 將模型設置為評估模式model.eval()# 將數據放入到模型中,得出預測結果output = model(b_x)# 獲取最大值的行標pre_lab = torch.argmax(output,dim=1)# 取出張量中的下標result = pre_lab.item()label = b_y.item()print("預測結果為:",classes[result],"標簽為:",classes[label])

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

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

相關文章

【計算機網絡】網絡基礎概念

📚 博主的專欄 🐧 Linux | 🖥? C | 📊 數據結構 | 💡C 算法 | 🅒 C 語言 | 🌐 計算機網絡 這是博主計算機網絡的第一篇文章,本文由于是基礎概念了解,引用了大…

在Spring Boot項目中實現Word轉PDF并預覽

在Spring Boot項目中實現Word轉PDF并進行前端網頁預覽,你可以使用Apache POI來讀取Word文件,iText或Apache PDFBox來生成PDF文件,然后通過Spring Boot控制器提供文件下載或預覽鏈接。以下是一個示例實現步驟和代碼: 1. 添加依賴 …

圖解 Redis 事務 ACID特性 |源碼解析|EXEC、WATCH、QUEUE

寫在前面 Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務功能。Redis的事務是將多個命令請求打包,然后一次性、按照順序的執行多個命令的機制,并且在事務執行期間,服務器不會中斷事務而該去執行其他客戶端的命令請求。 就像下面這樣&#…

LeetCode --- 446 周賽

題目列表 3522. 執行指令后的得分 3523. 非遞減數組的最大長度 3524. 求出數組的 X 值 I 3525. 求出數組的 X 值 II 一、執行指令后的得分 照著題目要求進行模擬即可&#xff0c;代碼如下 // C class Solution { public:long long calculateScore(vector<string>&…

山東大學軟件學院項目實訓-基于大模型的模擬面試系統-前端美化滾動條問題

模擬面試界面左側底部 通過檢查工具定位到其所在的位置&#xff1a; 直接對該組件進行美化&#xff1a; <!-- AI面試官列表 --><div class"ai-interviewer-section" v-show"activeTab interviewer"><el-scrollbar class"no-horizont…

git版本回退 | 遠程倉庫的回退 (附實戰Demo)

目錄 前言1. 基本知識2. Demo3. 彩蛋 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器&#xff0c;無代碼爬取&#xff0c;就來&#xff1a;bright.cn 本身暫存區有多個文件&#xff0c;但手快了&…

什么事Nginx,及使用Nginx部署vue項目(非服務器Nginx壓縮包版)

什么是 Nginx? Nginx(發音為 “engine-x”)是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。它以其高性能、高并發處理能力和低資源消耗而聞名。以下是 Nginx 的主要特性和用途: 主要特性 高性能和高并發 Nginx 能夠處理大量并發連接,適合高…

第十六周藍橋杯2025網絡安全賽道

因為只會web&#xff0c;其他方向都沒碰過&#xff0c;所以只出了4道 做出來的&#xff1a; ezEvtx 找到一個被移動的文件&#xff0c;疑似被入侵 提交flag{confidential.docx}成功解出 flag{confidential.docx} Flowzip 過濾器搜索flag找到flag flag{c6db63e6-6459-4e75-…

高性能的開源網絡入侵檢測和防御引擎:Suricata介紹

一、Debian下使用Suricata 相較于Windows&#xff0c;Linux環境對Suricata的支持更加完善&#xff0c;操作也更為便捷。 1. 安裝 Suricata 在Debian系統上&#xff0c;你可以通過包管理器 apt 輕松安裝 Suricata。 更新軟件包列表: sudo apt update安裝 Suricata: sudo apt …

IP-address-space

導航 (返回頂部) 1. IPv4地址分配表 1.2 IPv4 專用地址注冊表1.3 各國IPv4地址分配列表 2. IPv6地址分配表 2.1 IANA IPv6 專用地址注冊表2.2 IPv6 多播地址分配 1. IPv4地址分配表1.2 IPv4 專用地址注冊表1.3 各國IPv4地址分配列表 2. IPv6地址分配表2.1 IANA IPv6 專用地址…

Ubuntu使用war包部署Jenkins并通過systemcl管理

目錄 一、當前系統環境 二、安裝Java 二、安裝Jenkins 三、使用systemctl管理 一、當前系統環境 操作系統&#xff1a;ubuntu 24.04 Jenkins版本&#xff1a;2.506 格式&#xff1a;war JDK版本&#xff1a;OpenJDK_17 二、安裝Java 1.下載jdk安裝包 # wget下載 wget …

牛客 verilog入門 VIP

1、輸出1 答案&#xff1a; timescale 1ns/1nsmodule top_module(output wire one );assign one 1b1; endmodule 2、wire連線 答案&#xff1a; timescale 1ns/1nsmodule wire0(input wire in0,output wire out1 );assign out1 in0; endmodule 3、多wire連線 timescale 1…

簡易版2D我的世界C++程序(有點BUG,但是可以玩!!!)

1、按空格鍵來切換模式&#xff08;挖掘模式和放置模式&#xff09;&#xff0c;一律用鼠標右鍵來操作&#xff01;&#xff01;&#xff01; 2、按數字1和2鍵來切換放置的方塊&#xff08;1是草&#xff0c;2是木&#xff09;&#xff0c;樹葉不能放置&#xff01;&#xff01…

ubuntu使用dify源碼安裝部署教程+避坑指南

很多人,包括我在最初使用dify的時候都習慣使用docker來部署安裝環境,但在二次開發使用過程中,我們可能希望使用源碼來安裝,那么這篇文章我將給大家分享如何在ubuntu系統下使用源碼安裝,并提供大家遇到的疑難雜癥如下: dify安裝使用過程中報錯:/console/api/workspaces/…

java知識體系結構導航

很全&#xff1a;java知識體系結構 個人筆記鏈接 開發工具IDEA IDEA 插件推薦清單 IDEA快捷鍵大全 Java基礎難點 基礎知識_java動態代理 基礎知識_java反射機制 基礎知識-java流steam 基礎知識-java集合collection Spring 01.Spring 框架的演化&#xff1a;從 XML 配置到…

RabbitMQ 的專業術語

術語定義示例/說明生產者&#xff08;Producer&#xff09;發送消息到 RabbitMQ 的客戶端應用程序。日志系統將錯誤信息發送到 RabbitMQ。消費者&#xff08;Consumer&#xff09;從 RabbitMQ 隊列中接收并處理消息的客戶端應用程序。一個訂單處理服務從隊列中讀取消息并更新數…

mac安裝vm虛擬機安裝包

因為mac安裝虛擬機時&#xff0c;發現下載過程變得不太一樣&#xff0c;會比較麻煩。所以決定發一下我已經下載的安裝包&#xff0c;個人用戶使用免費&#xff0c;商業版請自行去官網下載&#xff01; 百度網盤下載鏈接 百度網盤 請輸入提取碼 提取碼:d4rc

LLama Factory從入門到放棄

目錄 簡介 安裝 LLama Factory界面介紹 數據格式要求 微調訓練 今天在這里介紹一種常用的大模型微調框架——LLama Factory。 簡介 LLama Factory 是一個高效的界面化大語言模型微調工具庫&#xff0c;支持多種參數高效微調技術&#xff0c;提供簡潔接口和豐富示例&#…

如何借助全球動態IP實現多平臺賬號的批量注冊?

無論是社交網絡、在線購物平臺還是專業應用軟件&#xff0c;賬號的創建和使用都是必不可少的。然而&#xff0c;在面對不同平臺各自的注冊限制和策略時&#xff0c;如何高效、安全且合法地進行賬號批量注冊成為了亟待解決的問題。本文將探討全球動態IP在這一過程中的作用及其如…

django admin 添加自定義頁面

在Django中&#xff0c;你可以通過多種方式向Django Admin添加自定義頁面。以下是一些常見的方法&#xff1a; 方法1&#xff1a;使用ModelAdmin的get_urls()方法 如果你只是想添加一個簡單的頁面來展示信息&#xff0c;你可以在你的ModelAdmin類中重寫get_urls()方法。 from…