Python訓練營-Day38-Dataset和Dataloader類

在遇到大規模數據集時,顯存常常無法一次性存儲所有數據,所以需要使用分批訓練的方法。為此,PyTorch提供了DataLoader類,該類可以自動將數據集切分為多個批次batch,并支持多線程加載數據。此外,還存在Dataset類,該類可以定義數據集的讀取方式和預處理方式。

1. DataLoader類:決定數據如何加載

2. Dataset類:告訴程序去哪里找數據,如何讀取單個樣本,以及如何預處理。

為了引入這些概念,我們現在接觸一個新的而且非常經典的數據集:MNIST手寫數字數據集。該數據集包含60000張訓練圖片和10000張測試圖片,每張圖片大小為28*28像素,共包含10個類別。因為每個數據的維度比較小,所以既可以視為結構化數據,用機器學習、MLP訓練,也可以視為圖像數據,用卷積神經網絡訓練。

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# 設置隨機種子,確保結果可復現
torch.manual_seed(42)

?## 一、Dataset類

現在我們想要取出來一個圖片,看看長啥樣,因為datasets.MNIST本質上集成了torch.utils.data.Dataset,所以自然需要有對應的方法。

import matplotlib.pyplot as plt# 隨機選擇一張圖片,可以重復運行,每次都會隨機選擇
sample_idx = torch.randint(0, len(train_dataset), size=(1,)).item() # 隨機選擇一張圖片的索引
# len(train_dataset) 表示訓練集的圖片數量;size=(1,)表示返回一個索引;torch.randint() 函數用于生成一個指定范圍內的隨機數,item() 方法將張量轉換為 Python 數字
image, label = train_dataset[sample_idx] # 獲取圖片和標簽

### __getitem__方法

__getitem__方法用于讓對象支持索引操作,當使用[]語法訪問對象元素時,Python 會自動調用該方法。

# 示例代碼
class MyList:def __init__(self):self.data = [10, 20, 30, 40, 50]def __getitem__(self, idx):return self.data[idx]# 創建類的實例
my_list_obj = MyList()
# 此時可以使用索引訪問元素,這會自動調用__getitem__方法
print(my_list_obj[2])  # 輸出:30

?### __len__方法

__len__方法用于返回對象中元素的數量,當使用內置函數len()作用于對象時,Python 會自動調用該方法。

class MyList:def __init__(self):self.data = [10, 20, 30, 40, 50]def __len__(self):return len(self.data)# 創建類的實例
my_list_obj = MyList()
# 使用len()函數獲取元素數量,這會自動調用__len__方法
print(len(my_list_obj))  # 輸出:5

?## 二、Dataloader類

# 3. 創建數據加載器
train_loader = DataLoader(train_dataset,batch_size=64, # 每個批次64張圖片,一般是2的冪次方,這與GPU的計算效率有關shuffle=True # 隨機打亂數據
)test_loader = DataLoader(test_dataset,batch_size=1000 # 每個批次1000張圖片# shuffle=False # 測試時不需要打亂數據
)

?@浙大疏錦行

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

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

相關文章

SVN上傳代碼

SVN(Subversion)是一個常用的版本控制系統,提供了對代碼管理和協作的支持。以下是SVN常見操作(如獲取代碼、上傳代碼、合并沖突處理等)的命令行流程及實例: 1. 獲取代碼(Checkout) 在…

【appium】2.初始連接腳本配置

