个人觉得很巧妙的一些代码解释

1、预测标签与实际标签相同的统计-只针对某类标签,而不是统计所有标签,若是同时统计所有,则把[target == cat]删掉即可
classacc = pred_choice[target == cat].eq(target[target == cat].long().data).cpu().sum()

点击查看代码
#例如如下代码所示
pred_choice=torch.tensor([0,1,2,3,4,5,6,7,8,9])
target=torch.tensor([0,1,2,3,4,5,5,6,7,8])
target==5                  #输出tensor([False, False, False, False, False,  True,  True, False, False, False])
pred_choice[target==5]     #输出tensor([5, 6])
target[target==5]          #输出tensor([5, 5])
pred_choice[target==5].eq(target[target==5])          #输出tensor([ True, False])
pred_choice[target==5].eq(target[target==5]).sum()    #输出tensor(1)
pred_choice.eq(target.long().data).cpu().sum()        #输出tensor(6)

2、对网络中的lr和torch.nn.BatchNormNd(如..1d)中的momentum超参数进行动态的更改,如下
(另外补充:BatchNorm1d中的momentum作用-更新全局均值running_mean和方差running_var时使用该值进行平滑)

点击查看代码
#如初始化优化器
optimizer = torch.optim.Adam(
            classifier.parameters(),
            lr=args.learning_rate,
            betas=(0.9, 0.999),
            eps=1e-08,
            weight_decay=args.decay_rate
        )
 def bn_momentum_adjust(m, momentum):
        if isinstance(m, torch.nn.BatchNorm2d) or isinstance(m, torch.nn.BatchNorm1d):
            m.momentum = momentum
      
#在epoch中更改可通过:(其中LEARNING_RATE_CLIP和MOMENTUM_DECCAY_STEP都是预先设置好的超参数,作用就是保证一个最低阈值)
        lr = max(args.learning_rate * (args.lr_decay ** (epoch // args.step_size)), LEARNING_RATE_CLIP)
        for param_group in optimizer.param_groups:
            param_group['lr'] = lr
        momentum = MOMENTUM_ORIGINAL * (MOMENTUM_DECCAY ** (epoch // MOMENTUM_DECCAY_STEP))             #//-表示整除取因子
        if momentum < 0.01:                                                                             #保证momentum值不低于0.01
            momentum = 0.01 
        classifier = classifier.apply(lambda x: bn_momentum_adjust(x, momentum)) 

3、计算Iou的代码实例,Iou常用于分割的评价,注意np.sum只统计True的个数

posted @ 2021-12-29 09:10  原来是只呆燕  阅读(188)  评论(0)    收藏  举报