iterations += 1 answer = model(batch) n_correct += (torch.max(answer, 1)[1].view(batch.label.size()).data == batch.label.data).sum() n_total += batch.batch_size train_acc = 100. * n_correct/n_total loss = criterion(answer, batch.label) loss.backward(); opt.step() if iterations % args.save_every == 0: snapshot_prefix = os.path.join(args.save_path, 'snapshot') snapshot_path = snapshot_prefix + '_acc_{:.4f}_loss_{:.6f}_iter_{}_model.pt'.format(train_acc, loss.data[0], iterations) torch.save(model, snapshot_path) for f in glob.glob(snapshot_prefix + '*'): if f != snapshot_path: os.remove(f) if iterations % args.dev_every == 0: model.eval(); dev_iter.init_epoch() n_dev_correct, dev_loss = 0, 0 for dev_batch_idx, dev_batch in enumerate(dev_iter): answer = model(dev_batch) n_dev_correct += (torch.max(answer, 1)[1].view(dev_batch.label.size()).data == dev_batch.label.data).sum() dev_loss = criterion(answer, dev_batch.label) dev_acc = 100. * n_dev_correct / len(dev) print(dev_log_template.format(time.time()-start, epoch, iterations, 1+batch_idx, len(train_iter), 100. * (1+batch_idx) / len(train_iter), loss.data[0], dev_loss.data[0], train_acc, dev_acc)) if dev_acc > best_dev_acc: best_dev_acc = dev_acc snapshot_prefix = os.path.join(args.save_path, 'best_snapshot') snapshot_path = snapshot_prefix + '_devacc_{}_devloss_{}__iter_{}_model.pt'.format(dev_acc, dev_loss.data[0], iterations) torch.save(model, snapshot_path) for f in glob.glob(snapshot_prefix + '*'):
# checkpoint model periodically if iterations % args.save_every == 0: snapshot_prefix = os.path.join(args.save_path, 'snapshot') snapshot_path = snapshot_prefix + '_acc_{:.4f}_loss_{:.6f}_iter_{}_model.pt'.format( train_acc, loss.item(), iterations) torch.save(model, snapshot_path) for f in glob.glob(snapshot_prefix + '*'): if f != snapshot_path: os.remove(f) # evaluate performance on validation set periodically if iterations % args.dev_every == 0: # switch model to evaluation mode model.eval() dev_iter.init_epoch() # calculate accuracy on validation set n_dev_correct, dev_loss = 0, 0 with torch.no_grad(): for dev_batch_idx, dev_batch in enumerate(dev_iter): answer = model(dev_batch) n_dev_correct += (torch.max(answer, 1)[1].view( dev_batch.label.size()) == dev_batch.label ).sum().item() dev_loss = criterion(answer, dev_batch.label) dev_acc = 100. * n_dev_correct / len(dev) print( dev_log_template.format(
loss.backward(); opt.step() # checkpoint model periodically if iterations % args.save_every == 0: snapshot_prefix = os.path.join(args.save_path, 'snapshot') snapshot_path = snapshot_prefix + '_acc_{:.4f}_loss_{:.6f}_iter_{}_model.pt'.format(train_acc, loss.item(), iterations) torch.save(model, snapshot_path) for f in glob.glob(snapshot_prefix + '*'): if f != snapshot_path: os.remove(f) # evaluate performance on validation set periodically if iterations % args.dev_every == 0: # switch model to evaluation mode model.eval(); dev_iter.init_epoch() # calculate accuracy on validation set n_dev_correct, dev_loss = 0, 0 with torch.no_grad(): for dev_batch_idx, dev_batch in enumerate(dev_iter): answer = model(dev_batch) n_dev_correct += (torch.max(answer, 1)[1].view(dev_batch.label.size()) == dev_batch.label).sum().item() dev_loss = criterion(answer, dev_batch.label) dev_acc = 100. * n_dev_correct / len(dev) print(dev_log_template.format(time.time()-start, epoch, iterations, 1+batch_idx, len(train_iter), 100. * (1+batch_idx) / len(train_iter), loss.item(), dev_loss.item(), train_acc, dev_acc)) # update best valiation set accuracy