本文主要介绍py torch . data(py torch中的数据集),下面一起看看py torch . data(py torch中的数据集)相关资讯。
本节参考小土丘的pytorch入门视频教程。建议学习时多读源代码。你可以通过源代码中的注释快速找出一个类或函数的功能以及输入输出的类型。
dataset#借用dataset可以快速访问深度学习所需的数据。例如,我们需要访问以下培训数据:
其中,训练数据集存储在train中,蚂蚁和蜜蜂都是它们所包含的图片数据的文件夹名和标签,验证数据集存储在val中。
如果我们希望数据集类实现以下数据访问形式:
dataset = my dataset( 根目录 , 标签目录 )img,label = dataset [0] #我们只需要继承dataset类,并重写__getitem__(必需的)和__len__(建议的)方法。可以通过在交互模式下执行以下语句来查看详细信息:
从torch.utils.data导入数据集帮助(dataset) #还是执行数据集??#或者在pycharm中按住ctrl点击dataset直接查看源代码。输出如下所示:
表示: class : ` dataset &;的抽象类。所有表示从键到数据样本的映射的数据集都应该对其进行子类化。所有子类都应该覆盖: methe cho 6-@ . com `_ _ getitem _ _ `,支持为给定键提取数据样本。子类还可以选择覆盖: methe cho 6-@ . com `_ _ len _ _ `,这将返回数据集大小的许多: class cho 6-@ . com `~torch . utils . data . sampl:class: ` ~ torch . utils . data . data loader `的实现和默认选项.定义mydataset类:# import os from torch . utils . data import dataset from torch . utils . data . dataset import t _ co from pil import image class my datas: d: 得到了所有的图像文件名:参数root_dir:数据路径:参数lab:标签 self . root _ d . ir = root _ dir self . label _ dir = label _ dir self . data _ dir = os . path . join(self . root _ dir,self . label _ dir)self . img _ names = os . listdir(self . data _ dir)def _ _ getitem _ _(self,index)-t_co: 只能通过下标访问数据集:参数ind:下标:r: img(pil)。标签 img _ nam: return len(self . img _ names)使用我的数据集。class #以交互模式导入mydataset并执行以下语句:
ants _ dataset = my dataset( 数据集/训练 , 蚂蚁 )#创建数据集bees _ dataset = my dataset( 数据集/训练 , 蜜蜂 )img,label = ants _ dataset[47]# access data len(bees _ dataset)# get dataset length img . show# display picture dataset = ants _ dataset bees _ dataset # add dataset tensor board # tensor board可以用来记录一些数据(标量、图片等。)以日志的形式在训练模型时生成,同时也可以将记录的数据可视化,方便我们对现有模型进行分析。比如借助tensorboard,记录并可视化损失函数随训练周期的下降过程。
要使用tensorboard,必须首先通过以下命令将其安装在conda环境中:
conda安装tensorboard记录标量)#记录标量需要使用torch.utils.tensorboard中summarywriter类的add_scalar方法
创建并执行以下python脚本:
来自火炬。utils。tensorboard导入摘要writer #参数:log_dir,存储日志的路径名writer = summary writer( 日志 )#记录曲线y = x 2 #参数1:标签,数据标识符#参数2: scalar_valu: writer中i的x轴数据。add _ scalar( y = x 2 ,i * * 2,i) #调用close确保数据刷新到磁盘写入器。close脚本成功执行后,将在脚本文件所在的当前路径下创建一个logs文件夹,并生成一个日志文件。成功生成日志后,在conda环境中执行以下命令以启动tensorboard可视化服务:
#指示日志存储的位置和服务启动时使用的端口。默认端口为6006#多人使用同一台服务器时,应避免以下两个tensorboa值相同的参数。rd-logdir = second/logs-port = 6008该命令成功执行后,会给出以下提示:
在浏览器中打开上述链接以查看可视化效果:
注:tensorboard是根据不同标签可视化的。如果多次写入的日志具有相同的标记,可能会导致可视化出现问题。只需删除日志并重新生成它,然后重新启动可视化服务。
image)# image可以通过使用torch.utils.tensorboard中summarywriter类的add_image方法来记录
该方法定义如下:
def add _ image (self,tag,img _ tensor,global _ step = none,walltime = none,dataformats = chw )# tag (string)同上# img _ tensor (torch。张量、numpy.array或string/blobnam:图像数据# global _ st: step # data formats(string):图像数据格式。如果不是chw,您需要指定创建并执行以下python脚本:
从torch.utils.tensorboard导入摘要writer从pil导入图像import numpy as np writer = summary writer( 日志 )img _ path = e: \ \ code \ \ python \ \ py torch-learn \ \ dataset \ \ train \ \ ants \ \ 0013035 . jpg # img是pil . jpegimageplugin . jpegimagefile type img = image . open(img _ path)img _ array = np . array(img)writer . add _ image( 蚂蚁 ,img _ array,0,数据格式= hwc )后编剧的剧本。close执行成功,只需像之前一样启动可视化服务。
如果日志中相同标签标识的数据中有多个global _ steps,可以显示如下:拖动轴可以看到global _ steps之间的图像变化。
转换#transforms是位于torchvision包中的一个模块,模块中有很多类可以把要输入神经网络的数据进行转换,以满足网络的需要。
totensor#这个类可以将pil图像或numpy.ndarray转换成张量,以便于将图像输入神经网络。下面的代码做了一个简单的例子:将pil图像转换成张量后,借助tensorboard可以直接写入日志文件:
从torchvision导入转换从pil导入图像从torch.utils.t:/code/python/pytorch-learn/dataset/train/.蚂蚁 \ /6743948 _ 2b8c096dda.jpg img = image.open (img _ path) #将pil图像转换为张量类型# 1。划分输入数据形状w,h,c —— c,w,h# 2。将所有数字除以255。将数据规范化到[0,1] #实例就像方法一样被调用,其中实际调用的是totensor类中的__call__方法。# mor = trans _ to _ tensor(img)#将张量图像写入日志writer = summary writer( 日志 )使用tensorboard。writer . add _ image( img _张量 ,img _ tensor,1) writer.close启动tensorbard可视化服务并在浏览器中访问:
normalize#normalize类可以通过均值和标准差来归一化张量图像。这种构造函数定义如下:
#平均(sequenc:表示图像的每个通道的平均值的序列# std (sequenc:表示图像的每个通道的标准偏差的序列# inplac:是否原位修改tensordef _ _ init _ _ (self,mean,std,inplac:),这个类的具体归一化操作如下:
output[channel]=(input[channel]-mean[channel])/std[channel]对于任意通道,如果原始值为[0,1],传入均值为0.5,std为0.5,则归一化运算为:(value-0.5)/0.5 = 2*value-1,带入。
创建并执行以下脚本:
从torchvision导入转换从pil导入图像从torch.utils.tensorboard导入摘要writer#在转换模块trans _ to _ tenor = transforms中创建totensor类。totensor #在transforms模块中创建normalize类。三个通道的均值和标准差都是0.5 trans _ normalize = transforms . normalize([0.5,0.5,0.5],[0.5,0.5],0.5)#获取pil图像img _ path = :/code/python/pytorch-learn/dataset/train/ants\ /6743948 _ 2b 8 c 096 dda . jpg img = image.open (img _ path) #将pil图像转换为张量类型# 1。将所有数字除以255,将数据归一化为[0,1]img _ tensor = trans _ to _ tensor(img)# normalize tensor img _ normalize = trans _ normalize(img _ tensor)print(type(img _ normalize))# class ;火炬。张量与数学。;= #使用t。传感器板将张量图像写入日志日志 )writer . add _ image( 正常化 ,img _ normalize,1) writer.clos:要求的序列或输出大小#如果siz:创建并执行以下脚本:
从torchvision导入转换从pil导入图像从torch.utils.tensorboard导入摘要writer# totensor在转换模块trans _ to _ tensor = transforms中创建的类。totensor #在转换模块trans _ normalize = transforms中创建normalize类。normalize ([0.5,0.5,0.5],[0.5,0.5]) #创建resize类trans _ resize _ 52x 52 = transforms . resize((80,40)) trans _ resize _ 52 = transforms。获取pil图像img _ path = :/code/python/pytorch-learn/dataset/train/ants\ /6743948 _ 2b8c096。mg_path)#用tensor board writer = summary writer( 日志 )#将pil图像转换成张量类型# 1。输入数据形状w,h,c —— c,w,h# 2。将所有数字除以255,将数据归一化为[0,1]img _ tensor = trans _ to _ tensor(img)#第0步:记录张量图像writer . add _ image( img-tensor-normalize-resize _ 52x 52,img _ tensor,0)#归一化张量img _ normalize = trans _ normalize(img _ tensor)#第一步:记录归一化的图像写入器。添加图像( img-tensor-normalize-resize _ 52x 52,img_normalize,1)# resize img _ resize _ 52x 52 = trans _ resize _ 52x 52(img _ normalize)#第二步:记录(52,52)图像写入器。调整大小后添加图像( img-tensor-normalize-resize _ 52x 52,img _ resize _ 52x52,2) # pair (52,52)52)resize张量再次执行(52)的resize img _ resize 52 = trans _ resize 52(img _ resize 52 x52)#第三步:记录(52)。调整writer . add _ image( img-tensor-normalize-resize _ 52x 52,img _ resize _ 52,3) writer.close启动tensorbard可视化服务并在浏览器中访问它:
compose#在上一节的例子中,我们的图像处理基于一系列的变换。为了在每次转换执行后记录图像,我们在每两次转换之间插入一个图像记录操作。如果我们不这样做。;不需要在每次转换执行后记录图像,那么我们可以通过compose顺序执行一系列转换。
compose类的构造函数定义如下:
# trans froms(list of transform objects): # list d:)这个类的核心思想在于__call__函数:
def _ _ call _ _ (s: for t in s: img = t(img)return img with compose,为了得到上一节的最终结果,我们可以将上一节的脚本简化如下:
从torchvision导入转换从pil导入图像从torch.utils.tensorboard导入摘要writer# totensor在转换模块trans _ to _ tensor = transforms中创建的类。totensor #在转换模块trans _ normalize = transforms中创建normalize类。normalize ([0.5,0.5,0.5],[0.5,0.5]) #创建resize类trans _ resize _ 80x 40 = transforms . resize((80,40))trans _ resize _ 200 = transforms。resize (200) #创建合成类trans _ compose = transforms。compose ([trans _ to _ tensor,trans _ normalize,trans _ resize _ 80x40,trans _ resize _ 200]) #获取pil图像img _ path = e:/code/python/pytorch-learn/dataset/train/ants\ /6743948 _ 2b8c096dda。g _ path)# execute compose img _ compose = trans _ compose(img)# record合成的图像writer = summary writer( 日志 ).writer . add _ image( img-tensor-normalize-resize _ 80x 40-resize _ 200,img _ compose,0) writer.close启动tensorbard可视化服务并在浏览器中访问它:
transforms模块中还有许多其他转换类,它们可以在需要时查询文档。在查询文档时,理解类或函数的功能以及输入和输出类型是很重要的。
dataset和transforms的组合使用#在pytorch官网首页,按照不同的模块提供文档,包括:核心模块、音频模块、文本模块、可视化模块等。
在torchvision.datasets中,提供了对常用数据集的支持,可以帮助我们快速下载、解压和使用数据集:
以cifar10数据集为例,按照以下文档使用:
根据文档,如果要使用cifar10数据集,应该使用torch vision . datasets . cifs ar 10类,该类的构造函数需要传入以下参数:
# root (string):数据集所在的目录# train (bool,可选):tru测试集# transform (callable,optional):function/transform # target _ transform(callable,optional):目标的function/transform # download(bool,optional):如果为tru: str,train: bool = tru: optional[callabl: optional[callabl:·布尔= fals:根据文档中的__getitem__函数,我们知道当通过下标访问dataset时,会返回(image,target),即图像和图像的类型。
创建以下脚本并执行它(使用训练集):
导入torchvision# create transform,将pil图像转换为tensor data _ trans = torch vision . transforms . pose([torch vision . transforms . tot tensor])#建议下载始终为真。即使提前下载了数据集,如果下载很慢也可以复制控制台输出的下载地址。然后在迅雷#下载后将压缩包复制到根目录下下载地址也可以在火炬威视的源代码中查看。数据集。cifar10train _ set =火炬视觉。数据集。cifar 10(root = 。/dataset ,train = true,transform=data_trans,download=true)img,target = train _ set[0]print(type(img))# class ;torch.tensor = 打印(目标)# 6 #[ ;飞机与航空。;, 汽车与汽车。;,鸟 , 猫和猫。;, 鹿 , 狗和猫。;, 青蛙 , 马与马。;, 船舶与航空公司。;, 卡车 ]打印(train _ set。classes [target]) # frog创建以下脚本并执行它(。
import torch vision test _ set = torch vision . datasets . cifar 10(root = 。/dataset ,train=false,download=true)img,target = test _ set[0]img . showprint(type(img))# class ;pil.image.image= print(target)# 3 print(test _ set . class[target]) # catdataload:数据集类型dataset # batch _ siz:批处理大小,d: 1 # shuffl:每个历元后是否打乱数据,d: fals:加载数据时使用的子进程数,0表示使用主进程加载,d: 0。可以设置为cpu核心数# drop _ last (bool,可选):)。当数据个数不能被batch_siz:为fals: dataset[t _ co],batch_siz:可选[int] = 1,shuffl: bool = fals:可选[sampler] = none,batch_sampl:可选[sampler[sequenc: int = 0,collat:可选[_collate_fn_t] = none,pin _ memory: bool = false,drop _ last : boo= none,multiprocessing _ context = none,generator = none,*,prefetch_factor: int = 2,p:布尔= fals:创建并执行以下脚本:
导入torch vision from torch . utils . data导入dataloader from torch . utils . t: trans _ to _ tensor = torch vision . transforms . to tensortrain _ dataset = torch vision . datasets . cifar 10(root = 。/dataset ,transform = trans _ to _ tensor,download = true) # dataloader根据batch_size封装img和target,如图,train _ data loader = data loader(dataset = train _ dataset,batch_siz:的epoch,用于:的batch_num,batch _ data # print(epoch, : ,batch_num) batch_img,batch _ target = batch _ data writer . add _ images( cifr 10-batch 64-no _ shuffle-no _ drop _ last _ epoch { } 。format (epoch),batch _ img,batch _ num)writer . clos:。如果num_work: #这里插入了训练网络的全部代码...if _ _ nam:火车2。如果修改后代码仍然报错:os:[win:。
进入高级系统设置:
点击:高级-性能-设置:
点击:高级-更改:
如下图,将d盘的虚拟内存调整到系统管理的大小(重启后生效)。如果仍然报告错误,您可以将大小自定义为一个很大的值,如10gb-100gb。
脚本成功执行后,启动tensorbard可视化服务并在浏览器中访问:
step=170时:(日志比较大,可能需要在浏览器中刷新几次才能加载满)。
当步骤=781时:
因为我们在创建dataloader时,参数shuffle=false使得epoch0和epoch1之间同批次提取的图像相同;参数drop_last=false使最后一批图像即使小于64也不会被丢弃。
修改脚本,使shuffle=true,drop_last=true,然后再次执行脚本并启动tensorbard可视化服务。浏览器中的访问结果如下:
如图所示,从epoch0和epoch1之间的同一批次(780)提取的图像不同,丢弃第781批次。
标签:
图像数据
了解更多py torch . data(py torch中的数据集)相关内容请关注本站点。