Dataset和Dataloader|读取图片

  • Dataset 加载数据集-使之支持索引
  • DataLoader方便使用的时候拿出一个Mini-Batch来使用

1.为什么是Mini-Batch

  • 罗翔老师喜欢说“正说反说折中说”,这里也是类似,我们使用一个样本的随机性来帮我们跨越鞍点(但速度太慢),使用Batch得到向量计算的优势,最大的提高计算速度(但准确率有差)。

  • 而Mini-Batch就是每次既不是取一个,也不是取全部。而是把全部的分成几组,取其中的一个,这样就能很好的均衡这两种的优势,达到效果和效率的均衡点。

2.与Mini-Batch相关的概念

  • Epoch训练的周期(即对全部的样本都参与了训练(前馈、反馈和更新))
  • Batchsize进行一次训练需要的样本数量
  • Iterations就是迭代次数、(iterable对象需要使用yield)
  • iterations=epoch/batchsize

3.dataloader

4.code

import torch
from torch.utils.data import Dataset
#Dataset是一个抽象类,抽象类不能实例化
#我们需要定义自己的类从这里继承,再构建自己实例化的类
from torch.utils.data import DataLoader
#处理数据处
class MyDataset(Dataset):
	def __init__(self,filepath):#filepath文件在哪
	#直接这里读数据没有必要,常常图片数据集都很大,不能都读到内存中
		pass
	def __getitem__(self,index):#getitem(for dataset[index])
		pass
	def __len__(self):
		pass
dataset=MyDataset("mytest.xyz")#具体自己写
trainloader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=2)

#在训练时
for epoch in range(100):
	for i,data in emumerate(train_loader,0):
	...

注意在window直接运行dataloader可能会报错,常常我们把它封装到if语句中如下:

if __name__ == '__main__':

5.pytorch

pytorch的datasets给我们提供了很多实例
在这里插入图片描述

在这里插入图片描述

来自B站刘二大人的pytorch实践课程

6.实战读取图片

具体的数据读取的时候可以使用OpenCV或者PIL两种方法,他们在具体的数据处理上也是不一样的,我更喜欢用PIL的方式。
使用(点击链接下载)UIEBD dataset数据集的raw-890为例()

import numpy as np
import torch
from torch.utils.data.dataset import Dataset
from torch.utils.data.dataloader import DataLoader
from torchvision.transforms import transforms
from pathlib import Path

from torch.utils.tensorboard import SummaryWriter
from PIL import Image

transform = transforms.Compose([
            transforms.Resize(350), #缩放图片保持长宽比不变,最短边为350像素
            transforms.CenterCrop(320), #从图片中间切出320*320的图片
            transforms.ToTensor(), #将图片(Image)转成Tensor,归一化至(0,1)
            #需要对OpenCV读取的图像进行归一化处理才能与PIL读取的图像一致


            #transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 
            #常用标准化  
        ])

class MyDataset(Dataset):
    def __init__(self,path,transform =None):
        images_pth = Path(path)
        image_list = list(images_pth.glob('*.png'))
        image_list_str = [str(x) for x in image_list]
        self.images = image_list_str


    def __getitem__(self, index):
        image_path = self.images[index]
        image = Image.open(image_path)
        image = transform(image)
        return image


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

dataset = MyDataset(path = "你的路径\\raw-890",transform=transforms)
dataloader = DataLoader(dataset, batch_size=128, shuffle=True, num_workers=0)#128迭代少一点,一定要先使用transform转换成tensor对象
writer = SummaryWriter("你的名字")
step = 0  
# 从test_loader中选取数据集data,其中data数据集是由dataloader加载器生成的以batch_size=128为单位的数据集
for data in dataloader:
    imgs = data 
    writer.add_images("dataloader", imgs, step)
    step = step + 1
writer.close()

输入tensorboard --logdir == " your name"就能显示出我们设置的dataloader了

在这里插入图片描述
在这里插入图片描述
当然最后一个batch_size如果不够的话,肯定是真的读到结尾而没有一个batch_size的大小了。😃

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值