PyTorch數據加載流程解析

1. 定義最簡單的Dataset
import torch
from torch.utils.data import Dataset, DataLoaderclass MyDataset(Dataset):def __init__(self, data):self.data = data  # 假設data是一個列表,如[10, 20, 30, 40]def __len__(self):return len(self.data)  # 返回數據總量def __getitem__(self, idx):return self.data[idx]  # 返回單個數據樣本# 示例數據
my_data = [10, 20, 30, 40]
dataset = MyDataset(my_data)
2. 創建DataLoader
loader = DataLoader(dataset, batch_size=2,  # 每批2個樣本shuffle=True)  # 打亂數據順序
3. 遍歷DataLoader時的內部操作

當執行以下代碼時:

for batch in loader:print(batch)

實際發生的步驟

  1. DataLoader自動調用dataset.__len__()獲取數據總量(這里是4)
  2. 根據batch_size=2生成索引序列(如[1,3][0,2],因shuffle=True而隨機)
    • 索引生成邏輯
    • PyTorch通過以下設計保證索引不重復:
      • 采樣器隔離:每個epoch生成獨立的隨機排列。
      • 批次切割:按固定步長切分排列,避免交叉。
      • 全局控制Sampler嚴格管理索引分配。
  3. 對每個索引調用dataset.__getitem__(idx)
    • 第一次取idx=1idx=3 → 返回2040
    • 自動堆疊為張量tensor([20, 40])
  4. 輸出結果示例:
    tensor([20, 40])  # 第一批
    tensor([10, 30])  # 第二批
    
4. 關鍵點圖解
數據集: [10, 20, 30, 40]│   │   │   │
索引:     0   1   2   3DataLoader操作:
1. 隨機選索引(如[1,3]) → 取數據2040 → 堆疊為tensor([20, 40])
2. 隨機選索引(如[0,2]) → 取數據1030 → 堆疊為tensor([10, 30])
5. 如果數據是元組

假設每個樣本是(用戶ID, 物品ID)

class PairDataset(Dataset):def __init__(self):self.pairs = [(1,101), (2,102), (3,103)]  # (用戶, 物品)def __len__(self):return len(self.pairs)  # 必須實現:返回數據總量def __getitem__(self, idx):return self.pairs[idx]  # 返回一個元組loader = DataLoader(PairDataset(), batch_size=2)
for batch in loader:print(batch)

輸出:

# 每個元組字段自動堆疊
[tensor([1, 2]), tensor([101, 102])]  # 第一批
[tensor([3]), tensor([103])]          # 第二批(最后不足batch_size)

總結

  1. Dataset:定義數據存儲和單個樣本獲取方式(必須實現__len____getitem__
  2. DataLoader
    • 根據batch_size生成索引
    • 自動調用__getitem__獲取數據
    • 將樣本堆疊成批次張量
  3. 核心特性
    • 支持多進程加速(num_workers參數)
    • 自動打亂數據(shuffle=True
    • 靈活處理各種數據結構(標量、元組、字典等)

這就是PyTorch數據加載的核心機制!其他復雜功能都是基于這個簡單流程的擴展。

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

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

相關文章

xsync腳本是一個基于rsync的工具

xsync腳本是一個基于rsync的工具,用于在集群間高效同步文件或目錄。以下是xsync腳本的詳細使用方法和配置步驟: 一、xsync腳本的作用 xsync腳本可以快速將文件或目錄分發到集群中的多個節點,避免了手動逐臺復制文件的繁瑣操作。它利用rsync…

250408_解決加載大量數據集速度過慢,耗時過長的問題

250408_解決加載Cifar10等大量數據集速度過慢,耗時過長的問題(加載數據時多線程的坑) 在做Cifar10圖像分類任務時,發現每個step時間過長,且在資源管理器中查看顯卡資源調用異常,主要表現為,顯卡…

Ansible的使用2

#### 一、Ansible變量 ##### facts變量 > facts組件是Ansible用于采集被控節點機器的設備信息,比如IP地址、操作系統、以太網設備、mac 地址、時間/日期相關數據,硬件信息等 - setup模塊 - 用于獲取所有facts信息 shell ## 常用參數 filter…

多模態大語言模型arxiv論文略讀(六)

FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文標題:FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文作者:Zhen Wang, Da Li, Yulin Su, Min Yang,…

MySQL深入

體系結構 連接層:主要處理客戶端的連接進行授權認證、校驗權限等相關操作 服務層:如sql的接口、解析、優化在這里完成,所有跨存儲引擎的操作在這里完成 引擎層:索引是在存儲引擎層實現的,所以不同的存儲引擎他的索引…

智能 SQL 優化工具 PawSQL 月度更新 | 2025年3月

📌 更新速覽 本月更新包含 21項功能增強 和 9項問題修復,重點提升SQL解析精度與優化建議覆蓋率。 一、SQL解析能力擴展 ? 新增SQL語法解析支持 SELECT...INTO TABLE 語法解析(3/26) ALTER INDEX RENAME/VISIBLE 語句解析&#…

數組劃分使元素總和最接近

0劃分 - 藍橋云課 將一個數組劃分為兩個元素總和最接近的兩個數組 要使得兩組權值的乘積最大,根據數學原理,當兩組權值越接近時,它們的乘積就越大。因此,可以將這個問題轉化為一個 0 - 1 背包問題,把所有數的總和的一…

多線程代碼案例(線程池)- 4

目錄 引入 標準庫中的線程池 -- ThreadPoolExecutor 研究一下這個方法的幾個參數 1. int corePoolSize 2. int maximumPoolSize 3. long keepAliveTime 4. TimeUnit unit 5. BolckingQueue workQueue 6. ThreadFactory threadFactory 7. RejectedExecutionHandler h…

C,C++,C#

C、C 和 C# 是三種不同的編程語言,雖然它們名稱相似,但在設計目標、語法特性、運行環境和應用場景上有顯著區別。以下是它們的核心區別: 1. 設計目標和歷史 語言誕生時間設計目標特點C1972(貝爾實驗室)面向過程&#…

nginx 代理 https 接口

代碼中需要真實訪問的接口是:https://sdk2.028lk.com/application-localizationdev.yml文件中配置: url: http:/111.34.80.138:18100/sdk2.028lk.com/該服務器111.34.80.138上 18100端口監聽,配置信息為: location /sdk2.028lk.c…

數據結構實驗3.1:順序棧的基本操作與進制轉換

文章目錄 一,問題描述二,基本要求三,算法分析四,示例代碼五,實驗操作六,運行效果 一,問題描述 在數據處理中,常常會遇到需要對鏈接存儲的線性表進行操作的情況。本次任務聚焦于將鏈…

經典頻域分析法(Bode圖、Nyquist判據) —— 理論、案例與交互式 GUI 實現

目錄 經典頻域分析法(Bode圖、Nyquist判據) —— 理論、案例與交互式 GUI 實現一、引言二、經典頻域分析方法的基本原理2.1 Bode 圖分析2.2 Nyquist 判據三、數學建模與公式推導3.1 一階系統的頻域響應3.2 多極系統的 Bode 圖繪制3.3 Nyquist 判據的數學描述四、經典頻域分析…

Vue知識點(5)-- 動畫

CSS 動畫是 Vue3 中實現組件動畫效果的高效方式,主要通過 CSS transitions 和 keyframes 動畫 CSS Keyframes(關鍵幀動畫) 用來創建復雜的動畫序列,可以精確控制動畫的各個階段。 核心語法: keyframes animationNa…

小型園區網實驗

劃分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents構建Gradio及Gradio Tools(6)——創建自己的GradioTool

使用LangChain Agents構建Gradio及Gradio Tools(6)——創建自己的GradioTool 本篇摘要16. 使用LangChain Agents構建Gradio及Gradio Tool16.6 創建自己的GradioTool16.6.1 創建步驟16.6.2 創建示例StableDiffusionTool參考文獻本章目錄如下: 《使用LangChain Agents構建Grad…

SDL顯示YUV視頻

文章目錄 1. **宏定義和初始化**2. **全局變量**3. **refresh_video_timer 函數**4. **WinMain 函數**主要功能及工作流程:總結: 1. 宏定義和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 請求畫面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基礎教學:隨機抽取花名冊,不能重復

一.核心代碼: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["張三", &quo…

軟考 系統架構設計師系列知識點 —— 設計模式之抽象工廠模式

本文內容參考: 軟考 系統架構設計師系列知識點之設計模式(2)_系統架構設計師中考設計模式嗎-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致謝! Abstract Fac…

P2040 打開所有的燈

題目背景 pmshz在玩一個益(ruo)智(zhi)的小游戲,目的是打開九盞燈所有的燈,這樣的游戲難倒了pmshz。。。 題目描述 這個燈很奇(fan)怪(ren),點一下就會將這個燈和其周圍四盞燈的開關狀態全部改變。現在你的任務就是就是告訴pmshz要全部打開…

漢得企業級 PaaS 平臺 H-ZERO 1.12.0 發布!四大維度升級,構建企業數字化新底座

漢得企業級 PaaS 平臺(以下簡稱"H-ZERO")是一款基于微服務架構的企業級數字化 PaaS 平臺,可支持企業各類系統搭建、產品研發,幫助企業快速構架技術中臺。 H-ZERO于2025年3月底正式發布 V1.12.0 ,此次發布聚…