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


专栏推荐
正文
PyTorch提供了很多工具使得数据的读取和预处理变得很容易 , 我们需要定义一个类 , 当然这个类要继承抽象类Dataset , 此时我们需要重写两个方法__len__(提供数据集大小的方法)和__getitem__(支持从0到len(self)整数索引的方法),我们这两个方法需要我们自己来写 , 一个要完成数据集大小的计算 , 另外一个要完成根据索引来获取数据集的样本和标签 。
from torch.utils.data import Dataset
class myDataset(Dataset):
def __init__ (self, csv_file, txt_file, root_dir, other_file) :
self.csv_data = http://news.hoteastday.com/a/pd.read_csv(csv_file)
with open(txt_file, 'r' ) as f:
data_list = f.readlines( )
self.txt_data = http://news.hoteastday.com/a/data_list
self.root_dir = root_dir
def __len__ (self):
return len(self.csv_data)
def __getitem__ (self,idx) :
data = http://news.hoteastday.com/a/(self. csv_data [idx],self.txt_data[idx])
return data
这样我们就定义了数据类 , 我们此时可以通过迭代的方式来获取每一个数据 , 但是这样很难实现取 batch ,shuffle 或者是多线程去读取数据 , 此时我们需要定义一个新的迭代器 , 通过 torch.utils.data.DataLoader 来实例化新的迭代器如下:
dataiter = DataLoader(myDataset, batch_size=32, shuffle=True ,
collate_fn=default_collate)
里面的参数都特别清楚 , 只有 collate_fn 是表示如何取样本的 , 我们可以定义自己的函数来准确地实现想要的功能 , 当然使用默认的也是可以的 。
现在有一个数据集是这样的
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
这里面有三个文件 , 一个文件是dogcat , 里面有四只猫和四只狗的图片
还有一个文件夹是dogcat2 , 里面有两个文件夹 , dog和cat , 里面分别有四张图片
还有一个文件夹是dogcat_wrong , 这里面有8张正常的猫和狗的图片 , 还有一张异常的
每张图片的命令格式为类别.数字.jpg
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
现在我们将学习如何根据这些文件构建dataset , 以及如何处理异常样本
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
init方法需要将图片名称放到属性上 , 而getitem需要根据图片名称真实获取到图片 , 并且转成tensor类型
此时虽然获取到了样本 , 但是每个图片的大小不一样 , 那么我们需要在获取的同时还能够对图片进行处理 , 将其处理为相同大小的图片 。 可以使用工具包torchvision来完成这个任务 , 我们可以构建一个transform , 然后在getitem的方法里面对其进行处理
■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图

■人工智能编程:如何喂入样本数据到神经网络中训练?
本文插图
这种情况比较复杂 , 就是一个文件夹中有多种类别的数据 , 但是有一种情况比较好处理 , 就是一个文件夹下只有一个类别的数据 , 而此时文件夹的名称就是这些数据的类别 , 如果要是这样的话 , 我们可以使用另外一种方式来解决这个问题
ImageFolder(root, transform=None, target_transform=None, loader=default_loader)
ImageFolder的参数的含义就是这样的:
#root在指定的路径下寻找图片


推荐阅读