pytorch训练ImageNet笔记

 

一:准确度的计算

# 计算准确度
def accuracy(output, target, topk=(1,5)):
    """Computes the precision@k for the specified values of k
    prec1, prec5 = accuracy(output.data, target, topk=(1, 5))
    """
    maxk = max(topk)
    # size函数:总元素的个数
    batch_size = target.size(0) 

    # topk函数选取output前k大个数
    _, pred = output.topk(maxk, 1, True, True)
    ##########不了解t()k
    pred = pred.t()
    correct = pred.eq(target.view(1, -1).expand_as(pred))   
    res = []
    for k in topk:
        correct_k = correct[:k].view(-1).float().sum(0, keepdim=True)
        res.append(correct_k.mul_(100.0 / batch_size))

用到的pytorch函数:max、topk、eq

以top5,batch_size = 64为例:

1.topk()的使用:获取output中最大的5个数,如对第一张图片的output为[0.03,0.05,0.04,0.1.......(共1000个)],经过topk()后得到[0.2,0.19,0.18,0.17,0.16](不清楚是不是降序),共64张图片,可理解为一个5 X 64 的矩阵(其实是Tensor),每一列的数即为该张图片的预测值。

2.target为64个值,代表每张图片所属的类别,经过target.view()后变成[1,2,3,4,5,6,7.....],再经过expand_as(pred),该函数代表将target.view()扩展到跟pred相同的维度,可理解为5 X 64的矩阵,每一列的值都相同。

3.经过torch.eq()后,correct为一个5X64的矩阵,每一列仅有一个值为1,如第一列[0,0,1,0,0],代表top1错误,top3正确,每一行代表top-k的值,在for循环中,可自由选择k的值,当K的值为4时,取correct前4行,通过.float().sum()操作,计算top4中1的总个数,除以batch_size,则能得到top4的准确率。

(二)笔记二

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

1.训练过程中有可能会报错:

/storage/st8/public/python3/lib/python3.5/site-packages/PIL/TiffImagePlugin.py:747: UserWarning: Possibly corrupt EXIF data.  Expecting to read 1835008 bytes but only got 0. Skipping tag 0
  " Skipping tag %s" % (size, len(data), tag))

这是因为数据集中的某些图片有可能遭到了破坏,删除相关图片即可

2.刚开始训练的时候,没有接触过argparse包,该包是用来设定参数的,使用方法如下:

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值