当前位置:   article > 正文

python编程细节: 模型的训练与测试模式+变量管理AverageMeter()_typeerror: params argument given to the optimizer

typeerror: params argument given to the optimizer should be an iterable of t

inplace=False1

多使用inplace=False,否则可能报错:
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [1, 32, 22, 256, 256]], which is output 0 of ReluBackward1, is at version 3; expected version 2 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

对paramer迭代转为list

params = cof
TypeError: params argument given to the optimizer should be an iterable of Tensors or dicts, but got torch.FloatTensor
  • 1
  • 2
import  torch
cof = torch.eye(512)
params = list(cof) # list(model.encoder.parameters()) 
optimizer = torch.optim.Adam(params, 1e-4)
  • 1
  • 2
  • 3
  • 4

Pytorch遇到的坑——训练模式和测试模式切换

Pytorch的训练模式和测试模式切换
由于训练的时候Dropout和BN层起作用,每个batch BN层的参数不一样,dropout在训练时随机失效点具有随机性,所以训练和测试要区分开来。
使用时切记要根据实际情况切换:
model.train()
model.eval()
  • 1
  • 2
  • 3
  • 4
  • 5

train:如果model是train的状态,intermediate varaible和computation graph会被保留,这些将来都会在backprop的时候用来计算gradient。因此,速度会比eval慢。eval:如果model是eval的状态,intermediate variable和computation graph不会被保留。因此速度会比train快。


变量管理AverageMeter()(初始化,get/set方法)

在train函数中采用自定义的AverageMeter类来管理一些变量的更新
在初始化的时候就调用的重置方法reset。当调用该类对象的update方法的时候就会进行变量更新,当要读取某个变量的时候,可以通过对象.属性的方式来读取,比如在train函数中的top1.val读取top1准确率。

AverageMeter()的作用与用法

AverageMeter类来管理变量。在初始化的时候就调用的重置方法reset。当调用该类对象的update方法的时候就会进行变量更新,当要读取某个变量的时候,可以通过对象.属性的方式来读取,比如在train函数中的top1.val读取top1准确率。
AverageMeter可以记录当前的输出,累加到某个变量之中,然后根据需要可以打印出历史上的平均。

class AverageMeter(object):
    """Computes and stores the average and current value"""
    def __init__(self):
        self.reset()

    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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
这样在调用的时候,可以先声明
obj = AverageMeter()
需要将所有变量清零的时候,调用
obj.reset()
然后需要更新某个变量的时候
obj.update(x)
这样的话比如想要求平均,就可以直接用
obj.avg

def train(train_loader, model, criterion, optimizer, epoch):
    """Train for one epoch on the training set"""
    batch_time = AverageMeter()
    # measure elapsed time
    batch_time.update(time.time() - end)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

  1. 在这里插入图片描述 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/849375
推荐阅读
相关标签
  

闽ICP备14008679号