深度学习2:加载数据集

前言:梯度下降与随机梯度下降

Epoch:对所有样本进行了一次前向传播和反正传播称为一次Epoch

Batch-Size:进行一次训练时用到的样本数量

Iteration:一次Epoch进行的训练次数。显然,Iteration=样本总数/Batch-Size

       在进行backward时要用到梯度下降算法,这时有两种方式:一是把所有样本的loss加和作为cost,求这个cost对参数的导数,从而确定参数经过训练后的变化情况。另一种方式是随机选用一个样本的loss,使用这个loss对参数的导数来确定后续参数,直到将全部的样本选取一遍。

        使用全部样本称为Batch,这种方式可以充分利用GPU的并行计算能力,即训练速度更快。

        而随机梯度下降可以克服鞍点,训练效果会更好

深度学习2:加载数据集_第1张图片

数据加载

1.图像数据获取

图像数据可以直接使用现有的数据集CIFAR10等,也可以从文件中加载。

1.1 现有数据集的加载

train_set = torchvision.datasets.CIFAR10(root='./data', train=True,
                                             download=False, transform=transform)
train_loader = torch.utils.data.DataLoader(train_set, batch_size=36,
                                               shuffle=True, num_workers=0)

       直接通过 torchvision.datasets.CIFAR10()来下载得到,root为数据集下载到的位置,train表示训练集,download表示是否需要下载,如已下载过则设为False,transform是对获取的数据进行预处理,在后文中介绍。

        torch.utils.data.DataLoader(),将已经加载好的数据分为很多个batch_size大小的数据,得到的train_loader是一个可迭代的对象,可以通过

for step, data in enumerate(train_loader, start=0):

来获取这些数据,每一组的step表示组序号,data表示这组batch的数据内容(data包含 数据,标签),若想使用这些数据,则需要用 label,img_data = data 来接收。

1.2 文件中数据集的加载

       torchvision已经预先实现了常用的Dataset,包括前面使用过的CIFAR-10,以及ImageNet、COCO、MNIST、LSUN等数据集,可通过诸如torchvision.datasets.CIFAR10来调用。而如果是自己的数据集则使用ImageFolder。ImageFolder假设所有的文件按文件夹保存,每个文件夹下存储同一个类别的图片,文件夹名为类名,其构造函数如下:

train_dataset = ImageFolder(root, transform=None, target_transform=None, loader=default_loader)
flower_list = train_dataset.class_to_idx
cla_dict = dict((val, key) for key, val in flower_list.items())

它主要有四个参数:

root:在root指定的路径下寻找图片
transform:对PIL Image进行的转换操作,transform的输入是使用loader读取图片的返回对象
target_transform:对label的转换
loader:给定路径后如何读取图片,默认读取为RGB格式的PIL Image对象

train_dataset.class_to_idx 返回一个字典,即{root下包含的第一个文件夹:0,root下包含的第二个文件夹名:1,root下包含的第三个文件夹名:2}。label是按照文件夹名顺序排序后存成字典,即{类名:类序号(从0开始)},一般来说最好直接将文件夹命名为从0开始的数字,这样会和ImageFolder实际的label一致,如果不是这种命名规范.

train_dataset.imgs 返回一个列表,(第一张图片的保存路径,属于的类型(0,1,2))...
 

1.3 数据预处理

import torchvision.transforms as transforms
transform = transforms.Compose([transforms.RandomResizedCrop(224),
                             transforms.RandomHorizontalFlip(),
                             transforms.ToTensor(),
                             transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

data = transform(image)

        获取PIL格式的image后,使用transforms.compose对image数据进行处理,可以让数据变成tensor格式,进行标准化,进行压缩等,具体的功能有很多。

你可能感兴趣的:(深度学习,python,机器学习)