def run(net, logger, hps): print("Running simple training loop") # Create dataloaders trainloader, valloader, testloader = get_dataloaders() net = net.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) print("Training", hps['name'], "on", device) for epoch in range(hps['start_epoch'], 100): acc_tr, loss_tr = train(net, trainloader, criterion, optimizer) logger.loss_train.append(loss_tr) logger.acc_train.append(acc_tr) acc_v, loss_v = evaluate(net, valloader, criterion) logger.loss_val.append(loss_v) logger.acc_val.append(acc_v) if (epoch + 1) % 20 == 0: save(net, logger, hps, epoch + 1) logger.save_plt(hps) print('Epoch %2d' % (epoch + 1), 'Train Accuracy: %2.2f %%' % acc_tr, 'Val Accuracy: %2.2f %%' % acc_v, sep='\t\t') # Reduce Learning Rate print("Reducing learning rate from 0.001 to 0.0001") for param_group in optimizer.param_groups: param_group['lr'] = 0.0001 # Train for 20 extra epochs for epoch in range(epoch, 120): acc_tr, loss_tr = train(net, trainloader, criterion, optimizer) logger.loss_train.append(loss_tr) logger.acc_train.append(acc_tr) acc_v, loss_v = evaluate(net, valloader, criterion) logger.loss_val.append(loss_v) logger.acc_val.append(acc_v) if (epoch + 1) % 20 == 0: save(net, logger, hps, epoch + 1) logger.save_plt(hps) print('Epoch %2d' % (epoch + 1), 'Train Accuracy: %2.2f %%' % acc_tr, 'Val Accuracy: %2.2f %%' % acc_v, sep='\t\t') acc_test, loss_test = evaluate(net, testloader, criterion) print('Test Accuracy: %2.2f %%' % acc_test, 'Test Loss: %2.6f %%' % loss_test, sep='\t\t')
def run(net, logger, hps): # Create dataloaders trainloader, valloader, testloader = get_dataloaders() net = net.to(device) learning_rate = float(hps['lr']) optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9, nesterov=True, weight_decay=0.0001) scheduler = ReduceLROnPlateau(optimizer, mode='max', factor=0.5, patience=10, verbose=True) criterion = nn.CrossEntropyLoss() print("Training", hps['name'], "on", device) for epoch in range(hps['start_epoch'], hps['n_epochs']): acc_tr, loss_tr = train(net, trainloader, criterion, optimizer) logger.loss_train.append(loss_tr) logger.acc_train.append(acc_tr) acc_v, loss_v = evaluate(net, valloader, criterion) logger.loss_val.append(loss_v) logger.acc_val.append(acc_v) # Update learning rate if plateau scheduler.step(acc_v) if (epoch + 1) % hps['save_freq'] == 0: save(net, logger, hps, epoch + 1) logger.save_plt(hps) print('Epoch %2d' % (epoch + 1), 'Train Accuracy: %2.2f %%' % acc_tr, 'Val Accuracy: %2.2f %%' % acc_v, sep='\t\t') acc_test, loss_test = evaluate(net, testloader, criterion) print('Test Accuracy: %2.2f %%' % acc_test, 'Test Loss: %2.6f %%' % loss_test, sep='\t\t')
print("Loss: %2.6f" % loss) print("Precision: %2.6f" % precision_score(y_gt, y_pred, average='micro')) print("Recall: %2.6f" % recall_score(y_gt, y_pred, average='micro')) print("F1 Score: %2.6f" % f1_score(y_gt, y_pred, average='micro')) print("Confusion Matrix:\n", confusion_matrix(y_gt, y_pred), '\n') if __name__ == "__main__": # Important parameters hps = setup_hparams(sys.argv[1:]) # build network logger, net = setup_network(hps) net = net.to(device) print(net) criterion = nn.CrossEntropyLoss() # Get data with no augmentation trainloader, valloader, testloader = get_dataloaders(augment=False) print("Train") evaluate(net, trainloader, criterion) print("Val") evaluate(net, valloader, criterion) print("Test") evaluate(net, testloader, criterion)
def run(net, logger, hps): # Create dataloaders trainloader, valloader, testloader = get_dataloaders(bs=hps['bs']) net = net.to(device) learning_rate = float(hps['lr']) scaler = GradScaler() # optimizer = torch.optim.Adadelta(net.parameters(), lr=learning_rate, weight_decay=0.0001) # optimizer = torch.optim.Adagrad(net.parameters(), lr=learning_rate, weight_decay=0.0001) # optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate, weight_decay=0.0001, amsgrad=True) # optimizer = torch.optim.ASGD(net.parameters(), lr=learning_rate, weight_decay=0.0001) optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9, nesterov=True, weight_decay=0.0001) scheduler = ReduceLROnPlateau(optimizer, mode='max', factor=0.75, patience=5, verbose=True) # scheduler = torch.optim.lr_scheduler.StepLR(optimizer, 20, gamma=0.5, last_epoch=-1, verbose=True) # scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(trainloader), epochs=hps['n_epochs']) # scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=1, eta_min=1e-6, last_epoch=-1, verbose=True) # scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=1e-6, last_epoch=-1, verbose=False) criterion = nn.CrossEntropyLoss() best_acc = 0.0 print("Training", hps['name'], "on", device) for epoch in range(hps['start_epoch'], hps['n_epochs']): acc_tr, loss_tr = train(net, trainloader, criterion, optimizer, scaler) logger.loss_train.append(loss_tr) logger.acc_train.append(acc_tr) acc_v, loss_v = evaluate(net, valloader, criterion) logger.loss_val.append(loss_v) logger.acc_val.append(acc_v) # Update learning rate scheduler.step(acc_v) if acc_v > best_acc: best_acc = acc_v save(net, logger, hps, epoch + 1) logger.save_plt(hps) if (epoch + 1) % hps['save_freq'] == 0: save(net, logger, hps, epoch + 1) logger.save_plt(hps) print('Epoch %2d' % (epoch + 1), 'Train Accuracy: %2.4f %%' % acc_tr, 'Val Accuracy: %2.4f %%' % acc_v, sep='\t\t') # Calculate performance on test set acc_test, loss_test = evaluate(net, testloader, criterion) print('Test Accuracy: %2.4f %%' % acc_test, 'Test Loss: %2.6f' % loss_test, sep='\t\t')