python訓練營day40

知識點回顧:

  1. 彩色和灰度圖片測試和訓練的規范寫法:封裝在函數中
  2. 展平操作:除第一個維度batchsize外全部展平
  3. dropout操作:訓練階段隨機丟棄神經元,測試階段eval模式關閉dropout

作業:仔細學習下測試和訓練代碼的邏輯,這是基礎,這個代碼框架后續會一直沿用,后續的重點慢慢就是轉向模型定義階段了。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 1. 數據預處理
transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST數據集的均值和標準差
])# 2. 加載MNIST數據集
train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 3. 創建數據加載器
batch_size = 64  # 每批處理64個樣本
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定義模型、損失函數和優化器
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# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化模型
model = MLP()
model = model.to(device)  # 將模型移至GPU(如果可用)criterion = nn.CrossEntropyLoss()  # 交叉熵損失函數,適用于多分類問題
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam優化器# 5. 訓練模型(記錄每個 iteration 的損失)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 設置為訓練模式# 新增:記錄每個 iteration 的損失all_iter_losses = []  # 存儲所有 batch 的損失iter_indices = []     # 存儲 iteration 序號(從1開始)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)  # 移至GPU(如果可用)optimizer.zero_grad()  # 梯度清零output = model(data)  # 前向傳播loss = criterion(output, target)  # 計算損失loss.backward()  # 反向傳播optimizer.step()  # 更新參數# 記錄當前 iteration 的損失(注意:這里直接使用單 batch 損失,而非累加平均)iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)  # iteration 序號從1開始# 統計準確率和損失(原邏輯保留,用于 epoch 級統計)running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# 每100個批次打印一次訓練信息(可選:同時打印單 batch 損失)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 級邏輯(測試、打印 epoch 結果)不變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}%')# 繪制所有 iteration 的損失曲線plot_iter_losses(all_iter_losses, iter_indices)# 保留原 epoch 級曲線(可選)# plot_metrics(train_losses, test_losses, train_accuracies, test_accuracies, epochs)return epoch_test_acc  # 返回最終測試準確率# 6. 測試模型
def test(model, test_loader, criterion, device):model.eval()  # 設置為評估模式test_loss = 0correct = 0total = 0with torch.no_grad():  # 不計算梯度,節省內存和計算資源for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()avg_loss = test_loss / len(test_loader)accuracy = 100. * correct / totalreturn avg_loss, accuracy  # 返回損失和準確率# 7.繪制每個 iteration 的損失曲線
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')plt.xlabel('Iteration(Batch序號)')plt.ylabel('損失值')plt.title('每個 Iteration 的訓練損失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 8. 執行訓練和測試(設置 epochs=2 驗證效果)
epochs = 2  
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")

@浙大疏錦行

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

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

相關文章

Baklib企業CMS全流程管控與智能協作

企業CMS全流程管控方案解析 現代企業內容管理中,全流程管控的實現依賴于對生產、審核、發布及迭代環節的系統化整合。通過動態發布引擎與元數據智能標記技術,系統可自動匹配內容與目標場景,實現標準化模板驅動的快速部署。針對多分支機構的復…

Qt程序添加調試輸出窗口:CONFIG += console

目錄 1.背景 2.解決方案 3.原理詳解 4.控制臺窗口的行為 5.條件編譯(僅調試模式顯示控制臺) 6.替代方案 7.總結 1.背景 在Qt程序開發中,開發者經常遇到這樣的困擾: 開發機上程序運行正常 發布到其他機器后程序無法啟動 …

《江西棒球資訊》棒球運動發展·棒球1號位

聯賽體系結構 | League Structure MLB模式 MLB采用分層體系(大聯盟、小聯盟),強調梯隊建設和長期發展。 MLB operates a tiered system (Major League, Minor League) with a focus on talent pipelines and long-term development. 中國現…

Python爬蟲實戰:研究Tornado框架相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為一種自動獲取互聯網信息的程序,在信息檢索、數據挖掘、輿情分析等領域有著廣泛的應用。隨著互聯網數據量的爆炸式增長,對爬蟲的性能和效率提出了更高的要求。傳統的同步爬蟲在處理大量 URL 時效率低下,而異步爬蟲可以顯著提高并發…

Vue-列表過濾排序

