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


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)) 

相关