钢筋计数模型训练教学与实践 任务三:模型训练 1.定义训练超参,模型、日志保存路径 输入: 定义训练超参 numclasses 2 数据集中只有 steel 一个标签,加上背景,所以总共有2个类 maxepoch 25 默认值为1,调整为大于20的值,训练效果更佳 batchsize 4 ngpu 1 initiallr 0.01 imgdim 416 模型输入图片大小 trainsets [('2007', 'trainval')] 指定训练集 cfg VOCConfig rgbmeans (104, 117, 123) ImageNet数据集的RGB均值 savefolder './rebarcount/modelsnapshots' 指定训练模型保存路径 if not os.path.exists(savefolder): os.mkdir(savefolder) logpath os.path.join('./rebarcount/logs', datetime.now().isoformat()) 指定日志保存路径 if not os.path.exists(logpath): os.makedirs(logpath) 2.构建模型,定义优化器及损失函数 输入: net buildnet('train', imgdim, numclassesnumclasses) if ngpu > 1: net torch.nn.DataParallel(net) net.cuda() 本案例代码只能在GPU上训练 cudnn.benchmark True optimizer optim.SGD(net.parameters(), lrinitiallr, momentum0.9, weightdecay0) 定义优化器 criterion MultiBoxLoss(numclasses, overlapthresh0.4, priorformatchingTrue, bkglabel0, negminingTrue, negpos3, negoverlap0.3, encodetargetFalse) 定义损失函数 priorbox PriorBox(cfg) with torch.nograd(): priors priorbox.forward() priors priors.cuda() 3.定义自定义学习率函数 输入: def adjustlearningrate(optimizer, gamma, epoch, stepindex, iteration, epochsize): """ 自适应学习率 """ if epoch 20: torch.save(net.statedict(), os.path.join(savefolder, 'epoch' + repr(epoch).zfill(3) + 'loss'+ '%.4f' % loss.item() + '.pth')) batchiterator iter(data.DataLoader(dataset, batchsize, shuffleTrue, numworkers1, collatefndetectioncollate)) locloss 0 confloss 0 epoch + 1 loadt0 time.time() if iteration in stepvalues: stepindex + 1 lr adjustlearningrate(optimizer, 0.2, epoch, stepindex, iteration, epochsize) images, targets next(batchiterator) images Variable(images.cuda()) targets [Variable(anno.cuda()) for anno in targets]