嵌入式學習-土堆PyTorch(9)-day25

進入尾聲,一個完整的模型訓練 ,點亮的第一個led

#自己注釋版
import torch
import torchvision.datasets
from torch import nn
from torch.utils.tensorboard import SummaryWriter
import time
# from model import *
from torch.utils.data import DataLoader#定義訓練的設備
device= torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#準備數據集
train_data = torchvision.datasets.CIFAR10(root='./data_CIF',train=True,transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root='./data_CIF',train=False,transform=torchvision.transforms.ToTensor(),download=True)#獲得數據集長度
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"訓練數據集的長度為 : {train_data_size}")
print(f"測試數據集的長度為 : {test_data_size}")#利用 Dataloader 來加載數據集
train_loader =DataLoader(dataset=train_data,batch_size=64)
test_loader =DataLoader(dataset=test_data,batch_size=64)#搭建神經網絡
class Tudui(nn.Module):def __init__(self):super().__init__()self.model = nn.Sequential(nn.Conv2d(in_channels=3,out_channels=32,kernel_size=5,stride=1,padding=2),nn.MaxPool2d(2),nn.Conv2d(in_channels=32,out_channels=32,kernel_size=5,stride=1,padding=2),nn.MaxPool2d(2),nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,stride=1,padding=2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(in_features=64*4*4,out_features=64),nn.Linear(in_features=64,out_features=10),)def forward(self,x):x = self.model(x)return x#創建網絡模型
tudui = Tudui()
#GPU
tudui.to(device)#損失函數
loss_fn = nn.CrossEntropyLoss()
#GPU
loss_fn.to(device)#優化器
# learning_rate = 0.001
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(),lr=learning_rate)#設置訓練網絡的一些參數
#記錄訓練的次數
total_train_step = 0
#記錄測試的次數
total_test_step = 0
#訓練的輪數
epoch = 10#添加tensorboard
writer = SummaryWriter("./logs_train")start_time = time.time()
for i in range(epoch):print(f"---------第{i+1}輪訓練開始---------")#訓練步驟開始tudui.train()       #當網絡中有特定層的時候有用for data in train_loader:imgs, targets = data#GPUimgs.to(device)targets.to(device)output = tudui(imgs)loss = loss_fn(output,targets)      #算出誤差# 優化器優化模型#梯度置零optimizer.zero_grad()#反向傳播loss.backward()#更新參數optimizer.step()#展示輸出total_train_step += 1if total_train_step % 100 == 0:end_time = time.time()print(f"訓練次數:{total_train_step} 花費時間:{end_time - start_time}")print(f"訓練次數:{total_train_step},Loss:{loss.item()}")writer.add_scalar("train_loss",loss.item(),total_train_step)#測試步驟開始tudui.eval()        #當網絡中有特定層的時候有用total_test_loss = 0#整體的正確個數total_accuracy = 0#取消梯度with torch.no_grad():for data in test_loader:imgs, targets = data#GPUimgs.to(device)targets.to(device)output = tudui(imgs)loss = loss_fn(output,targets)  #計算出誤差#構建一些指標total_accuracy += (output.argmax(1) == targets).sum().item() #統計每一批預測的結果和真實結果相等的個數total_test_loss += loss.item()print(f"整體測試集上的loss:{total_test_loss}")print(f"整體測試集上的正確率:{total_accuracy/test_data_size}")print(f"整體測試集上的正確數:{total_accuracy}")#寫入tensorboardwriter.add_scalar("test_loss",total_test_loss,total_test_step)writer.add_scalar("test_accuracy",total_accuracy/test_data_size,total_test_step)total_test_step += 1#保存模型torch.save(tudui.state_dict(),f"./tudui{i}.pth")print("模型已保存")writer.close()

