PyTorch_图片数据集

原文链接: https://www.cnblogs.com/CATHY-MU/p/7760992.html

1.CIFAR-10
CIFAR-10是多伦多大学提供的图片数据库,图片分辨率压缩至32x32,一共有10种图片分类,均进行了标注。适合监督式学习。CIFAR10有60000张图片,其中50000张是训练集,10000张是测试集。数据下载网址:http://www.cs.toronto.edu/~kriz/cifar.html
PyTorch_图片数据集_第1张图片

2.ImageNet
ImageNet网站首页:http://image-net.org/
PyTorch_图片数据集_第2张图片

3.ImageFolder
ImageFolder网站首页:https://www.tugraz.at/institutes/icg/home/
PyTorch_图片数据集_第3张图片
4.LSUN Classification
PyTorch_图片数据集_第4张图片
5.COCO (Captioning and Detection)
PyTorch_图片数据集_第5张图片


为了方便加载以上五种数据库的数据,pytorch团队帮我们写了一个torchvision包。使用torchvision就可以轻松实现数据的加载和预处理。以使用CIFAR10为例:
(1)导入torchvision的库:

import torchvision
import torchvision.transforms as transforms  # transforms用于数据预处理

(2)使用datasets.CIFAR10()函数加载数据库。

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=None)
# root,表示cifar10数据的加载的相对目录
# train,表示是否加载数据库的训练集,false的时候加载测试集
# download,表示是否自动下载cifar数据集
# transform,表示是否需要对数据进行预处理,none为不进行预处理

靠命令台进程下载100多M的数据速度很慢,所以我们可以自己去到cifar10的官网上把CIFAR-10 python version下载下来,然后解压为cifar-10-batches-py文件夹,并复制到相对目录./data下。(若设置download=True,则程序会自动从网上下载cifar10数据到相对目录./data下,但这样小伙伴们可能要等一个世纪了),并对训练集进行加载(train=True)。
PyTorch_图片数据集_第6张图片
如上图所示,在脚本文件下建一个data文件夹,然后把数据集文件夹丢到里面去就好了,注意cifar-10-batches-py文件夹名字不能自己任意改。我们在写完上面三行代码后,在写一行print一下trainset的大小看看:

print (len(trainset))

#结果:50000

(3)训练神经网络时,使用的是mini-batch(一次输入多张图片),所以我们在使用一个叫DataLoader的工具为我们将50000张图分成每四张图一分,一共12500份的数据包。

#将训练集的50000张图片划分成12500份,每份4张图,用于mini-batch输入。shffule=True在表示不同批次的数据遍历时,打乱顺序(这个需要在训练神经网络时再来讲)。num_workers=2表示使用两个子进程来加载数据

import torch
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=False, num_workers=2)

print(len(trainloader))
# 结果:12500

(4)数据预处理,帮助我们加快神经网络的训练。数据归一化原因:https://blog.csdn.net/liuheng0111/article/details/52841838,数据预处理原因:https://blog.csdn.net/dcxhun3/article/details/47999281

# 预处理用到了transforms函数
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),])

compose函数会将多个transforms包在一起。transforms有好几种,例如transforms.ToTensor(), transforms.Scale()等。完整介绍:https://pytorch.org/docs/master/torchvision/transforms.html

1.ToTensor是指把PIL.Image(RGB) 或者numpy.ndarray(H x W x C) 从0到255的值映射到0到1的范围内,并转化成Tensor格式。
2.Normalize(mean,std)是通过下面公式实现数据归一化
channel=(channel-mean)/std

完整代码:

import torch
import torchvision
import torchvision.transforms as transforms
 
# torchvision输出的是PILImage,值的范围是[0, 1].
# 我们将其转化为tensor数据,并归一化为[-1, 1]。
transform=transforms.Compose([transforms.ToTensor(),
                             transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
                             ])
 
#训练集,将相对目录./data下的cifar-10-batches-py文件夹中的全部数据(50000张图片作为训练数据)加载到内存中,若download为True时,会自动从网上下载数据并解压
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=transform)
 
#将训练集的50000张图片划分成12500份,每份4张图,用于mini-batch输入。shffule=True在表示不同批次的数据遍历时,打乱顺序。num_workers=2表示使用两个子进程来加载数据
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=False, num_workers=2)
 
classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
 
print(len(trainset))
print(len(trainloader))
 
 
 
#下面是代码只是为了给小伙伴们显示一个图片例子,让大家有个直觉感受。
# functions to show an image
import matplotlib.pyplot as plt
import numpy as np
#matplotlib inline
def imshow(img):
    img = img / 2 + 0.5 # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1,2,0)))
    plt.show()
 
 
 
 
# show some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
 
# print images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s'%classes[labels[j]] for j in range(4)))

你可能感兴趣的:(PyTorch)