連接配置 from appium import webdriver desired_caps {platformName: Android,automationName: UIAutomator2,deviceName: ZTEB880,appPackage: com.taobao.taobao,appActivity: com.taobao.tao.welcome.Welcome,noReset: True }driver webdriver.Remote(http://localhost:…

FliTik翻頁時鐘v1.1.25.36,支持安卓TV/手機/車機+windows電腦端

FliTik翻頁時鐘v1.1.25.36,支持安卓TV/手機/車機windows電腦端 FliTik翻頁時鐘是一款集高顏值與強大功能于一身的全平臺數字時鐘工具類應用,支持TV、iOS、安卓、PC以及鴻蒙系統。它不僅擁有精美的翻頁動畫…

以AI賦能創意未來:即夢3.0與Seedance1.0Lite重磅登陸POE!

近年來,隨著人工智能技術的不斷突破,AI模型的應用場景也在逐漸拓寬。在這一過程中,如何整合和利用現有的AI技術,實現更為便捷的創作服務,成為了許多科技企業關注的焦點。近日,全球知名的AI模型整合平臺POE正…

云計算與5G:如何利用5G網絡優化云平臺的性能

想象一下,你正在用手機看視頻、進行在線游戲,甚至是使用云存儲來保存你的重要文件。所有這些背后,其實都離不開一個無形的力量——云計算。而今天,5G網絡的出現,就像為這些云服務加裝了一對翅膀,讓它們飛得…

GPT-1 與 BERT 架構

GPT-1 架構特點 僅解碼器架構:擯棄了傳統transformer中的編碼器層,而是直接用解碼器和自注意力,同時拋棄掉了交叉多頭注意力層,自注意力通過mask來完成計算。注意力塊添加到12個,Attention的輸出維數為762維&#xff0…

Day04_C語言基礎數據結構重點復習筆記20250618

1.什么是計算機的大小端存儲? 答:大端是數據的高位字節存儲在低地址,低位字節存儲在高地址,網絡協議(如TCP/IP)通常采用大端序(稱為“網絡字節序”)。例如:32位整數 0x12…

基于OpenSSL實現AES-CBC 128算法的 SeedKey DLL的生成與使用

🍅 我是螞蟻小兵,專注于車載診斷領域,尤其擅長于對CANoe工具的使用🍅 尋找組織 ,答疑解惑,摸魚聊天,博客源碼,點擊加入👉【相親相愛一家人】🍅 玩轉CANoe&…

進程間通信、線程間通信

進程間通信、線程間通信 進程間通行(Inter-Process Communication, IPC)和線程間通信(Thread Communication)的方式不完全相同,因為進程和線程的運行環境和特性不同 進程和線程的本質區別 進程 進程是操…

【FPGA學習】FPGA入門學習即數字邏輯復習

前言:最近開始學習FPGA了,希望通過博客記錄下每一次學習的過程,與大家共勉。 目錄 一、組合邏輯電路的設計(工程學習引入) 二、3-8譯碼器設計、下載和功能演示(在的8段數碼管顯示) 2.1 Logs…

ffmpeg python rgba圖片合成 4444格式mov視頻,保留透明通道

def convert_pngs_to_mov(input_pattern, output_path, frame_rate30):"""將BGRA四通道PNG序列轉換為ProRes 4444編碼的MOV視頻(保留透明通道)參數:input_pattern: PNG序列路徑模式(如:"/path/to/frames/fram…

Java 實現 PDF 轉圖片功能:實戰教程 + 場景解析

作者:云起川南|專注 Java 實戰與自動化集成 在 PDF 文檔處理的各類業務場景中,“將 PDF 頁面轉為圖片”是一個高頻、剛需的功能,廣泛應用于 預覽展示、文件歸檔、圖片加密水印、OCR 文本識別 等系統中。 本文將帶你一步一步實戰如何使用 Java 實現 PDF 轉圖片 功能,使用開…

面試題-有個對象key全部是string,值全部是number要定義他,不使用interface和type如何定義

在 TypeScript 里,若要定義一個鍵為string類型、值為number類型的對象,并且不使用interface和type,可以采用以下幾種方式: 1. 內聯類型注解(Inline Type Annotation) 直接在變量聲明時使用索引簽名進行類…

領域驅動設計(DDD)【3】之事件風暴

文章目錄 說明一 事件風暴理論知識1.1 事件風暴的核心目標1.2事件風暴的關鍵步驟1.2.1 準備工作1.2.2 核心流程1.2.3 事件風暴的輸出 1.3 事件風暴的優勢1.4 常見問題Q1:事件風暴適合所有項目嗎?Q2:事件風暴后如何落地?Q3&#xf…

Vue3中監聽 Ref 類型的數字數組

在 Vue 3 中&#xff0c;監聽一個 Ref 類型的數字數組&#xff08;如 ref<number[]>([])&#xff09;時&#xff0c;根據需求的不同&#xff0c;有幾種監聽方式&#xff1a; 1. 監聽整個數組的引用變化 當整個數組被重新賦值時觸發&#xff1a; typescript 復制 下載…

PoolThreadCache 類的結構和源碼實現

PoolThreadCache 在 Netty 的內存池中扮演著線程本地緩存的角色。它的主要目的是減少線程在分配內存時對全局 PoolArena 的競爭&#xff0c;通過緩存一部分最近釋放的內存塊&#xff0c;使得同一線程后續申請相同規格的內存時能夠快速獲取&#xff0c;從而提高分配效率。 下面…

Linux中的阻塞信號與信號原理

在Linux操作系統中&#xff0c;信號&#xff08;Signal&#xff09;是進程間通信和進程控制的核心機制之一。信號是一種異步通知機制&#xff0c;可以向進程發送異步事件通知&#xff0c;以便進程能夠處理系統級別的事件。本文將詳細探討Linux中的信號原理&#xff0c;重點講解…

QT學習教程(三十五)

事件處理&#xff08;- Event Processingn&#xff09; 事件是視窗系統或者Qt 本身在各種不同的情況下產生的。當用戶點擊或者釋放鼠標&#xff0c;鍵盤時&#xff0c;一個鼠標事件或者鍵盤事件就產生了。當窗口第一次顯示時&#xff0c;一個繪制事件會產生告訴新可見的窗口繪…

【Dify 案例】【MCP實戰】【三】【超級美食家】

接上次的超級助理,我們這一期給出一個超級美食家 首先:我的MCP要申請一個key ` 我們來看看這個MCP服務怎么使用呢。`https://modelscope.cn/mcp/servers/@worryzyy/howtocook-mcp插件里面需要配置 {"mcpServers":{"amap-amap-sse":{"url":&qu…

4.文件管理(文本、日志、Excel表)

目錄 1.文本 2.日志 3.Excel表 1.文本 using System.Text;namespace (自己創建的一個類) {/// <summary>/// 配置文件*.ini讀寫器。/// </summary>public class IniFile{[System.Runtime.InteropServices.DllImport("kernel32")]private static ex…