1.类值num_classes修改
常见英文num_classes修改成自己做多少的分类,model.py还是train.py、predicte.py文件里如有都需要修改。
2.训练优先使用GPU
下面这语句是经常看到
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("using {} device.".format(device))
3.数据的预处理(训练集和测试集)
data_transform = {
"train": transforms.Compose([transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]),
transforms.RandomResizedCrop:#将图片用随机裁剪方法裁剪成224*224
transforms.RandomHorizontalFlip():#在水平方向随机翻转
transforms.ToTensor():#将它转化成tnesor
transforms.Normalize:#将数据进行标准化处理
4.数据的加载
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=1, shuffle=False, sampler=None,
batch_sampler=None, num_workers=0, collate_fn=None,
pin_memory=False, drop_last=False, timeout=0,
worker_init_fn=None, *, prefetch_factor=2,
persistent_workers=False)
train_dataset:必须首先使用数据集构造 DataLoader 类。一开始命为训练集文件夹被它处理过。
batch_size: 批量加载的样本数。
shuffle :每个epoch是否重新整理数据,将训练模型的数据集进行打乱的操作。
sampler :指的是可选的 torch.utils.data.Sampler 类实例。采样器定义了检索样本的策略,顺序或随机或任何其他方式。使用采样器时应将 shuffle 设置为 false。
batch_sampler :批处理级别。
num_workers :加载数据所需的子进程数。
collate_fn :将样本整理成批次。Torch 中可以进行自定义整理。
pin_memory:拷贝数据到 CUDA Pinned Memory。
5.训练基本设置参数
lr:学习率,一般设置有0.1,0.01,0.001,0.0001,0.000002等,根据损失和正确率调整
epochs:迭代次数
优化器也可以换
补:
epoch:训练时,所有训练数据集都训练过一次。
batch_size:在训练集中选择一组样本用来更新权值。1个batch包含的样本的数目,通常设为2的n次幂,常用的包括64,128,256。 网络较小时选用256,较大时选用64。
iteration:训练时,1个batch训练图像通过网络训练一次(一次前向传播+一次后向传播),每迭代一次权重更新一次;测试时,1个batch测试图像通过网络一次(一次前向传播)。所谓iterations就是完成一次epoch所需的batch个数
假如 数据集有 50000 张训练图片,10000 张测试图片。现在选择 Batch Size = 256 对模型进行训练。
每个 Epoch 要训练的图片数量:50000
训练集具有的 Batch 个数:50000 / 256 = 195 + 1 = 196
每个 Epoch 需要完成的 Batch 个数:196
每个 Epoch 具有的 Iteration 个数:196
每个 Epoch 中发生模型权重更新的次数:196
训练 10 代后,模型权重更新的次数:196 * 10 = 1960
不同代的训练,其实用的是同一个训练集的数据。第 1 代和第 10 代虽然用的都是训练集的五万张图片,但是对模型的权重更新值却是完全不同的。因为不同代的模型处于代价函数空间上的不同位置,模型的训练代越靠后,越接近谷底,其代价越小。