小白的進階之路系列之三----人工智能從初步到精通pytorch計算機視覺詳解下

我們將繼續計算機視覺內容的講解。

我們已經知道了計算機視覺,用在什么地方,如何用Pytorch來處理數據,設定一些基礎的設置以及模型。下面,我們將要解釋剩下的部分,包括以下內容:

主題內容
Model 1 :加入非線性實驗是機器學習的很大一部分,讓我們嘗試通過添加非線性層來改進我們的基線模型。
Model 2:卷積神經網絡(CNN)是時候讓計算機視覺具體化,并介紹強大的卷積神經網絡架構。
比較我們的模型我們已經建立了三種不同的模型,讓我們來比較一下。
評估我們的最佳模型讓我們對隨機圖像做一些預測,并評估我們的最佳模型。
制作混淆矩陣混淆矩陣是評估分類模型的好方法,讓我們看看如何制作一個。
保存和載入最佳性能模型由于我們可能希望稍后使用我們的模型,讓我們保存它并確保它正確地加載回來。

下面開始正文:

6 Model 1:建立一個更好的非線性模型

我們在第二篇文章里學過非線性的力量。

看看我們一直在處理的數據,你認為它需要非線性函數嗎?

記住,線性意味著直線,非線性意味著非直線。

讓我們來看看。

我們將通過重新創建與之前類似的模型來實現這一點,只不過這次我們將在每個線性層之間放置非線性函數(nn.ReLU())。