#ai注釋版
import torch
import torchvision.datasets
from torch import nn
from torch.utils.tensorboard import SummaryWriter
import time
from torch.utils.data import DataLoader# ----------------- 一、設備 -----------------
# 判斷是否有可用的GPU,沒有則用CPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# ----------------- 二、準備數據 -----------------
# 下載CIFAR10訓練集
train_data = torchvision.datasets.CIFAR10(root='./data_CIF', train=True, transform=torchvision.transforms.ToTensor(), download=True)
# 下載CIFAR10測試集
test_data = torchvision.datasets.CIFAR10(root='./data_CIF', train=False, transform=torchvision.transforms.ToTensor(), download=True)# 打印訓練集和測試集的長度
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"訓練數據集的長度為 : {train_data_size}")
print(f"測試數據集的長度為 : {test_data_size}")# 使用Dataloader封裝數據,方便批量加載
train_loader = DataLoader(dataset=train_data, batch_size=64)
test_loader = DataLoader(dataset=test_data, batch_size=64)# ----------------- 三、搭建神經網絡 -----------------
class Tudui(nn.Module):def __init__(self):super().__init__()# 搭建一個簡單的卷積神經網絡self.model = nn.Sequential(nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2), # [b,3,32,32] -> [b,32,32,32]nn.MaxPool2d(2),  # [b,32,32,32] -> [b,32,16,16]nn.Conv2d(32, 32, 5, 1, 2), # -> [b,32,16,16]nn.MaxPool2d(2), # -> [b,32,8,8]nn.Conv2d(32, 64, 5, 1, 2), # -> [b,64,8,8]nn.MaxPool2d(2), # -> [b,64,4,4]nn.Flatten(),  # 拉平成一維 [b,64*4*4]nn.Linear(64*4*4, 64),nn.Linear(64, 10)  # CIFAR10 一共10類)def forward(self, x):return self.model(x)# 創建模型對象
tudui = Tudui()
tudui.to(device)  # 移動到GPU/CPU# ----------------- 四、定義損失函數和優化器 -----------------
# 交叉熵損失函數(多分類標準選擇)
loss_fn = nn.CrossEntropyLoss().to(device)# SGD隨機梯度下降優化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)# ----------------- 五、訓練準備 -----------------
total_train_step = 0   # 總訓練次數
total_test_step = 0    # 總測試次數
epoch = 10             # 訓練輪數# TensorBoard日志工具
writer = SummaryWriter("./logs_train")start_time = time.time()  # 記錄起始時間# ----------------- 六、開始訓練 -----------------
for i in range(epoch):print(f"---------第{i+1}輪訓練開始---------")# 訓練模式(啟用BN、Dropout等)tudui.train()for data in train_loader:imgs, targets = dataimgs, targets = imgs.to(device), targets.to(device)# 前向傳播output = tudui(imgs)# 計算損失loss = loss_fn(output, targets)# 優化器梯度清零optimizer.zero_grad()# 反向傳播,自動求導loss.backward()# 更新參數optimizer.step()total_train_step += 1# 每100次打印一次訓練lossif total_train_step % 100 == 0:end_time = time.time()print(f"訓練次數:{total_train_step} 花費時間:{end_time - start_time}")print(f"訓練次數:{total_train_step}, Loss:{loss.item()}")# 寫入TensorBoardwriter.add_scalar("train_loss", loss.item(), total_train_step)# ----------------- 七、測試步驟 -----------------tudui.eval()  # 切換到測試模式(停用BN、Dropout)total_test_loss = 0total_accuracy = 0# 不計算梯度,節省顯存,加快推理with torch.no_grad():for data in test_loader:imgs, targets = dataimgs, targets = imgs.to(device), targets.to(device)output = tudui(imgs)loss = loss_fn(output, targets)total_test_loss += loss.item()# 預測正確個數統計total_accuracy += (output.argmax(1) == targets).sum().item()print(f"整體測試集上的Loss: {total_test_loss}")print(f"整體測試集上的正確率: {total_accuracy / test_data_size}")print(f"整體測試集上的正確數: {total_accuracy}")# 寫入TensorBoard(測試loss和準確率)writer.add_scalar("test_loss", total_test_loss, total_test_step)writer.add_scalar("test_accuracy", total_accuracy / test_data_size, total_test_step)total_test_step += 1# ----------------- 八、保存模型 -----------------torch.save(tudui.state_dict(), f"./tudui{i}.pth")print("模型已保存")# ----------------- 九、關閉TensorBoard -----------------
writer.close()

