1.import torch.backends.cudnn as cudnn的作用:
cudnn.benchmark = true
总的来说,大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。
一般来讲,应该遵循以下准则:
(1)如果网络的输入数据维度或类型上变化不大,设置 torch.backends.cudnn.benchmark = true 可以增加运行效率;
(2)如果网络的输入数据在每次 iteration 都变化的话,会导致 cnDNN 每次都会去寻找一遍最优配置,这样反而会降低运行效率。一般情况下,如果输入大小不变,可以设置为True.(每次的输入形状相同,模型不改变)
2.在训练过程中,可设置set_epoch()使得在每个itertion开始的时候打乱数据的分布
3.shuffle:bool,可选。为True时表示每个epoch都对数据进行洗牌
4.sampler:Sampler,可选。从数据集中采样样本的方法。
5.collate_fn (callable, optional): 将一个list的sample组成一个mini-batch的函数
6.pin_memory (bool, optional): 如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内(CUDA pinned memory)中.
7.drop_last (bool, optional): 如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了… 如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。
8.target = target.cuda(async=True) # 这是一种用来包裹张量并记录应用的操作
9.args.resume这个参数主要是用来设置是否从断点处继续训练,比如原来训练模型训到一半停止了,希望继续从保存的最新epoch开始训练,因此args.resume要么是默认的None,要么就是你保存的模型文件(.pth)的路径。其中checkpoint = torch.load(args.resume)是用来导入已训练好的模型。model.load_state_dict(checkpoint[‘state_dict’])是完成导入模型的参数初始化model这个网络的过程,load_state_dict是torch.nn.Module类中重要的方法之一.
10.按照迭代的次数n输出前n次的top1与top5平均值:
top1.update(prec1[0], input.size(0)) #更新
top5.update(prec5[0], input.size(0)) #更新
class AverageMeter(object):
# Computes and stores the average and current value
"""
batch_time = AverageMeter()
即 self = batch_time
则 batch_time 具有__init__,reset,update三个属性,
直接使用batch_time.update()调用
功能为:batch_time.update(time.time() - end)
仅一个参数,则直接保存参数值
对应定义:def update(self, val, n=1)
losses.update(loss.data[0], input.size(0))
top1.update(prec1[0], input.size(0))
top5.update(prec5[0], input.size(0))
这些有两个参数则求参数val的均值,保存在avg中##不确定##
"""
def __init__(self):
self.reset() # __init__():reset parameters
def reset(self):
self.val = 0
self.avg = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):
self.val = val
self.sum += val * n
self.count += n
self.avg = self.sum / self.count
reset()代表初始化,在训练过程中,每次iterion都会进行top1与top5的更新,每次iterion将会加载batch_size个数据,通过pre1.update()计算每次的平均值,val代表本次iterion的预测值,self.sum代表总的概率(256*30%+256*40%+50*70%),self.count代表加载过的数据量(每次叠加),self.avg代表平均值(通过总概率除总数据量求得)。每个epoch单独计算平均概率。