day41 python圖像識別任務

目錄

一、數據預處理:為模型打下堅實基礎

二、模型構建:多層感知機的實現

三、訓練過程:迭代優化與性能評估

四、測試結果:模型性能的最終檢驗

五、總結與展望


在深度學習的旅程中,多層感知機(MLP)作為最基礎的神經網絡結構,是每位初學者的必經之路。最近,我通過實現和訓練MLP模型,對圖像識別任務有了更深入的理解。本文將從數據預處理、模型構建、訓練過程到最終的測試結果,詳細記錄我的學習過程,并總結MLP在圖像識別任務中的優勢與局限。

一、數據預處理:為模型打下堅實基礎

在任何機器學習任務中,數據預處理都是至關重要的第一步。對于圖像數據,我們需要將其轉換為適合模型處理的格式。以MNIST手寫數字數據集為例,我使用了torchvision.transforms庫對圖像進行了標準化處理:

transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST數據集的均值和標準差
])

通過ToTensor()操作,圖像被轉換為張量格式,并且像素值被歸一化到[0,1]區間。Normalize()操作則進一步對圖像進行標準化,使其均值為0,標準差為1。這有助于加速模型的收斂。

對于彩色圖像數據集(如CIFAR-10),處理方式類似,只是需要對每個通道分別進行標準化:

transform = transforms.Compose([transforms.ToTensor(),                transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 標準化處理
])

數據加載器DataLoader的使用也非常關鍵,它能夠高效地批量加載數據,并支持多線程加速數據讀取:

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

通過設置shuffle=True,訓練數據會在每個epoch開始時被打亂,這有助于模型更好地泛化。

二、模型構建:多層感知機的實現

多層感知機(MLP)是一種經典的神經網絡結構,由多個全連接層組成。在MNIST數據集上,我構建了一個簡單的MLP模型:

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 將28x28的圖像展平為784維向量self.layer1 = nn.Linear(784, 128)  # 第一層:784個輸入,128個神經元self.relu = nn.ReLU()  # 激活函數self.layer2 = nn.Linear(128, 10)  # 第二層:128個輸入,10個輸出(對應10個數字類別)def forward(self, x):x = self.flatten(x)  # 展平圖像x = self.layer1(x)   # 第一層線性變換x = self.relu(x)     # 應用ReLU激活函數x = self.layer2(x)   # 第二層線性變換,輸出logitsreturn x

在CIFAR-10數據集上,我將模型進行了擴展,增加了層數和神經元數量,并引入了Dropout來防止過擬合:

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 將3x32x32的圖像展平為3072維向量self.layer1 = nn.Linear(3072, 512)  # 第一層:3072個輸入,512個神經元self.relu1 = nn.ReLU()self.dropout1 = nn.Dropout(0.2)  # 添加Dropout防止過擬合self.layer2 = nn.Linear(512, 256)  # 第二層:512個輸入,256個神經元self.relu2 = nn.ReLU()self.dropout2 = nn.Dropout(0.2)self.layer3 = nn.Linear(256, 10)  # 輸出層:10個類別def forward(self, x):x = self.flatten(x)  # 輸入尺寸: [batch_size, 3, 32, 32] → [batch_size, 3072]x = self.layer1(x)   # 線性變換: [batch_size, 3072] → [batch_size, 512]x = self.relu1(x)    # 應用ReLU激活函數x = self.dropout1(x) # 訓練時隨機丟棄部分神經元輸出x = self.layer2(x)   # 線性變換: [batch_size, 512] → [batch_size, 256]x = self.relu2(x)    # 應用ReLU激活函數x = self.dropout2(x) # 訓練時隨機丟棄部分神經元輸出x = self.layer3(x)   # 線性變換: [batch_size, 256] → [batch_size, 10]return x  # 返回未經過Softmax的logits

Dropout是一種有效的正則化技術,它在訓練階段隨機丟棄部分神經元的輸出,從而防止模型對訓練數據過度擬合。

三、訓練過程:迭代優化與性能評估

訓練過程是模型學習數據特征的關鍵階段。我使用了Adam優化器和交叉熵損失函數,這是分類任務中常用的組合:

criterion = nn.CrossEntropyLoss()  # 交叉熵損失函數,適用于多分類問題
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam優化器

在訓練過程中,我記錄了每個iteration的損失,并繪制了損失曲線,以便直觀地觀察模型的收斂情況:

