pytorch分批加载大数据集

pytorch分批加载大数据集

本文处理的数据特点:

(1)数据量大,无法一次读取到内存中

(2)数据是图片或者存储在csv中(每一行是一个sample,包括feature和label)

加载数据集需要继承torch.utils.data 的 Dataset类,并实现 __len__和__getitem__方法。其中

len:返回数据集总数,

getitem:返回指定的数的矩阵和标签。

加载图片

这段代码是一个使用 PyTorch 数据加载和处理机制的例子,主要用于从指定目录加载图片数据,并通过 DataLoader 进行批量处理。

python 复制代码
from torch.utils.data import Dataset, DataLoader
import torch
import glob
import os
from PIL import Image

class PictureLoad(Dataset):
    def __init__(self, paths, size=(10, 10)):
        self.paths = glob.glob(paths)
        self.size = size

    def __len__(self):
        return len(self.paths)

    def __getitem__(self, item):
        try:
            img = Image.open(self.paths[item]).resize(self.size)
            img_tensor = torch.from_numpy(np.asarray(img)).float() / 255.0  # 转为Tensor并归一化
            label = os.path.basename(self.paths[item]).split('.')[0]  # 更健壮的文件名提取方式
            return img_tensor, label
        except IOError:
            print(f"Error opening file: {self.paths[item]}")  # 处理文件打开错误
            return None, None

if __name__ == '__main__':
    root_path = os.path.join(os.path.dirname(os.getcwd()), "cap")
    pic_paths = os.path.join(root_path, '*.jpg')

    picture = Pictureload(pic_paths)
    dataloader = DataLoader(picture, batch_size=32, num_workers=2, timeout=2)

    for a, b in dataloader:
        print(b, a.shape)  # 输出标签和图片数据的尺寸,而不是原始数据

表格数据

确保数据以分批方式从文件中加载,且不会一次性将所有数据加载到内存中,适合处理大规模数据文件。

python 复制代码
import torch
from torch.utils.data import Dataset, DataLoader
import pandas as pd

class DataLoad(Dataset):
    def __init__(self, file_path, batch_size=3):
        '''
        初始化函数,设置文件路径和每批读取的数据大小。
        '''
        self.file_path = file_path
        self.batch_size = batch_size
        self.total_data = self._get_total_len()

    def _get_total_len(self):
        '''
        辅助函数用于计算文件中的数据行数。
        '''
        with open(self.file_path, 'r') as file:
            return sum(1 for line in file)

    def __len__(self):
        '''
        返回数据集的总长度。
        '''
        return self.total_data

    def __getitem__(self, idx):
        '''
        根据索引获取数据,每次从文件中动态加载数据。
        '''
        if idx * self.batch_size >= self.total_data:
            raise IndexError("Index out of range")

        skip_rows = idx * self.batch_size if idx > 0 else 0
        df = pd.read_csv(self.file_path, skiprows=skip_rows, nrows=self.batch_size, header=None)
        data_tensor = torch.tensor(df.values)
        return data_tensor

if __name__ == "__main__":
    dataset = DataLoad('path_to_your_data.csv', batch_size=32)
    dataloader = DataLoader(dataset, batch_size=1, shuffle=False, drop_last=False)

    for epoch in range(3):
        print(f"Epoch {epoch + 1}")
        for data in dataloader:
            print("Data Batch:")
            print(data)

对于两个batch_size的解释:假设 PretrainData 类每次通过其__getitem__ 方法返回一批数据,即32行数据(根据它的 batch_size=32 设定)。当您使用 DataLoader 并设置其 batch_size 为1时,意味着每次从 DataLoader 迭代得到的数据批将包含从 PretrainData 返回的1个独立批次。因此,每个从 DataLoader 返回的数据批将包含1*32=32条数据。

相关推荐
薛定猫AI12 分钟前
【深度解析】终端里的免费 AI 编程助手 Freebuff:多代理架构、模型路由与安全使用实战
人工智能·安全·架构
tedcloud1234 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
曦月逸霜6 小时前
啥是RAG 它能干什么?
人工智能·python·机器学习
AI医影跨模态组学6 小时前
Lancet Digit Health(IF=24.1)广东省人民医院刘再毅&南方医科大学南方医院梁莉等团队:基于可解释深度学习模型预测胶质瘤分子改变
人工智能·深度学习·论文·医学·医学影像·影像组学
应用市场6 小时前
AI 编程助手三强争霸(2026 版):Claude、Gemini、GPT 各自擅长什么?
人工智能·gpt
2301_769340677 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
AC赳赳老秦7 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
脑极体7 小时前
从Token消耗到DAA增长,AI价值标尺正在重构
人工智能·重构
csdn小瓯7 小时前
LangGraph自适应工作流路由机制:从关键词匹配到智能决策的完整实现
人工智能·fastapi·langgraph
QYR-分析7 小时前
高功率飞秒激光器行业发展现状、市场机遇及未来趋势分析
大数据·人工智能