DataSet和DataLoader详解

0.总结

  • LawsonAbs的认知与思考,不一定完善和准确,还请各位读者怀批判思维阅读。
  • 使用Dataset提供数据集的封装,再使用Dataloader实现数据并行加载。
  • 持续更新~

1.DataSet类

1.1 题外话

torchvision.datasets 是用来进行数据加载的,PyTorch团队在这个包中帮我们提前处理好了很多很多图片数据集。像MNISTCOCO、 ImageFolder、 Imagenet-12、 CIFAR 。
torchvision.models 为我们提供了已经训练好的模型,可以直接加载使用。如:AlexNet 、VGG、 ResNet、 SqueezeNet、 DenseNet

使用Dataset 加载文本数据和图片数据的过程都是类似的。

  • 加载图片时是一张图一张图的加载,但是每张图片也有自己的大小,可能这个大小也会超过内存限制,但是没有办法,你必须能够让内存能够至少容纳一张图片的大小,否则就无法训练了。同时,也可以将若干个图片组合起来成一个batch,这样就可以按照batch进行训练。
  • 读取文本文件时,道理类似于读取图片
    如果有多个文本文件,我们就可以分开读【一个文件一个文件的读】
    如果一个文件足够小,那么就可以把这个文件读入到内存中,然后逐条返回。

2.DataLoader 类

2.1 用途

how to effectively and efficiently load data from a PyTorch Dataset into a PyTorch DataLoader.

2.2 定义

引用官方的doc:

Data loader. Combines a dataset and a sampler, and provides an iterable over the given dataset.

2.3 使用方法

一般实现一个 Dataset 对象,传入到dataLoader中;然后内部使用 yeild 返回每一次batch的数据。

DataSet和DataLoader详解_第1张图片
只要用pytorch 来训练模型,基本都会用到这个接口。该类的作用是:自定义的Dataset根据batch size大小、是否shuffle等封装成一个Batch Size大小的Tensor,用于后面的训练

DataSet和DataLoader详解_第2张图片

3.实例

下面结合一个实际数据来查看数据整合的过程。
假设如下这样定义DataLoader:

train_loader = DataLoader(feature,
                              batch_size=BATCH_SIZE,
                              shuffle=False,
                              num_workers=1)

并假设Dataset 中的数据是:

{'id': '196', 'movieId': '242', 'rate': '3'}
{'id': '186', 'movieId': '302', 'rate': '3'}
{'id': '22', 'movieId': '377', 'rate': '1'}
{'id': '244', 'movieId': '51', 'rate': '2'}
{'id': '166', 'movieId': '346', 'rate': '1'}
{'id': '298', 'movieId': '474', 'rate': '4'}

那么经过DataLoader()【batch_size = 5,shuffle=False】之后,得到的结果就是:

{'id': ['196', '186', '22', '244', '166'], 'movieId': ['242', '302', '377', '51', '346'], 'rate': ['3', '3', '1', '2', '1']}
...

如果Dataset 中的数据是:

['196', '242', '3']
['186', '302', '3']
['22', '377', '1']
['244', '51', '2']
['166', '346', '1']
['298', '474', '4']

那么得到的DataLoader 就是:

[('196', '186', '22', '244', '166'), ('242', '302', '377', '51', '346'), ('3', '3', '1', '2', '1')]

但Dataset 中往往存储的是tensor,所以最后根据Dataset 的数据

tensor([196, 242,   3])
tensor([186, 302,   3])
tensor([ 22, 377,   1])
tensor([244,  51,   2])
tensor([166, 346,   1])
tensor([298, 474,   4])

得到的就是:

tensor([[196, 242,   3],
        [186, 302,   3],
        [ 22, 377,   1],
        [244,  51,   2],
        [166, 346,   1]])

可以看到,我们就是用这个tensor 进行一个batch 的训练。
时刻想到,为了提高计算效率,就要把数据合成一个矩阵

你可能感兴趣的:(#,pytorch,深度学习,人工智能,pytorch)