Epoch:对所有样本进行了一次前向传播和反正传播称为一次Epoch
Batch-Size:进行一次训练时用到的样本数量
Iteration:一次Epoch进行的训练次数。显然,Iteration=样本总数/Batch-Size
在进行backward时要用到梯度下降算法,这时有两种方式:一是把所有样本的loss加和作为cost,求这个cost对参数的导数,从而确定参数经过训练后的变化情况。另一种方式是随机选用一个样本的loss,使用这个loss对参数的导数来确定后续参数,直到将全部的样本选取一遍。
使用全部样本称为Batch,这种方式可以充分利用GPU的并行计算能力,即训练速度更快。
而随机梯度下降可以克服鞍点,训练效果会更好
图像数据可以直接使用现有的数据集CIFAR10等,也可以从文件中加载。
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 来接收。
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))...
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格式,进行标准化,进行压缩等,具体的功能有很多。