列表過濾 基礎環境 數據 persons: [{ id: "001", name: "劉德華", age: 19 },{ id: "002", name: "馬德華", age: 20 },{ id: "003", name: "李小龍", age: 21 },{ id: "004", name: "釋小龍&q…

JDK21深度解密 Day 9:響應式編程模型重構

【JDK21深度解密 Day 9】響應式編程模型重構 引言:從Reactor到虛擬線程的范式轉變 在JDK21中,虛擬線程的引入徹底改變了傳統的異步編程模型。作為"JDK21深度解密"系列的第91天,我們將聚焦于響應式編程模型重構這一關鍵主題。通過…

UE5打包項目設置Project Settings(打包widows exe安裝包)

UE5打包項目Project Settings Edit-Project Settings- Packaging-Ini Section Denylist-Advanced 1:打包 2:高級設置 3:勾選創建壓縮包 4:添加要打包地圖Map的數量 5:選擇要打包的地圖Maps 6:Project-Bui…

Fastapi 學習使用

Fastapi 學習使用 Fastapi 可以用來快速搭建 Web 應用來進行接口的搭建。 參考文章:https://blog.csdn.net/liudadaxuexi/article/details/141062582 參考文章:https://blog.csdn.net/jcgeneral/article/details/146505880 參考文章:http…

java helloWord java程序運行機制 用idea創建一個java項目 標識符 關鍵字 數據類型 字節

HelloWord public class Hello{public static void main(String[] args) {System.out.print("Hello,World!");} }java程序運行機制 用idea創建一個java項目 建立一個空項目 新建一個module 注釋 標識符 關鍵字 標識符注意點 數據類型 public class Demo02 {public st…

隨機響應噪聲-極大似然估計

一、核心原因:噪聲機制的數學可逆性 在隨機響應機制(Randomized Response)中使用極大似然估計(Maximum Likelihood Estimation, MLE)是為了從擾動后的噪聲數據中無偏地還原原始數據的統計特性。隨機響應通過已知概率的…

SMT貼片機工藝優化與效率提升策略

內容概要 現代電子制造領域中,SMT貼片機作為核心生產設備,其工藝優化與效率提升直接影響企業競爭力。本文聚焦設備參數校準、吸嘴選型匹配、SPI檢測技術三大技術模塊,結合生產流程重構與設備維護周期優化兩大管理維度,形成系統性…

AI提示工程(Prompt Engineering)高級技巧詳解

AI提示工程(Prompt Engineering)高級技巧詳解 文章目錄 一、基礎設計原則二、高級提示策略三、輸出控制技術四、工程化實踐五、專業框架應用提示工程是與大型語言模型(LLM)高效交互的關鍵技術,精心設計的提示可以顯著提升模型輸出的質量和相關性。以下是經過驗證的詳細提示工…

光電設計大賽智能車激光對抗方案分享:低成本高效備賽攻略

一、賽題核心難點與備賽痛點解析 全國大學生光電設計競賽的 “智能車激光對抗” 賽題,要求參賽隊伍設計具備激光對抗功能的智能小車,需實現光電避障、目標識別、軌跡規劃及激光精準打擊等核心功能。從歷年參賽情況看,選手普遍面臨三大挑戰&a…

【KWDB 創作者計劃】_再熱垃圾發電汽輪機仿真與監控系統:KaiwuDB 批量插入10萬條數據性能優化實踐

再熱垃圾發電汽輪機仿真與監控系統:KaiwuDB 批量插入10萬條數據性能優化實踐 我是一臺N25-3.82/390型汽輪機,心臟在5500轉/分的轟鳴中跳動。垃圾焚燒爐是我的胃,將人類遺棄的殘渣轉化為金色蒸汽,沿管道涌入我的胸腔。 清晨&#x…

day23-計算機網絡-1

1. 網絡簡介 1.1. 網絡介質 網線:cat5,cat5e 六類網線,七類網線,芭蕾網線光纖:wifi:無線路由器,ap5G 1.2. 常見網線類型 1.2.1. 雙絞線(Twisted Pair Cable)【最常用】 按性能主…

VR/AR 視網膜級顯示破局:10000PPI 如何終結顆粒感時代?

一、傳統液晶 “紗窗效應”:VR 沉浸體驗的最大絆腳石 當用戶首次戴上 VR 頭顯時,眼前密密麻麻的像素網格往往打破沉浸感 —— 這正是傳統液晶顯示在近眼場景下的致命缺陷。受限于 500-600PPI 的像素密度,即使達到 4K 分辨率,等效到…

2022---不重復版的數的劃分-且范圍太大

1.數的劃分--數的劃分--dfs剪枝-CSDN博客 2.范圍太大&#xff0c;這題用dp 3.狀態轉移公式其中1是泛指 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int> pii; ll dp[2025][12]; int n,k; void solv…

day15 leetcode-hot100-29(鏈表8)

19. 刪除鏈表的倒數第 N 個結點 - 力扣&#xff08;LeetCode&#xff09; 1.暴力法 思路 &#xff08;1&#xff09;先獲取鏈表的長度L &#xff08;2&#xff09;然后再次遍歷鏈表到L-n的位置&#xff0c;直接讓該指針的節點指向下下一個即可。 2.哈希表 思路 &#xff0…

WIN32-內存管理

分配內存-VirtualAlloc 他與malloc和new的不同在于VirtualAlloc是真正意義上的開辟的一片內存 而且它可以為開辟出來的內存指定屬性 LPVOID VirtualAlloc([in, optional] LPVOID lpAddress,[in] SIZE_T dwSize,[in] DWORD flAllocationType,[in] …

線程概念與控制

目錄 Linux線程概念 什么是線程 分頁式存儲管理 虛擬地址和頁表的由來 物理內存管理 頁表 缺頁異常 線程的優點 線程的缺點 線程異常 Linux進程VS線程 進程與線程 進程的多個線程共享 進程與線程關系如圖 Linux線程控制 POSIX線程庫 創建線程 測試 獲取線程…