pytorch训练ImageNet笔记(二)

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单独计算平均概率。

猜你喜欢

转载自blog.csdn.net/wu_x_j_/article/details/84251654
今日推荐