# Create a model with non-linear and linear layers
class FashionMNISTModelV1(nn.Module):def __init__(self, input_shape: int, hidden_units: int, output_shape: int):super().__init__()self.layer_stack = nn.Sequential(nn.Flatten(), # flatten inputs into single vectornn.Linear(in_features=input_shape, out_features=hidden_units),nn.ReLU(),nn.Linear(in_features=hidden_units, out_features=output_shape),nn.ReLU())def forward(self, x: torch.Tensor):return self.layer_stack(x)

看起來不錯。

現在讓我們用之前使用的相同設置實例化它。

我們需要input_shape=784(等于圖像數據的特征數量),hidden_units=10(開始時較小,與基線模型相同)和output_shape=len(class_names)(每個類一個輸出單元)。

[!TIP]

注意:注意我們如何保持我們的模型的大部分設置相同,除了一個變化:添加非線性層。這是運行一系列機器學習實驗的標準做法,改變一件事,看看會發生什么,然后再做一次,一次,一次。

torch.manual_seed(42)
model_1 = FashionMNISTModelV1(input_shape=784, # number of input featureshidden_units=10,output_shape=len(class_names) # number of output classes desired
).to(device) # send model to GPU if it's available
print(next(model_1.parameters()).device) # check model device      )

輸出為:

cuda:0

6.1設置損耗、優化器和評估指標

像往常一樣,我們將設置一個損失函數、一個優化器和一個評估指標(我們可以設置多個評估指標,但現在我們將堅持準確性)。

from helper_functions import accuracy_fn
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(params=model_1.parameters(), lr=0.1)

6.2訓練和測試回路的功能化

到目前為止,我們已經一遍又一遍地編寫train和test循環。

我們再寫一遍,但是這次我們把它們放在函數里,這樣它們就可以被反復調用了。

因為我們現在使用的是與設備無關的代碼,我們將確保在特征(X)和目標(y)張量上調用.to(device)。

對于訓練循環,我們將創建一個名為train_step()的函數,它接受一個模型、一個數據加載器(DataLoader)、一個損失函數和一個優化器。

測試循環將是類似的,但它將被稱為test_step(),它將接受一個模型、一個DataLoader、一個損失函數和一個求值函數。

[!TIP]

注意:由于這些都是函數,您可以以任何喜歡的方式自定義它們。我們在這里所做的可以看作是針對我們的特定分類用例的基本訓練和測試功能。

def train_step(model: torch.nn.Module,data_loader: torch.utils.data.DataLoader,loss_fn: torch.nn.Module,optimizer: torch.optim.Optimizer,accuracy_fn,device: torch.device = device):train_loss, train_acc = 0, 0model.to(device)for batch, (X, y) in enumerate(data_loader):# Send data to GPUX, y = X.to(device), y.to(device)# 1. Forward passy_pred = model(X)# 2. Calculate lossloss = loss_fn(y_pred, y)train_loss += losstrain_acc += accuracy_fn(y_true=y,y_pred=y_pred.argmax(dim=1)) # Go from logits -> pred labels# 3. Optimizer zero gradoptimizer.zero_grad()# 4. Loss backwardloss.backward()# 5. Optimizer stepoptimizer.step()# Calculate loss and accuracy per epoch and print out what's happeningtrain_loss /= len(data_loader)train_acc /= len(data_loader)print(f"Train loss: {train_loss:.5f} | Train accuracy: {train_acc:.2f}%")def test_step(data_loader: torch.utils.data.DataLoader,model: torch.nn.Module,loss_fn: torch.nn.Module,accuracy_fn,device: torch.device = device):test_loss, test_acc = 0, 0model.to(device)model.eval() # put model in eval mode# Turn on inference context managerwith torch.inference_mode(): for X, y in data_loader:# Send data to GPUX, y = X.to(device), y.to(device)# 1. Forward passtest_pred = model(X)# 2. Calculate loss and accuracytest_loss += loss_fn(test_pred, y)test_acc += accuracy_fn(y_true=y,y_pred=test_pred.argmax(dim=1) # Go from logits -> pred labels)# Adjust metrics and print outtest_loss /= len(data_loader)test_acc /= len(data_loader)print(f"Test loss: {test_loss:.5f} | Test accuracy: {test_acc:.2f}%\n")

哦吼!

現在我們有了一些用于訓練和測試模型的函數,讓我們運行它們。

我們將在每個epoch的另一個循環中這樣做。

這樣,對于每個epoch,我們都要經歷一個訓練步驟和一個測試步驟。

[!TIP]

注意:您可以自定義執行測試步驟的頻率。有時人們每隔5個時期或10個時期做一次,在我們的例子中,每個時期做一次。

我們還可以計時,看看代碼在GPU上運行需要多長時間。

# Import tqdm for progress bar
from tqdm.auto import tqdmtorch.manual_seed(42)# Measure time
from timeit import default_timer as timer
train_time_start_on_gpu = timer()epochs = 3
for epoch in tqdm(range(epochs)):print(f"Epoch: {epoch}\n---------")train_step(data_loader=train_dataloader, model=model_1, loss_fn=loss_fn,optimizer=optimizer,accuracy_fn=accuracy_fn)test_step(data_loader=test_dataloader,model=model_1,loss_fn=loss_fn,accuracy_fn=accuracy_fn)train_time_end_on_gpu = timer()
total_train_time_model_1 = print_train_time(start=train_time_start_on_gpu,end=train_time_end_on_gpu,device=device)

輸出為:

  0%|                                                                                            | 0/3 [00:00<?, ?it/s]Epoch: 0
---------
Train loss: 1.09199 | Train accuracy: 61.34%
Test loss: 0.95636 | Test accuracy: 65.00%33%|████████████████████████████                                                        | 1/3 [00:05<00:11,  5.79s/it]Epoch: 1
---------
Train loss: 0.78101 | Train accuracy: 71.93%
Test loss: 0.72227 | Test accuracy: 73.91%67%|████████████████████████████████████████████████████████                            | 2/3 [00:12<00:06,  6.26s/it]Epoch: 2
---------
Train loss: 0.67027 | Train accuracy: 75.94%
Test loss: 0.68500 | Test accuracy: 75.02%100%|████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:19<00:00,  6.39s/it]
Train time on cuda: 19.161 seconds

太好了!

我們的模型訓練了,但是訓練時間更長?

[!TIP]

注意:CUDA vs CPU的訓練時間很大程度上取決于你使用的CPU/GPU的質量。請繼續閱讀,以獲得更詳細的答案。

問題:“我用了GPU,但我的模型訓練得并不快,這是為什么呢?”

答:嗯,一個原因可能是因為你的數據集和模型都很小(就像我們正在使用的數據集和模型),使用GPU的好處被實際傳輸數據所需的時間所抵消。

在將數據從CPU內存(默認)復制到GPU內存之間存在一個小瓶頸。

因此,對于較小的模型和數據集,CPU實際上可能是進行計算的最佳位置。

但對于更大的數據集和模型,GPU提供的計算速度通常遠遠超過獲取數據的成本。

然而,這在很大程度上取決于您使用的硬件。通過練習,您將習慣訓練模型的最佳地點。

讓我們使用eval_model()函數對訓練好的model_1求值,看看結果如何。

# Note: This will error due to `eval_model()` not using device agnostic code 
model_1_results = eval_model(model=model_1, data_loader=test_dataloader,loss_fn=loss_fn, accuracy_fn=accuracy_fn) 
print(model_1_results )

輸出為:

...
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat1 in method wrapper_CUDA_addmm)

噢,不!