def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 設置為訓練模式all_iter_losses = []  # 存儲所有 batch 的損失iter_indices = []     # 存儲 iteration 序號for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)  # 移至GPUoptimizer.zero_grad()  # 梯度清零output = model(data)  # 前向傳播loss = criterion(output, target)  # 計算損失loss.backward()  # 反向傳播optimizer.step()  # 更新參數iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單Batch損失: {iter_loss:.4f} | 累計平均損失: {running_loss/(batch_idx+1):.4f}')epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalepoch_test_loss, epoch_test_acc = test(model, test_loader, criterion, device)print(f'Epoch {epoch+1}/{epochs} 完成 | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_acc

通過每100個批次打印一次訓練信息,我可以實時監控模型的訓練進度。同時,每個epoch結束后,我會對模型進行測試,評估其在測試集上的性能。

四、測試結果:模型性能的最終檢驗

經過多次實驗,我發現在MNIST數據集上,MLP模型能夠達到較高的準確率(約96.75%)。然而,在更具挑戰性的CIFAR-10數據集上,即使增加了模型的深度和訓練輪次,最終測試準確率也僅能達到約52.40%。這表明MLP在處理復雜圖像數據時存在明顯的局限性。

五、總結與展望

通過這次學習,我深刻認識到MLP在圖像識別任務中的優勢與不足。MLP結構簡單,易于理解和實現,但在處理圖像數據時,它無法有效利用圖像的空間結構信息,導致在復雜任務上性能受限。此外,深層MLP的參數規模呈指數級增長,容易過擬合,訓練成本也較高。未來,我將深入學習卷積神經網絡(CNN),它專門針對圖像數據設計,能夠自動提取圖像的空間特征,具有更少的參數和更快的訓練速度,是解決圖像識別問題的更優選擇。

@浙大疏錦行

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

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

相關文章

JS數組 concat() 與擴展運算符的深度解析與最佳實踐

文章目錄 前言一、語法對比1. Array.prototype.concat()2. 擴展運算符(解構賦值) 二、性能差異(大規模數組)關鍵差異原因 三、適用場景建議總結 前言 最近工作中遇到了一個大規模數組合并相關的問題,在數據合并時有些…

一套qt c++的串口通信

實現了創建線程使用串口的功能 具備功能: 1.線程使用串口 2.定時發送隊列內容,防止粘包 3.沒處理接收粘包,根據你的需求來,handleReadyRead函數中,可以通過m_receiveBuffer來緩存接收,然后拆分數據來處理 源碼 seri…

設計模式-發布訂閱

文章目錄 發布訂閱概念發布訂閱 vs 監聽者例子代碼 發布訂閱概念 發布/訂閱者模式最大的特點就是實現了松耦合,也就是說你可以讓發布者發布消息、訂閱者接受消息,而不是尋找一種方式把兩個分離 的系統連接在一起。當然這種松耦合也是發布/訂閱者模式最大…

windows-cmd 如何查詢cpu、內存、磁盤的使用情況

在 Windows 中,您可以使用命令提示符(CMD)通過一些命令來查詢 CPU、內存和磁盤的使用情況。以下是常用的命令和方法: 1. 查詢 CPU 使用情況 使用 wmic 命令 wmic cpu get loadpercentage 這個命令會顯示當前 CPU 的使用百分比…

allWebPlugin中間件VLC專用版之截圖功能介紹

背景 VLC控件原有接口具有視頻截圖方法,即video對象的takeSnapshot方法,但是該方法返回的是一個IPicture對象,不適合在谷歌等現代瀏覽器上使用。因此,本人增加一個新的視頻截圖方法takeSnapshot2B64方法,直接將視頻截圖…

第Y5周:yolo.py文件解讀

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 本次任務:將YOLOv5s網絡模型中的C3模塊按照下圖方式修改形成C2模塊,并將C2模塊插入第2層與第3層之間,且跑通YOLOv5s。 任務…

寶塔安裝ssh證書報錯:/usr/bin/curl: symbol lookup error: curl_easy_header

原因: 你當前的 curl 命令版本是 7.70.0(不是系統默認版本,應該是你手動安裝的)。它鏈接的是 /usr/local/lib/libcurl.so.4,而不是 CentOS 系統默認的 /usr/lib64/libcurl.so.4。/usr/local/lib/libcurl.so.4 很可能是…

Apache SeaTunnel 引擎深度解析:原理、技術與高效實踐

