(loader, model, crit, opt, epoch, labels, label_update=True)
| 192 | lr_scheduler.step() |
| 193 | |
| 194 | def train(loader, model, crit, opt, epoch, labels, label_update=True): |
| 195 | batch_time = AverageMeter() |
| 196 | losses = AverageMeter() |
| 197 | data_time = AverageMeter() |
| 198 | forward_time = AverageMeter() |
| 199 | backward_time = AverageMeter() |
| 200 | |
| 201 | # switch to train mode |
| 202 | model.train() |
| 203 | |
| 204 | end = time.time() |
| 205 | for i, (inputs, targets, index) in enumerate(loader): |
| 206 | data_time.update(time.time() - end) |
| 207 | inputs, targets = inputs.cuda(), targets.cuda() |
| 208 | outputs = model(inputs) |
| 209 | |
| 210 | # labels updated |
| 211 | if label_update: |
| 212 | predict = outputs.argmax(dim=1).data.cpu().numpy() |
| 213 | for index_item, pred in zip(index, predict): |
| 214 | labels[index_item] = int(pred) |
| 215 | |
| 216 | loss = crit(outputs, targets) |
| 217 | |
| 218 | # record loss |
| 219 | losses.update(loss.item(), inputs.size(0)) |
| 220 | |
| 221 | # compute gradient and do SGD step |
| 222 | opt.zero_grad() |
| 223 | loss.backward() |
| 224 | opt.step() |
| 225 | |
| 226 | # measure elapsed time |
| 227 | batch_time.update(time.time() - end) |
| 228 | end = time.time() |
| 229 | if args.verbose and (i % 100) == 0: |
| 230 | logger.info('Epoch: [{0}][{1}/{2}]\t' |
| 231 | 'LR: {3}\t' |
| 232 | 'Time: {batch_time.val:.3f} ({batch_time.avg:.3f})\t' |
| 233 | 'Data: {data_time.val:.3f} ({data_time.avg:.3f})\t' |
| 234 | 'Loss: {loss.val:.4f} ({loss.avg:.4f})' |
| 235 | .format(epoch, i, len(loader), opt.param_groups[0]['lr'], batch_time=batch_time, |
| 236 | data_time=data_time, loss=losses)) |
| 237 | |
| 238 | return losses.avg |
| 239 | |
| 240 | def compute_labels(dataloader, model, class_num, data_len, init_via_forward=False): |
| 241 | '''Pre-generate pseudo labels via network forward or uniformly assignment''' |
no test coverage detected