看起來我們的eval_model()函數出錯了:

RuntimeError:期望所有張量都在同一設備上,但發現至少有兩個設備,cuda:0和cpu!(當檢查wrapper_addmm方法中參數mat1的參數時)

這是因為我們已經將數據和模型設置為使用與設備無關的代碼,而不是我們的求值函數。

我們通過將目標設備參數傳遞給eval_model()函數來解決這個問題怎么樣?

然后我們再試著計算結果。

# Move values to device
torch.manual_seed(42)
def eval_model(model: torch.nn.Module, data_loader: torch.utils.data.DataLoader, loss_fn: torch.nn.Module, accuracy_fn, device: torch.device = device):"""Evaluates a given model on a given dataset.Args:model (torch.nn.Module): A PyTorch model capable of making predictions on data_loader.data_loader (torch.utils.data.DataLoader): The target dataset to predict on.loss_fn (torch.nn.Module): The loss function of model.accuracy_fn: An accuracy function to compare the models predictions to the truth labels.device (str, optional): Target device to compute on. Defaults to device.Returns:(dict): Results of model making predictions on data_loader."""loss, acc = 0, 0model.eval()with torch.inference_mode():for X, y in data_loader:# Send data to the target deviceX, y = X.to(device), y.to(device)y_pred = model(X)loss += loss_fn(y_pred, y)acc += accuracy_fn(y_true=y, y_pred=y_pred.argmax(dim=1))# Scale loss and accloss /= len(data_loader)acc /= len(data_loader)return {"model_name": model.__class__.__name__, # only works when model was created with a class"model_loss": loss.item(),"model_acc": acc}# Calculate model 1 results with device-agnostic code 
model_1_results = eval_model(model=model_1, data_loader=test_dataloader,loss_fn=loss_fn, accuracy_fn=accuracy_fn,device=device
)
print(model_1_results)

輸出為:

{'model_name': 'FashionMNISTModelV1', 'model_loss': 2.302107095718384, 'model_acc': 10.75279552715655}
# Check baseline results
print(model_0_results)

輸出為:

{'model_name': 'FashionMNISTModelV0', 'model_loss': 2.3190648555755615, 'model_acc': 10.85263578

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

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

相關文章

elementUI 單選框存在多個互斥的選項中選擇的場景

使用 el-radio-group 來使用單選框組&#xff0c;代碼如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">業務對象</el-radio><…

Qt項目開發中所遇

講述下面代碼所表示的含義&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一個名為widget_19的QWidget&#xff0c;將給其應用垂直管路布局。 2、新建一個…

相機標定與圖像處理涉及的核心坐標系

坐標系相互關系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…

CICD編譯時遇到npm error code EINTEGRITY的問題

場景 CICD編譯時拋出npm error code EINTEGRITY的錯誤 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…

使用Spring Boot與Spring Security構建安全的RESTful API

使用Spring Boot與Spring Security構建安全的RESTful API 引言 在現代Web應用開發中&#xff0c;安全性是一個不可忽視的重要方面。Spring Boot和Spring Security為開發者提供了一套強大的工具&#xff0c;用于構建安全的RESTful API。本文將詳細介紹如何結合Spring Boot和Sp…

機器人拖動示教控制

機器人拖動示教控制 機器人拖動視角控制與軌跡記錄 1. 知識目標 體驗ES機器人拖動視角操作體驗ES機器人拖動軌跡記錄 2. 技能目標 掌握ES機器人拖動視角操作掌握ES機器人拖動軌跡記錄 3. ES機器人拖動視角操作 3.1 操作步驟 點擊“拖動視角”按鈕長按“啟用”鍵約3秒進入…

RuoYi-Vue3-FastAPI框架的功能實現(上)

RuoYi-Vue3-FastAPI框架的功能實現&#xff08;上&#xff09; 感謝大佬給出關于python后端的若依框架&#xff0c;希望這個簡單文檔能幫助到大家。 安裝與運行&#xff1a; 下載地址&#xff1a;Vue2版本&#xff1a; Gitte倉庫地址&#xff1a;RuoYi-Vue-FastAPI: 基于Vu…

Paimon和Hive相集成

Paimon版本1.17 Hive版本3.1.3 1、Paimon集成Hive 將paimon-hive-connector.jar復制到auxlib中&#xff0c;下載鏈接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通過flink進入查看paimon /opt/softwares/flink-1…

【Leetcode 每日一題】3362. 零數組變換 III

問題背景 給你一個長度為 n n n 的整數數組 n u m s nums nums 和一個二維數組 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li?,ri?]。 每一個 q u e r i e s [ i ] queries[i] queries[i]…

