day 40 python打卡

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

# 先繼續之前的代碼
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加載數據的工具
from torchvision import datasets, transforms # torchvision 是一個用于計算機視覺的庫,datasets 和 transforms 是其中的模塊
import matplotlib.pyplot as plt
import warnings
# 忽略警告信息
warnings.filterwarnings("ignore")
# 設置隨機種子,確保結果可復現
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")
# 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# 初始化模型
model = MLP()
model = model.to(device)  # 將模型移至GPU(如果可用)# from torchsummary import summary  # 導入torchsummary庫
# print("\n模型結構信息:")
# summary(model, input_size=(1, 28, 28))  # 輸入尺寸為MNIST圖像尺寸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):# enumerate() 是 Python 內置函數,用于遍歷可迭代對象(如列表、元組)并同時獲取索引和值。# batch_idx:當前批次的索引(從 0 開始)# (data, target):當前批次的樣本數據和對應的標簽,是一個元組,這是因為dataloader內置的getitem方法返回的是一個元組,包含數據和標簽。# 只需要記住這種固定寫法即可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開始# 統計準確率和損失running_loss += loss.item() #將loss轉化為標量值并且累加到running_loss中,計算總損失_, predicted = output.max(1) # output:是模型的輸出(logits),形狀為 [batch_size, 10](MNIST 有 10 個類別)# 獲取預測結果,max(1) 返回每行(即每個樣本)的最大值和對應的索引,這里我們只需要索引total += target.size(0) # target.size(0) 返回當前批次的樣本數量,即 batch_size,累加所有批次的樣本數,最終等于訓練集的總樣本數correct += predicted.eq(target).sum().item() # 返回一個布爾張量,表示預測是否正確,sum() 計算正確預測的數量,item() 將結果轉換為 Python 數字# 每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_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  # 返回最終測試準確率

彩色圖片寫法

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(),                # 轉換為張量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 標準化處理
])# 2. 加載CIFAR-10數據集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=transform
)# 3. 創建數據加載器
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定義MLP模型(適應CIFAR-10的輸入尺寸)
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]# 第一層全連接 + 激活 + Dropoutx = self.layer1(x)   # 線性變換: [batch_size, 3072] → [batch_size, 512]x = self.relu1(x)    # 應用ReLU激活函數x = self.dropout1(x) # 訓練時隨機丟棄部分神經元輸出# 第二層全連接 + 激活 + Dropoutx = 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# 檢查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 序號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()  # 更新參數# 記錄當前 iteration 的損失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()# 每100個批次打印一次訓練信息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_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / total# 測試階段model.eval()  # 設置為評估模式test_loss = 0correct_test = 0total_test = 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_test += target.size(0)correct_test += predicted.eq(target).sum().item()epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_testprint(f'Epoch {epoch+1}/{epochs} 完成 | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')# 繪制所有 iteration 的損失曲線plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_acc  # 返回最終測試準確率# 6. 繪制每個 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()# 7. 執行訓練和測試
epochs = 20  # 增加訓練輪次以獲得更好效果
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")# # 保存模型
# torch.save(model.state_dict(), 'cifar10_mlp_model.pth')
# # print("模型已保存為: cifar10_mlp_model.pth")

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

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

相關文章

進階日記(一)大模型的本地部署與運行

目錄 一、背景知識 為什么要在本地部署大模型? 在本地部署大模型需要做哪些準備工作? (1)硬件配置 (2)軟件環境 有哪些部署工具可供選擇? 二、Ollma安裝 Ollama安裝完之后,還…

Spring Boot Starter 自動裝配原理全解析:從概念到實踐

