■人工智能编程:如何喂入样本数据到神经网络中训练?( 二 )


#transform对PIL Image进行的转换操作 , transform的输入是使用loader读取图片的返回对象
#target_transform`:对label的转换
#`loader`:给定路径后如何读取图片 , 默认读取为RGB格式的PIL Image对象
具体使用方式很简单 , 我们就不需要构建dataset了
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
dataset就是所有的样本 , 包括所有样本的特征和标签 ,
#dataset[0][1]获取第一个样本的标签
Dataset[0][0]为获取第一个样本的特征 , 也就是图片(tensor)
我们可以将tensor转成图片格式
to_img =transforms.ToPILImage()
a=to_img(dataset[0][0]*0.2+0.4)#转换为图片 , 0.2是标准差 , 0.4是均值
#plt.imshow(a)
#plt.show()
现在我们已经学会了两种图片的处理方式 , 分别为一个文件中有多个类别的 , 还有一个文件就是一个类别的 , 然后文件名就是类别 。
我们使用dataset一次只能取一个数据 , 想要一次取多个数据我们可以使用Dataset , 这样我们可以一次取一个batch-size
Dataset的函数定义如下:
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=default_collate, pin_memory=False, drop_last=False)
#dataset:加载的数据集对象
#sampler: 样本抽样 , 后续会详细介绍
# - num_workers:使用多进程加载的进程数 , 0代表不使用多进程
# - collate_fn: 如何将多个样本数据拼接成一个batch , 一般使用默认的拼接方式即可
# - pin_memory:是否将数据保存在pin memory区 , pin memory中的数据转到GPU会快一些
# - drop_last:dataset中的数据个数可能不是batch_size的整数倍 , drop_last为True会将多出来不足一个batch的数据丢弃
此时我们使用DataLoader来读取数据了:
dataloader =DataLoader(dataset,batch_size=3,shuffle=True,num_workers=0,drop_last=False)
dataiter=iter(dataloader)#dataiter为迭代器对象
imgs ,labels=next(dataiter)#取一个batchsize
#print(imgs.size())#torch.Size([3, 3, 224, 224])
现在有可能会出现这种问题 , 就是有问题的样本的问题 , 比如我们的数据图片中有一张样本是有问题的 , 那么此时在数据处理的过程中 , 如果某个样本无法读取 , 如果没有办法读取的话 , 那么我们执行dataset的getitem方法就会产生异常 , 那么程序就会停止 , 要想解决这个问题 , 我们可以新建一个数据集类 , 然后捕捉异常 , 然后返回None , 然后我们在dataloader中指定自己的collate_fn , 他会自动调用collate_fn来处理 , 所以我们只需要重写collate——fn方法就ok啦 。 具体过程如下:
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
定义我们自己的collate_fn
from torch.utils.data.dataloader import default_collate # 导入默认的拼接方式
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
下面我们创建一个数据集对象
dataset=NewDogCat('data/dogcat_wrong/',transforms=transform)
注意我们读取的数据data/dogcat_wrong中有一张图片是有问题的 , 那么就会报异常 , 那么NewDogCat就会被捕获到它 , 然后然后None
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
我们指定了collate_fn,在使用DataLoader读取数据的时候 , 它会帮助我们过滤掉那些有问题的数据(None) , 然后将没有问题的数据使用默认的拼接方式进行拼接(default_collate)


推荐阅读