計算機視覺與深度學習 | 用于圖像分割的自監督學習(Self-Supervised Learning)方法綜述

圖像分割 用于圖像分割的自監督學習(Self-Supervised Learning)方法綜述**1. 背景與意義****2. 方法演進****3. 圖像分割子任務與SSL策略****4. 自監督預訓練任務分類****5. 基準數據集與評估指標****6. 挑戰與未來方向****總結**用于圖像分割的自監督學習(Self-Supervised …

Jenkins集成Docker與K8S構建

Jenkins 是一個開源的持續集成和持續交付(CI/CD)工具,廣泛用于自動化軟件開發過程中的構建、測試和部署任務。它通過插件系統提供了高度的可擴展性,支持與多種開發工具和技術的集成。 Jenkins 的核心功能 Jenkins 的主要功能包括自動化構建、測試和部署。它能夠監控版本控…

使用 adb 命令截取 Android 設備的屏幕截圖

使用 adb 命令截取 Android 設備的屏幕截圖。以下是兩種常見的方法&#xff1a; 方法一&#xff1a;截屏后保存到電腦 adb shell screencap -p /sdcard/screenshot.png adb pull /sdcard/screenshot.png解釋&#xff1a; adb shell screencap -p /sdcard/screenshot.png&…

參與開發的注意事項

1.開發期間&#xff0c;不要擅自修改架構的內容 使用技術官發的項目文件夾來開發&#xff0c;而不是自己建立項目&#xff0c; 否則會導致環境不統一 架構內容&#xff1a;&#xff08;不能更改&#xff09; 1.類型定義&#xff0c;全局變量聲明 2.函數申明&#xff08;函數名稱…

linux安裝nginx和前端部署vue項目

1、打包前端項目 npm run build 執行完后會在根目錄下生成一個dist文件夾&#xff0c;這個dist文件夾就是我們后面要部署到nginx的東西。 2、將dist文件夾上傳到服務器中 自己建一個目錄&#xff0c;上傳即可&#xff08;盡量不要在root目錄下&#xff0c;可能涉及權限問題…

親測有效!OGG 創建抽取進程報錯 OGG-08241,如何解決?

前言 今天在測試 OGG 一個功能的時候&#xff0c;需要重新初始化 oggca&#xff0c;所以重裝了一下 OGG。重建完之后重新添加抽取進程報錯&#xff0c;一直無法添加成功&#xff1a; 經過一翻分析&#xff0c;找到了解決方案&#xff0c;本文記錄一下解決過程。 問題描述 OG…

Docker構建 Dify 應用定時任務助手

概述 Dify 定時任務管理工具是一個基于 GitHub Actions 的自動化解決方案&#xff0c;用于實現 Dify Workflow 的定時執行和狀態監控。無需再為缺乏定時任務支持而感到困擾&#xff0c;本工具可以幫助設置自動執行任務并獲取實時通知&#xff0c;優化你的工作效率。 注意&…

ubuntu24.04+RTX5090D 顯卡驅動安裝

初步準備 Ubuntu默認內核太舊&#xff0c;用mainline工具安裝新版&#xff1a; sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用內核列表 mainline install 6.13 # 安裝…

網絡爬蟲(Web Crawler)詳解

網絡爬蟲(Web Crawler)詳解 1. 基本概念與核心目標 定義: 網絡爬蟲是一種自動化的程序,通過HTTP協議訪問網頁,提取并存儲數據(如文本、鏈接、圖片),并根據策略遞歸訪問新鏈接。核心目標: 數據采集:抓取特定網站或全網公開數據。索引構建:為搜索引擎提供頁面內容(如…

大模型如何助力數學可視化?

大家好&#xff0c;我是 i 學習的老章 在數學學習和教學中&#xff0c;將抽象概念可視化對于理解至關重要。Manim 是一個強大的數學動畫引擎&#xff0c;由著名數學科普視頻作者 3Blue1Brown 開發并廣為人知。 老章較早之前就介紹過 manim&#xff1a;B 站上爆紅的數學視頻&a…

Oracle基礎知識(二)

目錄 1.聚合函數 2.COUNT(1)&COUNT(*)&COUNT(字段)區別&#xff08;面試常問&#xff09; 3.分組聚合——group by 4.去重&#xff1a;DISTINCT 、GROUP BY 5.聚合函數的過濾HAVING 6.oracle中having與where的區別 (面試常問) 7.ROUND與TRUNC函數 8.ROLLUP上卷…