2002年網(wǎng)站建設公司寧波做網(wǎng)站十大公司哪家好
鶴壁市浩天電氣有限公司
2026/01/24 08:25:44
2002年網(wǎng)站建設公司,寧波做網(wǎng)站十大公司哪家好,做圖書出版 外國網(wǎng)站,寧波企業(yè)網(wǎng)站排名優(yōu)化一、Dataset類的_getitem_和_len_方法 在 PyTorch 中#xff0c;torch.utils.data.Dataset 是所有自定義數(shù)據(jù)集的抽象基類#xff0c;它規(guī)定了數(shù)據(jù)集必須實現(xiàn)兩個核心方法#xff1a;__len__ 和 __getitem__。這兩個方法是 DataLoader 加載數(shù)據(jù)的基礎#xff0c;決定了數(shù)據(jù)…一、Dataset類的_getitem_和_len_方法在 PyTorch 中torch.utils.data.Dataset 是所有自定義數(shù)據(jù)集的抽象基類它規(guī)定了數(shù)據(jù)集必須實現(xiàn)兩個核心方法__len__ 和 __getitem__。這兩個方法是 DataLoader 加載數(shù)據(jù)的基礎決定了數(shù)據(jù)集的 “大小” 和 “如何按索引取樣本”。Dataset 類的核心作用Dataset 類的設計目標是封裝數(shù)據(jù)集的邏輯如數(shù)據(jù)讀取、預處理、標簽映射等對外暴露統(tǒng)一的接口讓 DataLoader 可以無感地加載、批量處理、打亂數(shù)據(jù)。自定義數(shù)據(jù)集時必須繼承 Dataset 并實現(xiàn) __len__ 和 __getitem__否則實例化會拋出 NotImplementedError。__getitem__ 方法1. 核心作用根據(jù)傳入的索引 index返回該索引對應的單個樣本通常是 “特征 標簽” 的組合。DataLoader 會循環(huán)調(diào)用該方法按索引取樣本并將多個樣本拼接成批次是數(shù)據(jù)加載的核心邏輯。2. 實現(xiàn)規(guī)則入?yún)H接收一個整數(shù) index范圍0 ≤ index __len__()返回值格式靈活常見形式元組(feature, label)最常用字典{feature: feature, label: label}多模態(tài) / 多特征場景更易讀單個值僅特征無監(jiān)督學習場景。3. 關(guān)鍵注意點索引合法性DataLoader 通常會保證 index 在 [0, __len__()-1] 范圍內(nèi)但自定義時建議避免越界預處理邏輯數(shù)據(jù)預處理如歸一化、圖像裁剪、文本分詞建議放在該方法中DataLoader 支持多進程加載預處理并行執(zhí)行效率更高數(shù)據(jù)類型返回的特征建議轉(zhuǎn)為 torch.Tensor方便后續(xù)模型計算標簽可根據(jù)需求保留 int/float 或轉(zhuǎn)為 Tensor。__len__ 方法1. 核心作用返回數(shù)據(jù)集的總樣本數(shù)量DataLoader 依賴該方法知道數(shù)據(jù)集的 “邊界”例如計算迭代輪次總樣本數(shù) / 批次大小隨機打亂時確定索引范圍。2. 實現(xiàn)規(guī)則無入?yún)H返回一個非負整數(shù)必須與數(shù)據(jù)集的實際樣本數(shù)一致否則會導致索引越界或數(shù)據(jù)加載不全。二、Dataloader類DataLoader 核心作用自動按 batch_size 從 Dataset 中取多個樣本拼接成批次數(shù)據(jù)如把多個 (feature, label) 拼接成 (batch_feature, batch_label)支持數(shù)據(jù)打亂shuffle避免模型過擬合支持多進程加載num_workers提升數(shù)據(jù)讀取效率尤其適合大數(shù)據(jù)集 / 硬盤讀取場景靈活的批次拼接邏輯collate_fn適配不同類型數(shù)據(jù)如變長文本、多模態(tài)數(shù)據(jù)支持內(nèi)存鎖頁pin_memory加速數(shù)據(jù)從 CPU 到 GPU 的傳輸。參數(shù)名作用與說明默認值dataset必須傳入的 Dataset 實例自定義 / 內(nèi)置均可DataLoader 基于它取樣本—batch_size每個批次的樣本數(shù)量1shuffle是否在每個 epoch 開始時打亂數(shù)據(jù)索引訓練集建議 True測試集建議 FalseFalsenum_workers用于數(shù)據(jù)加載的子進程數(shù)多進程加速0 表示主進程加載0drop_last若數(shù)據(jù)集總數(shù)不能被 batch_size 整除是否丟棄最后一個不完整批次Falsecollate_fn自定義批次拼接函數(shù)用于處理樣本的拼接邏輯如變長文本、自定義數(shù)據(jù)結(jié)構(gòu)Nonepin_memory是否將加載的數(shù)據(jù)存入 CUDA 鎖頁內(nèi)存GPU 訓練時設為 True加速傳輸Falsetimeout數(shù)據(jù)加載的超時時間秒防止子進程掛起0sampler自定義索引采樣策略優(yōu)先級高于 shuffleNonebatch_sampler自定義批次索引采樣策略與 batch_size/shuffle/sampler 互斥NoneDataLoader 工作原理索引生成根據(jù) Dataset.__len__() 獲取總索引范圍結(jié)合 shuffle/sampler 生成索引序列批次切分將索引序列按 batch_size 切分成多個批次索引如 [0,1], [2,3], [4]樣本讀取對每個批次的索引調(diào)用 Dataset.__getitem__(index) 獲取單個樣本批次拼接通過 collate_fn 將多個單個樣本拼接成批次數(shù)據(jù)默認拼接成 Tensor 矩陣多進程加速num_workers 0 時子進程并行執(zhí)行 “樣本讀取 預處理”主進程僅負責拼接和分發(fā)。核心結(jié)論Dataset類定義數(shù)據(jù)的內(nèi)容和格式即“如何獲取單個樣本”包括- 數(shù)據(jù)存儲路徑/來源如文件路徑、數(shù)據(jù)庫查詢。- 原始數(shù)據(jù)的讀取方式如圖像解碼為PIL對象、文本讀取為字符串。- 樣本的預處理邏輯如裁剪、翻轉(zhuǎn)、歸一化等通常通過transform參數(shù)實現(xiàn)。- 返回值格式如(image_tensor, label)。DataLoader類定義數(shù)據(jù)的加載方式和批量處理邏輯即“如何高效批量獲取數(shù)據(jù)”包括- 批量大小batch_size。- 是否打亂數(shù)據(jù)順序shuffle。三、MNIST手寫數(shù)字數(shù)據(jù)集import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加載數(shù)據(jù)的工具 from torchvision import datasets, transforms # torchvision 是一個用于計算機視覺的庫datasets 和 transforms 是其中的模塊 import matplotlib.pyplot as plt # 設置隨機種子確保結(jié)果可復現(xiàn) torch.manual_seed(42) # 1. 數(shù)據(jù)預處理該寫法非常類似于管道pipeline # transforms 模塊提供了一系列常用的圖像預處理操作 # 先歸一化再標準化 transform transforms.Compose([ transforms.ToTensor(), # 轉(zhuǎn)換為張量并歸一化到[0,1] transforms.Normalize((0.1307,), (0.3081,)) # MNIST數(shù)據(jù)集的均值和標準差這個值很出名所以直接使用 ]) # 2. 加載MNIST數(shù)據(jù)集如果沒有會自動下載 train_dataset datasets.MNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_dataset datasets.MNIST( root./data, trainFalse, transformtransform )作業(yè)# 1. 導入必要庫 import torch from torchvision import datasets, transforms import matplotlib.pyplot as plt import numpy as np # 2. 固定隨機種子可選保證結(jié)果一致 torch.manual_seed(42) # 3. 定義數(shù)據(jù)預處理CIFAR-10專用均值/標準差 # 說明CIFAR-10的全局均值和標準差是行業(yè)公認值標準化用 transform transforms.Compose([ transforms.ToTensor(), # 轉(zhuǎn)Tensor把0-255的PIL圖片→0-1的Tensor維度[C, H, W]3,32,32 transforms.Normalize( mean[0.4914, 0.4822, 0.4465], # R/G/B三通道均值 std[0.2470, 0.2435, 0.2616] # R/G/B三通道標準差 ) ]) # 4. 加載CIFAR-10數(shù)據(jù)集自動下載 # 訓練集 train_dataset datasets.CIFAR10( root./data, # 數(shù)據(jù)集保存路徑 trainTrue, # 加載訓練集False則加載測試集 downloadTrue, # 本地沒有則自動下載 transformtransform # 應用預處理 ) # 5. 關(guān)鍵提取單張圖片并可視化 # 5.1 取數(shù)據(jù)集第0個樣本特征Tensor 標簽 img_tensor, label_idx train_dataset[0] # img_tensor.shape [3,32,32]label_idx是0-9的整數(shù) print(f圖片Tensor形狀{img_tensor.shape}) # 輸出torch.Size([3, 32, 32]) print(f圖片標簽索引{label_idx}) # 輸出6對應類別“青蛙” # 5.2 定義CIFAR-10類別名稱對應索引0-9 cifar10_classes [ 飛機, 汽車, 鳥, 貓, 鹿, 狗, 青蛙, 馬, 船, 卡車 ] print(f圖片對應類別{cifar10_classes[label_idx]}) # 輸出青蛙 # 5.3 預處理還原因為Normalize后數(shù)值不在0-1需要反歸一化才能正常顯示 # 反歸一化公式img (img_tensor * std) mean mean np.array([0.4914, 0.4822, 0.4465]) std np.array([0.2470, 0.2435, 0.2616]) # Tensor→numpy維度從[C,H,W]→[H,W,C]matplotlib需要這個順序 img_np img_tensor.numpy().transpose((1, 2, 0)) img_np img_np * std mean # 反歸一化 img_np np.clip(img_np, 0, 1) # 確保數(shù)值在0-1之間避免歸一化后溢出 # 5.4 可視化圖片 plt.figure(figsize(4, 4)) # 設置圖片大小 plt.imshow(img_np) # 顯示圖片 plt.title(fLabel: {cifar10_classes[label_idx]} (索引{label_idx})) plt.axis(off) # 隱藏坐標軸 plt.show()浙大疏錦行