?結果圖

?忘記清除歷史數據了

?

?完整的模型驗證套路

import torch
import torchvision.transforms
from PIL import Image
from torch import nnimage_path = "./images/微信截圖_20250719220956.png"
image = Image.open(image_path).convert('RGB')
print(type(image))transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])
image = transform(image)
print(type(image))#搭建神經網絡
class Tudui(nn.Module):def __init__(self):super().__init__()self.model = nn.Sequential(nn.Conv2d(in_channels=3,out_channels=32,kernel_size=5,stride=1,padding=2),nn.MaxPool2d(2),nn.Conv2d(in_channels=32,out_channels=32,kernel_size=5,stride=1,padding=2),nn.MaxPool2d(2),nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,stride=1,padding=2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(in_features=64*4*4,out_features=64),nn.Linear(in_features=64,out_features=10),)def forward(self,x):x = self.model(x)return xmodel = Tudui()
model.load_state_dict(torch.load("tudui9.pth"))
image = torch.reshape(image, (1,3,32,32))
model.eval()
with torch.no_grad():output = model(image)
print(output)
print(output.argmax(1))

5確實是狗,驗證成功?

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

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

相關文章

Java變量詳解:局部變量、成員變量、類變量區別及使用場景

作為Java開發者,深入理解不同變量的特性是寫出高質量代碼的基礎。本文將為你全面解析三種核心變量類型,并通過實戰案例展示它們的正確使用方式。一、變量類型概覽 1. 局部變量(Local Variable) 定義:在方法、構造方法或…

【收集電腦信息】collect_info.sh

收集電腦信息 collect_info.sh #!/bin/bashoutput"info.txt" > "$output"# 1. OS Version echo " 操作系統名稱及版本 " >> "$output" lsb_release -d | cut -f2- >> "$output" echo -e "\n" >…

服務器清理空間--主要是conda環境清理和刪除

1.查看空間情況 (base) zhouy24RL-DSlab:~/zhouy24Files$ df -h Filesystem Size Used Avail Use% Mounted on udev 252G 0 252G 0% /dev tmpfs 51G 4.9M 51G 1% /run /dev/nvme0n1p3 1.9T 1.7T 42G 98% / tmpfs 252G …

UE5多人MOBA+GAS 26、為角色添加每秒回血回藍(番外:添加到UI上)

文章目錄添加生命值和藍量的狀態標簽創建無限GE并應用監聽添加和去除標簽每秒回復配上UI添加生命值和藍量的狀態標簽 添加新的標簽 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Full)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Empty)CRUNCH_API U…

MetaGPT源碼剖析(三):多智能體系統的 “智能角色“ 核心實現——Role類

每一篇文章都短小精悍,不啰嗦。今天我們來深入剖析Role類的代碼實現。在多智能體協作系統中,Role(角色)就像現實世界中的 "員工",是執行具體任務、參與協作的基本單位。這段代碼是 MetaGPT 框架的核心&#…

【項目經驗】小智ai MCP學習筆記

理論 1、什么是MCP MCP(Model Context Protocol,模型上下文協議)是一種開放式協議,它實現了LLM與各種工具的調用。使LLM從對話、生成式AI變成了擁有調用三方工具的AI。用官方的比喻,MCP就是USB-C接口,只要實現了這個接口&#x…

Matlab學習筆記:矩陣基礎

MATLAB學習筆記:矩陣基礎 作為MATLAB的核心,矩陣是處理數據的基礎工具。矩陣本質上是一個二維數組,由行和列組成,用于存儲和操作數值數據。在本節中,我將詳細講解矩陣的所有知識點,包括創建、索引、運算、函數等,確保內容通俗易懂。我會在關鍵地方添加MATLAB代碼示例,…

技術演進中的開發沉思-38 MFC系列:關于打印

打印程序也是MFC開發中不能忽視的一個環節,現在做打印開發so easy。但當年做打印開發還是挺麻煩。在當年的桌面程序里就像拼圖的最后一塊,看著簡單,實則要把屏幕上的像素世界,準確映射到打印機的物理紙張上。而MFC 的打印機制就像…