Apache SeaTunnel 作為新一代高性能分布式數據集成平臺,其核心引擎設計融合了現代大數據處理架構的精髓。 Apache SeaTunnel引擎通過分布式架構革新、精細化資源控制及企業級可靠性設計,顯著提升了數據集成管道的執行效率與運維體驗。其模塊化設計允許用…

測試用例及黑盒測試方法

一、測試用例 1.1 基本要素 測試用例(Test Case)是為了實施測試而向被測試的系統提供的一組集合,這組集合包含:測試環境、操作步驟、測試數據、預期結果等4個主要要素。 1.1.1 測試環境 定義:測試執行所需的軟硬件…

硬件工程師筆記——運算放大電路Multisim電路仿真實驗匯總

目錄 1 運算放大電路基礎 1.1 概述 1.1.1 基本結構 1.1.2 理想特性 1.2 運算放大分析方法 1.2.1 虛短 1.2.2虛斷 1.2.3 疊加定理 2 同向比例運算放大電路 2.1 概述 2.1.1 基本電路結構 2.1.2 電路原理 2.2 仿真分析 2.2.1 電壓增益 2.2.2 相位分析 3 反向比例運…

板凳-------Mysql cookbook學習 (九)

第4章:表管理 4.0 引言 MySQL :: 員工樣例數據庫 :: 3 安裝 https://dev.mysql.com/doc/employee/en/employees-installation.html Employees 數據庫與幾種不同的 存儲引擎,默認情況下啟用 InnoDB 引擎。編…

MySQL省市區數據表

數據結構簡單展示一下 具體的可以點擊文章最后的鏈接地址下載 連接地址中有兩個文件一個是詳細的另一個是簡潔的 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for ln_new_region -- ---------------------------- DROP…

無人機報警器探測模塊技術解析!

一、運行方式 1. 頻譜監測與信號識別 全頻段掃描:模塊實時掃描900MHz、1.5GHz、2.4GHz、5.8GHz等無人機常用頻段,覆蓋遙控、圖傳及GPS導航信號。 多路分集技術:采用多傳感器陣列,通過信號加權合并提升信噪比,…

Oracle 導入導出 dmp 數據文件實戰

一、DMP文件基礎知識?? 1. ??DMP文件定義?? DMP(Data Pump Dump File)是Oracle數據庫專用的二進制格式文件,由expdp/impdp或舊版exp/imp工具生成。它包含數據庫對象的元數據(表結構、索引等)和實際數據&#x…

Coursier:安裝sbt

命令 ./cs launch sbt -- --version 的含義是??通過 Coursier(cs)工具啟動 SBT(Scala 構建工具),并查詢其版本信息??。具體解析如下: ??1. 命令結構解析?? ??./cs??: 這是 Coursie…

【深度學習】12. VIT與GPT 模型與語言生成:從 GPT-1 到 GPT4

VIT與GPT 模型與語言生成:從 GPT-1 到 GPT4 本教程將介紹 GPT 系列模型的發展歷程、結構原理、訓練方式以及人類反饋強化學習(RLHF)對生成對齊的改進。內容涵蓋 GPT-1、GPT-2、GPT-3、GPT-3.5(InstructGPT)、ChatGPT …

項目更改權限后都被git標記為改變,怎么去除

?問題描述: 當你修改了項目中的文件權限(如使用 chmod 改了可執行權限),Git 會把這些文件標記為“已更改”,即使內容并沒有發生任何改變。 ? 解決方法: ? 方法一:告訴 Git 忽略權限變化&am…

openfeignFeign 客戶端禁用 SSL

要針對特定的 Feign 客戶端禁用 SSL 驗證,可以通過自定義配置類實現。以下是完整解決方案: 1. 創建自定義配置類(禁用 SSL 驗證) import feign.Client; import feign.httpclient.ApacheHttpClient; import org.apache.http.conn…

移動端 UI自動化測試學習之Appium框架(包含adb調試工具介紹)

文章目錄 前言adb調試工具adb組成常用命令獲取程序的包名和界面名文件傳輸發送文件到手機從手機中拉取文件 獲取app啟動時間獲取手機日志其他命令 Appium 簡介工作原理圖 環境搭建安裝客戶端庫(appium lib)安裝Appium Server安裝JDK(自行下載…

【論文解讀】DETR: 用Transformer實現真正的End2End目標檢測

1st authors: About me - Nicolas Carion?Francisco Massa? - ?Google Scholar? paper: [2005.12872] End-to-End Object Detection with Transformers ECCV 2020 code: facebookresearch/detr: End-to-End Object Detection with Transformers 1. 背景 目標檢測&#…