Spring Boot Starter 自動裝配原理全解析:從概念到實踐 在Spring Boot開發中,Starter和自動裝配是兩個核心概念,它們共同構成了“開箱即用”的開發體驗。通過引入一個Starter依賴,開發者可以快速集成第三方組件(如Red…

win11回收站中出現:查看回收站中是否有以下項: WPS云盤回收站

好久沒更新了,首先祝所有大朋友、小朋友六一兒童節快樂,真的希望我們永遠都不會長大呀,長大真的好累呀(?_?) 免責聲明 筆者先來個免責聲明吧,被網上的陰暗面嚇到了 若讀者參照筆者的這篇文章所執行的操作中途或后續出現的任何…

網絡安全大模型理解

一、網絡安全大模型的概述 網絡安全大模型是一種用于識別和應對各種網絡安全威脅的模型。它通過分析網絡數據包、網絡行為等信息,識別潛在的網絡安全事件,并采取相應的措施進行防御。網絡安全大模型主要包括以下幾個部分: 1. 數據預處理&am…

C++語法架構解說

C 是一種功能強大且靈活的編程語言,廣泛應用于系統編程、游戲開發、嵌入式系統、金融軟件等領域。 其語法架構復雜且豐富,涵蓋了從基礎語法到高級特性的各個方面。 對 C 語法架構 的詳細解析,涵蓋其核心語法結構、面向對象編程(…

審計- 1- 審計概述

1.財務報表審計的概念 財務報表審計是指注冊會計師對財務報表是否不存在重大錯報提供合理保證,以積極方式提出意見,增強除管理層之外的預期使用者對財務報表信賴的程度。 1.1 審計業務三方關系人 注冊會計師對財務報表發表審計意見是注冊會計師的責任管…

RapidOCR集成PP-OCRv5_det mobile模型記錄

該文章主要摘取記錄RapidOCR集成PP-OCRv5_mobile_det記錄,涉及模型轉換,模型精度測試等步驟。原文請前往官方博客: https://rapidai.github.io/RapidOCRDocs/main/blog/2025/05/26/rapidocr%E9%9B%86%E6%88%90pp-ocrv5_det%E6%A8%A1%E5%9E%8B…

Spine工具入門教程2之導入

1、導入定義 從原畫轉化為Spine的環節。 (1)選擇路徑,拖動圖片導入方式 缺點:定位不準 【使用批量導出的方式】 在PS工具中,選擇所有圖層后右鍵選擇導出。 在Spine工具中,選擇路徑導入圖片。 然后再拖…

【03】完整開發騰訊云播放器SDK的UniApp官方UTS插件——優雅草上架插件市場-卓伊凡

【03】完整開發騰訊云播放器SDK的UniApp官方UTS插件——優雅草上架插件市場-卓伊凡 一、項目背景與轉型原因 1.1 原定計劃的變更 本系列教程最初規劃是開發即構美顏SDK的UTS插件,但由于甲方公司內部戰略調整,原項目被迫中止。考慮到: 技術…

戴爾AI服務器訂單激增至121億美元,但傳統業務承壓

戴爾科技121億美元的AI服務器訂單,不僅超過了公司整個2025財年的AI服務器出貨量,更讓其AI訂單積壓達到144億美元的歷史高位。 戴爾科技最新財報顯示,AI服務器需求的爆炸式增長正在重塑這家老牌PC制造商的業務格局,但同時也暴露出…

多線程和并發之線程

線程 前面講到進程:為了并發執行任務(程序),現代操作系統才引進進程的概念 分析: 創建開銷問題:創建一個進程開銷:大 子進程需要拷貝父進程的整個地址空間 通信開銷問題:進程間的通…

AAAI 2025論文分享│STD-PLM:基于預訓練語言模型的時空數據預測與補全方法

本文詳細介紹了一篇發表于人工智能頂級會議AAAI 2025的論文《STD-PLM: Understanding Both Spatial and Temporal Properties of Spatial-Temporal Data with PLM》。該論文提出了一種基于預訓練語言模型(Pre-trained Language Model?,PLM)的…

前端八股 tcp 和 udp

都是傳輸層協議 udp 數據報協議 不可靠面向數據包對于應用層傳遞的報文加上UDP首部就傳給網絡層 tcp 傳輸控制協議 可靠 會將報文分段進行傳輸 區別: 1.tcp 可靠 udp 不可靠 2.tcp 面向連接 三握四揮 udp 無連接 3.tcp面向字節流 udp面向報文 4.效率低 效率高…

MES管理系統:Java+Vue,含源碼與文檔,實現生產過程實時監控、調度與優化,提升制造企業效能

前言: 在當今競爭激烈的制造業環境中,企業面臨著提高生產效率、降低成本、提升產品質量以及快速響應市場變化等多重挑戰。MES管理系統作為連接企業上層計劃管理系統與底層工業控制之間的橋梁,扮演著至關重要的角色。它能夠實時收集、分析和處…

MSTNet:用于糖尿病視網膜病變分類的多尺度空間感知 Transformer 與多實例學習方法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 MSTNet: Multi-scale spatial-aware transformer with multi-instance learning for diabetic retinopathy classification MSTNet:用于糖尿病視網膜病變分類的多尺度空間感知 Transformer 與多實例學習方法 01 文獻速遞介紹 糖尿病視網膜病變&#…

每日八股文6.2

每日八股-6.2 Go1.GMP調度原理(這部分多去看看golang三關加深理解)2.GC(同樣多去看看golang三關加深理解)3.閉包4.go語言函數是一等公民是什么意思5.sync.Mutex和sync.RWMutex6.sync.WaitGroup7.sync.Cond8.sync.Pool9.panic和rec…

【Unity】相機 Cameras

1 前言 主要介紹官方文檔中相機模塊的內容。 關于“9動態分辨率”,這部分很多API文檔只是提了一下,具體細節還需要自己深入API才行。 2 攝像機介紹 Unity 場景在三維空間中表示游戲對象。由于觀察者的屏幕是二維屏幕,Unity 需要捕捉視圖并將…

SpringBoot(六)--- AOP、ThreadLocal

目錄 前言 一、AOP基礎 1.入門程序 2. AOP核心概念 3. 底層原理 二、AOP進階 1.通知類型 抽取切入點 2. 切入點表達式 2.1 execution 2.2 annoation 2.3 連接點詳解 三、ThreadLocal 前言 AOP(面向切面編程),面向切面編程實際就…

【深度學習】 19. 生成模型:Diffusion Models

Diffusion Models Diffusion Models 簡介 Diffusion 模型是一類通過逐步添加噪聲并再逆向還原的方式進行圖像生成的深度生成模型。其基本流程包括: 前向過程(Forward Process):將真實圖像逐步加噪,最終變為高斯噪聲…

Y1——鏈式前向星

知識點 模版——鏈表的前插法 head表示頭結點的下標 ver[i]表示結點i 的值 tot存儲當前已經用到了哪個 add用于將x插到頭結點 int head1; intt ver[N],Next[N]; int ttot-1; void add(int x){ver[tot]x;Next[tot]head;headtot; } 常見的鏈式前向星三種實現形式&#xff…