pytorch Dataset and Datasetloader

在使用pytorch构架数据集的时候,使用torch.utils.data.Dataset和torch.utils.data.DataLoader会大大提高效率,且基本能满足需求。
这里主要记录个人对于torch.utils.data.Dataset和torch.utils.data.DataLoader的理解

1. torch.utils.data.Dataset:
pytorch对于Dataset的原始定义是比较简单的:
pytorch Dataset and Datasetloader
而我们在定义自己的数据集时,是继承这个类再进行的定义的,并且继承后一定要重写 __len__(self)和__getitem__(self, index)这两个函数,例如:
pytorch Dataset and Datasetloader
我认为这里最重要的就是我画横线的三个函数,也是自己新建的数据库中必须包含的三个函数。
__len__(): 这个比较还理解,返回文件的个数;
__init__(): 初始化函数,init里包含的性质也就是自己新建的数据集包含的性质;
__getitem__():  我认为这个函数是Dataset类最重要的一个函数。因为他决定了你之后用torch.utils.data.DataLoader之后返回的内容。开始我一直不知道这个函数在什么时候会被调用,因为在类内部找不到调用这个函数的地方,而它又不像__init__()会被默认调用。原来是在后面使用torch.utils.data.DataLoader时才会调用这个函数。后面说再详细点。
其他函数可以根据需要再常规定义。

 

2. torch.utils.data.DataLoader
Dataloader的定义复杂一些,函数也更多。
pytorch Dataset and Datasetloader|
在使用dataloader的时候:
pytorch Dataset and Datasetloader
pytorch Dataset and Datasetloader
在运行到画红线的地方会进入到Dataset的__getitem__()里面,返回的是一个迭代器,这个迭代器的内容是N个batch_size的数据,所以用 in 来得到各个batch的数据。
在读取数据的过程中,如果Dataset写不好,生成这个迭代器的过程是很费时间的,会减慢训练速度。