Dataset
提供数据集的封装,再使用Dataloader
实现数据并行加载。torchvision.datasets 是用来进行数据加载的,PyTorch团队在这个包中帮我们提前处理好了很多很多图片数据集。像MNISTCOCO、 ImageFolder、 Imagenet-12、 CIFAR 。
torchvision.models 为我们提供了已经训练好的模型,可以直接加载使用。如:AlexNet 、VGG、 ResNet、 SqueezeNet、 DenseNet
使用Dataset 加载文本数据和图片数据的过程都是类似的。
how to effectively and efficiently load data from a PyTorch Dataset into a PyTorch DataLoader.
引用官方的doc:
Data loader. Combines a dataset and a sampler, and provides an iterable over the given dataset.
一般实现一个 Dataset 对象,传入到dataLoader中;然后内部使用 yeild 返回每一次batch的数据。
只要用pytorch 来训练模型,基本都会用到这个接口。该类的作用是:自定义的Dataset根据batch size大小、是否shuffle等封装成一个Batch Size大小的Tensor,用于后面的训练
下面结合一个实际数据来查看数据整合的过程。
假设如下这样定义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 的训练。
时刻想到,为了提高计算效率,就要把数据合成一个矩阵