pytorch包里提供了DataLoader与Dataset来对数据进行加载与分批,下面我们将定义一个类来进行数据集的加载:
//导入所需的库与函数
from torch.utils.Data import DataLoader,Dataset
import torchvision.transforms as transforms //转换图片的方法
import pandas as pd
import cv2 //读取图片
import os //生成图片的路径
train_hd=pd.read_csv('E:\\360downloads\\name.csv')//获取图片的名字我的csv文件储存在这里
train_path='E:\\360downloads\\train' //获取图片的路径(只需要读取到储存图片的文件夹就行了)
class Mydataset(torch.utils.Data):
def __init__(self,df_data,data_dir='./',transform=None):
super().__init__()
self.df=df_data.values
self.data_dir=data_dir
self.transforms=transforms
def __len__(self):
return len(self.df)
def __getiem__(self,idex):
img_name,label=self.df[idex]
img_path=os.path.join(self.data_dir,img_name)
image=cv2.imread(img_path)
if self.transform is not None:
image=self.transform(image)
return image,label //返回数据的标签与加载的数据。
__len__这样就可以len(dataset)返回数据集的大小。
__getitem__支持索引,以便dataset[i]可以用来获取i样本
此时的图片数据还没有进行标准化(便于梯度下降)以及增加噪声(增加噪声的目的是让训练出得模型鲁棒性更好),现利用transforms.Compose来整合处理图像数据的步骤:
transforms_train=transforms.Compose([
transforms.ToPILImage(),
transforms.RandomHorizontalFlip(), //水平翻转
transforms.RandomRotation(10), //随机旋转10度
transforms.ToTensor(), //将数据转换成Tensor型
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]) //标准化
更多transforms函数
在机器学习中,我们经常将数据分批次训练,以节省内存,有时当数据数量巨大时,也需要分批次训练或者测试,DataLoader是torch中提供的一个便捷的生成批次数据的方法。
train_data=MyDataset(train_hd,train_path,transform=transforms_train)
BATCH_SIZE=64
train_loader=DataLoader(train_data,batch_size=BATCH_SIZE,shuffer=True)
更多DataLoader参数 。
有了DataLoader,我们便可以将自己的图片数据输入神经网络中训练模型,也可以借此生成自己的训练集与验证集。