Apache Ignite 長事務終止機制

這段內容講的是 Apache Ignite 中長事務終止機制(Long Running Transactions Termination),特別是關于分區映射交換(Partition Map Exchange)與事務超時設置(Transaction Timeout)之間的關系。下…

網絡編程---TCP協議

TCP協議基礎知識TCP(Transmission Control Protocol,傳輸控制協議)是互聯網核心協議之一,位于傳輸層(OSI第4層),為應用層提供可靠的、面向連接的、基于字節流的數據傳輸服務。它與IP協議共同構成…

K 近鄰算法(K-Nearest Neighbors, KNN)詳解及案例

K近鄰算法(K-Nearest Neighbors, KNN)詳解及案例 一、基本原理 K近鄰算法是一種監督學習算法,核心思想是“物以類聚,人以群分”:對于一個新樣本,通過計算它與訓練集中所有樣本的“距離”,找出距…

深入理解 Redis 集群化看門狗機制:原理、實踐與風險

在分布式系統中,我們常常需要執行一些關鍵任務,這些任務要么必須成功執行,要么失敗后需要明確的狀態(如回滾),并且它們的執行時間可能難以精確預測。如何確保這些任務不會被意外中斷,或者在長時…

Python機器學習:從零基礎到項目實戰

目錄第一部分:思想與基石——萬法歸宗,筑基問道第1章:初探智慧之境——機器學習世界觀1.1 何為學習?從人類學習到機器智能1.2 機器學習的“前世今生”:一部思想與技術的演進史1.3 為何是Python?——數據科學…

數據庫:庫的操作

1:查看所有數據庫SHOW DATABASES;2:創建數據庫CREATE DATABASE [ IF NOT EXISTS ] 數據庫名 [ CHARACTER SET 字符集編碼 | COLLATE 字符集校驗規則 | ENCRYPTION { Y | N } ];[]:可寫可不寫{}:必選一個|:n 選 1ENCR…

AngularJS 動畫

AngularJS 動畫 引言 AngularJS 是一個流行的JavaScript框架,它為開發者提供了一種構建動態Web應用的方式。在AngularJS中,動畫是一個強大的功能,可以幫助我們創建出更加生動和引人注目的用戶界面。本文將詳細介紹AngularJS動畫的原理、用法以及最佳實踐。 AngularJS 動畫…

SonarQube 代碼分析工具

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 ??全面掌握 SonarQube:企業代碼質量保障的利器 ?? 在當今 DevOps 流水線中,代碼…

vmware vsphere esxi6.5 使用工具導出鏡像

注:為什么使用這個工具,我這邊主要因為esxi6.5自身bug導致web導出鏡像會失敗一、下載VMware-ovftool到本地系統(根據你的操作系統版本到官網下載安裝,此處略)以下內容默認將VMware-ovftool安裝到windows 本地系統為例。…

ES 踩坑記:Set Processor 字段更新引發的 _source 污染

問題背景 社區的一個伙伴想對一個 integer 的字段類型添加一個 keyword 類型的子字段,然后進行精確匹配的查詢優化,提高查詢的速度。 整個索引數據量不大,并不想進行 reindex 這樣的復雜操作,就想到了使用 update_by_query 的存量…

如何徹底搞定 PyCharm 中 pip install 報錯 ModuleNotFoundError: No module named ‘requests’ 的問題

如何徹底搞定 PyCharm 中 pip install 報錯 ModuleNotFoundError: No module named ‘requests’ 的問題 在使用 PyCharm 開發 Python 項目時,ModuleNotFoundError: No module named requests 是一個常見但令人頭疼的問題。本篇博文將從環境配置、原因分析到多種解…

powerquery如何實現表的拼接主鍵

在做表過程中,有時候沒有基表,這個時候就要構造完整的主鍵,這樣才可以使之后匹配的數據不會因為主鍵不全而丟失數據 我的處理方法是吧多個表的主鍵拼在一起然后去重,構造一個單單之后之間的表作為基表去匹配數據 所以就喲啊用到自…