python DataSet+ Dataloader 深度学习编程细节_数据集 pytorchDataset的构建与使用

  • 深度学习中许多网络的设计都需数据集的预处理功能辅助,本文对DataSet + Dataloader 的使用做介绍。

DataSet构建(简单示例)

        构建数据集需要继承torch.utils.data.dataset的Dataset类重写init,getitem(self, mask),len三个方法。然后使用torch.utils.data import DataLoader来加载你创建的数据集Dataset。

import argparse
import os
import random
import shutil
import time
import warnings
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.backends.cudnn as cudnn
import torch.distributed as dist
import torch.optim
import torch.utils.data
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models as models

import numpy as np
import os, imageio


from torch.utils.data.dataset import Dataset
class MyDataSet(Dataset):
    def __init__(self, data, label):#传入参数是我们的数据集(data)和标签集(label)
        self.data = data
        self.label = label
        self.length = data.shape[0]

    def __getitem__(self, mask):# 获取返回数据的方法,传入参数是一个index,也被叫做mask,就是我们对数据集的选择索引。在调用DataLoader时就会自己生成index,所以我们只需要写好方法即可。
        label = self.label[mask]
        data = self.data[mask]
        return label, data

    def __len__(self):
        # print(self.length)
        return self.length



train_set = MyDataSet(xb,yb)# xb,yb为所有的数据
# train_set = MyDataSet(data=X_train, label=Y_train)
num_epoch = 100     # number of epochs to train on
batch_size = 1024  # training batch size
train_data = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True)

class MLP(nn.Module):
    def __init__(self,depth=4,mapping_size=2,hidden_size=256):
        super().__init__()
        layers = []
        layers.append(nn.Linear(mapping_size,hidden_size))
        layers.append(nn.ReLU(inplace=True))
        for _ in range(depth-2):
            layers.append(nn.Linear(hidden_size,hidden_size))
            layers.append(nn.ReLU(inplace=True))
        layers.append(nn.Linear(hidden_size,3))
        self.layers = nn.Sequential(*layers)
    def forward(self,x):
        return torch.sigmoid(self.layers(x))
model = MLP()
for epoch in range(num_epoch ):
    model.train()
    for batchsz, (label, data) in enumerate(train_data):
        # i表示第几个batch, data表示该batch对应的数据,包含data和对应的labels
        print("第 {} 个Batch size of label {} and size of data{}".format(batchsz, label.shape, data.shape))

图像的分割处理数据集的构建

添加链接描述
添加链接描述

构建自监督任务的数据集(用一个数据集构建正负样本)

from torch.utils.data.dataset import Dataset
class MyDataSet(Dataset):
    def __init__(self, data, label):#传入参数是我们的数据集(data)和标签集(label)
        self.data = data
        self.label = label
        self.length = data.shape[0]

    def __getitem__(self, mask):# 获取返回数据的方法,传入参数是一个index,也被叫做mask,就是我们对数据集的选择索引。在调用DataLoader时就会自己生成index,所以我们只需要写好方法即可。
        label = self.label[mask]
        data = self.data[mask]
        return label, data

    def __len__(self):
        # print(self.length)
        return self.length

C&G

后续(+捕获异常)

image = np_load_frame(self.videos[video_name]['frame'][frame_name+i], self._resize_height, self._resize_width)
IndexError: list index out of range

先加个捕获异常:

    def __getitem__(self, index):
        video_name = self.samples[index].split('/')[-2]
        frame_name = int(self.samples[index].split('/')[-1].split('.')[-2])

        batch = []
        for i in range(self._time_step+self._num_pred):
            try:
                image = np_load_frame(self.videos[video_name]['frame'][frame_name+i], self._resize_height, self._resize_width)
            except :
                print('error from --- model utils')
                print(frame_name)
                print(i)
            if self.transform is not None:
                batch.append(self.transform(image))

        return np.concatenate(batch, axis=0)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BP神经网络是一种经典的人工神经网络模型,用于解决分类和回归问题。在Python中,我们可以使用一些库来构建和训练BP神经网络,例如PyTorch、Keras或TensorFlow。 对于BP神经网络,我们首先需要准备一个数据集数据集应该包含输入特征和对应的标签。特征可以是数字、文本或图像等形式,而标签则表示我们要预测的目标。通常,我们将数据集分为训练集和测试集,用于训练和评估模型的性能。 在Python中,我们可以使用PyTorch库来处理数据集和加载器。PyTorch提供了一个名为`torch.utils.data.Dataset`的类,用于定义自定义数据集。我们可以继承这个类并实现`__len__`和`__getitem__`方法来获取数据集的长度和索引对应的样本。 下一步是使用`torch.utils.data.DataLoader`类来创建数据加载器。数据加载器可以帮助我们以批量的方式加载数据,并提供多线程处理和数据打乱等功能。我们可以设置批量大小、是否打乱数据以及使用多个线程来加载数据。 以下是一个示例代码,展示了如何准备数据集和数据加载器: ```python import torch from torch.utils.data import Dataset, DataLoader # 定义自定义数据集 class MyDataset(Dataset): def __init__(self, data, targets): self.data = data self.targets = targets def __len__(self): return len(self.data) def __getitem__(self, index): x = self.data[index] y = self.targets[index] return x, y # 准备数据 data = [...] # 特征数据 targets = [...] # 标签数据 # 创建数据集 dataset = MyDataset(data, targets) # 创建数据加载器 batch_size = 32 shuffle = True num_workers = 4 dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=shuffle, num_workers=num_workers) ``` 在上面的示例中,`MyDataset`是一个自定义数据集,其中的`__len__`方法返回数据集的长度,`__getitem__`方法根据索引返回对应的特征和标签。然后,我们将数据集传递给`DataLoader`类来创建数据加载器,并设置了批量大小为32,打乱数据并使用4个线程进行加载。 通过使用数据集和数据加载器,我们可以方便地准备和加载数据,以供BP神经网络进行训练和评估。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值