PyTorch实现重写/改写Dataset并载入Dataloader


Posted in Python onJuly 14, 2020

前言

众所周知,Dataset和Dataloder是pytorch中进行数据载入的部件。必须将数据载入后,再进行深度学习模型的训练。在pytorch的一些案例教学中,常使用torchvision.datasets自带的MNIST、CIFAR-10数据集,一般流程为:

# 下载并存放数据集
train_dataset = torchvision.datasets.CIFAR10(root="数据集存放位置",download=True)
# load数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset)

但是,在我们自己的模型训练中,需要使用非官方自制的数据集。这时应该怎么办呢?

我们可以通过改写torch.utils.data.Dataset中的__getitem____len__来载入我们自己的数据集。
__getitem__获取数据集中的数据,__len__获取整个数据集的长度(即个数)。

改写

采用pytorch官网案例中提供的一个脸部landmark数据集。数据集中含有存放landmark的csv文件,但是我们在这篇文章中不使用(其实也可以随便下载一些图片作数据集来实验)。

import os
import torch
from skimage import io, transform
import numpy as np
import matplotlib.pyplot as plt
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils

plt.ion()  # interactive mode

torch.utils.data.Dataset是一个抽象类,我们自己的数据集需要继承Dataset,然后改写上述两个函数:

class ImageLoader(Dataset):
  def __init__(self, file_path, transform=None):
    super(ImageLoader,self).__init__()
    self.file_path = file_path
    self.transform = transform # 对输入图像进行预处理,这里并没有做,预设为None
    self.image_names = os.listdir(self.file_path) # 文件名的列表
    
  def __getitem__(self,idx):
    image = self.image_names[idx]
    image = io.imread(os.path.join(self.file_path,image))
#    if self.transform:
#    	image= self.transform(image)
    return image
         
  def __len__(self):
    return len(self.image_names)

# 设置自己存放的数据集位置,并plot展示    
imageloader = ImageLoader(file_path="D:\\Projects\\datasets\\faces\\")
# imageloader.__len__()       # 输出数据集长度(个数),应为71
# print(imageloader.__getitem__(0)) # 以数据形式展示
plt.imshow(imageloader.__getitem__(0)) # 以图像形式展示
plt.show()

得到的图片输出:

PyTorch实现重写/改写Dataset并载入Dataloader

得到的数据输出,:

array([[[ 66, 59, 53],
    [ 66, 59, 53],
    [ 66, 59, 53],
    ...,
    [ 59, 54, 48],
    [ 59, 54, 48],
    [ 59, 54, 48]],
    ...,
    [153, 141, 129],
    [158, 146, 134],
    [158, 146, 134]]], dtype=uint8)

上面看到dytpe=uint8,实际进行训练的时候,常常需要更改成float的数据类型。可以使用:

# 直接改成pytorch中的tensor下的float格式 
# 也可以用numpy的改成普通的float格式
to_float= torch.from_numpy(imageloader.__getitem__(0)).float()

改写完成后,直接使用train_loader =torch.utils.data.DataLoader(dataset=imageloader)载入到Dataloader中,就可以使用了。
下面的代码可以试着运行一下,产生的是一模一样的图片结果。

train_loader = torch.utils.data.DataLoader(dataset=imageloader)
train_loader.dataset[0]
plt.imshow(train_loader.dataset[0])
plt.show()

到此这篇关于PyTorch实现重写/改写Dataset并载入Dataloader的文章就介绍到这了,更多相关PyTorch重写/改写Dataset 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python使用pandas实现数据分割实例代码
Jan 25 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
Python3中的json模块使用详解
May 05 Python
Python应用领域和就业形势分析总结
May 14 Python
python获取Linux发行版名称
Aug 30 Python
python实现XML解析的方法解析
Nov 16 Python
Python数据可视化图实现过程详解
Jun 12 Python
Python如何实现远程方法调用
Aug 07 Python
利用Python+OpenCV三步去除水印
May 28 Python
python实现将中文日期转换为数字日期
Jul 14 #Python
Python实时监控网站浏览记录实现过程详解
Jul 14 #Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 #Python
python转化excel数字日期为标准日期操作
Jul 14 #Python
Python 实现将某一列设置为str类型
Jul 14 #Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 #Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 #Python
You might like
PHP通过COM使用ADODB的简单例子
2006/12/31 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
学习ExtJS form布局
2009/10/08 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
微信小程序模拟cookie的实现
2018/06/20 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
详解JavaScript 作用域
2020/07/14 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python基础知识小结之集合
2015/11/25 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
python中dict使用方法详解
2019/07/17 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
个人培训自我鉴定
2014/03/28 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书