def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--batch-size', type=int, default=32) arg('--lr', type=float, default=2e-3) arg('--workers', type=int, default=4) arg('--epochs', type=int, default=5) arg('--mixup-alpha', type=float, default=0) arg('--cutmix-alpha', type=float, default=0) arg('--arch', type=str, default='seresnext50') arg('--amp', type=str, default='') arg('--size', type=int, default=192) arg('--debug', action='store_true') arg('--radam', action='store_true') arg('--run-name', type=str, default='') arg('--lookahead-k', type=int, default=-1) arg('--lookahead-alpha', type=float, default=0.5) arg('--from-checkpoint', type=str, default='') arg('--find-lr', action='store_true') args = parser.parse_args() train_dir = DATA_ROOT / 'train' valid_dir = DATA_ROOT / 'val' use_cuda = cuda.is_available() model = get_model(args.arch) if use_cuda: model = model.cuda() criterion = MixUpSoftmaxLoss(nn.CrossEntropyLoss()) (CACHE_DIR / 'params.json').write_text( json.dumps(vars(args), indent=4, sort_keys=True)) df_train, class_map = build_dataframe_from_folder(train_dir) df_valid = build_dataframe_from_folder(valid_dir, class_map) train_transform = get_train_transform(int(args.size * 1.25), args.size) test_transform = get_test_transform(int(args.size * 1.25), args.size) train_loader = make_loader(args, TrainDataset, df_train, train_transform, drop_last=True, shuffle=True) valid_loader = make_loader(args, TrainDataset, df_valid, test_transform, shuffle=False) print(f'{len(train_loader.dataset):,} items in train, ' f'{len(valid_loader.dataset):,} in valid') if args.find_lr: find_lr(args, model, train_loader, criterion) else: if args.from_checkpoint: resume_training(args, model, train_loader, valid_loader) else: train_from_scratch(args, model, train_loader, valid_loader, criterion)
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--batch-size', type=int, default=32) arg('--lr', type=float, default=2e-3) arg('--workers', type=int, default=4) arg('--epochs', type=int, default=5) arg('--mixup-alpha', type=float, default=0) arg('--arch', type=str, default='seresnext50') arg('--amp', type=str, default='') arg('--debug', action='store_true') args = parser.parse_args() train_dir = DATA_ROOT / 'train' valid_dir = DATA_ROOT / 'val' use_cuda = cuda.is_available() if args.arch == 'seresnext50': model = get_seresnet_model(arch="se_resnext50_32x4d", n_classes=N_CLASSES, pretrained=False) elif args.arch == 'seresnext101': model = get_seresnet_model(arch="se_resnext101_32x4d", n_classes=N_CLASSES, pretrained=False) elif args.arch.startswith("densenet"): model = get_densenet_model(arch=args.arch) else: raise ValueError("No such model") if use_cuda: model = model.cuda() criterion = MixUpSoftmaxLoss(nn.CrossEntropyLoss()) (CACHE_DIR / 'params.json').write_text( json.dumps(vars(args), indent=4, sort_keys=True)) df_train, class_map = build_dataframe_from_folder(train_dir) df_valid = build_dataframe_from_folder(valid_dir, class_map) train_loader = make_loader(args, TrainDataset, df_train, train_transform, drop_last=True, shuffle=True) valid_loader = make_loader(args, TrainDataset, df_valid, test_transform, shuffle=False) print(f'{len(train_loader.dataset):,} items in train, ' f'{len(valid_loader.dataset):,} in valid') train_from_scratch(args, model, train_loader, valid_loader, criterion)
def main(): parser = argparse.ArgumentParser() arg = parser.add_argument arg('--batch-size', type=int, default=32) arg('--workers', type=int, default=4) arg('--arch', type=str, default='seresnext50') arg('--amp', type=str, default='') arg('--size', type=int, default=192) arg('--debug', action='store_true') arg('--model-path', type=str, default='') args = parser.parse_args() train_dir = DATA_ROOT / 'train' valid_dir = DATA_ROOT / 'val' use_cuda = cuda.is_available() model = get_model(args.arch) model.load_state_dict(torch.load(args.model_path, map_location="cpu")) if use_cuda: model = model.cuda() if args.amp: if not APEX_AVAILABLE: raise ValueError("Apex is not installed!") model = amp.initialize(model, opt_level=args.amp) # The first line is to make sure we have the same class_map as in training _, class_map = build_dataframe_from_folder(train_dir) df_valid = build_dataframe_from_folder(valid_dir, class_map) idx_to_name = get_class_idx_to_class_name_mapping(class_map) # Export the mapping for later use with open(CACHE_DIR / "id_to_name_map.json", "w") as fout: json.dump(idx_to_name, fout) test_transform = get_test_transform(int(args.size * 1.25), args.size) valid_loader = make_loader(args, TrainDataset, df_valid, test_transform, shuffle=False) print(f'{len(valid_loader.dataset):,} in valid') bot = ImageClassificationBot(model=model, train_loader=None, valid_loader=None, clip_grad=0, optimizer=None, echo=True, criterion=None, callbacks=[], pbar=True, use_tensorboard=False, use_amp=(args.amp != '')) logits, truths = bot.predict(valid_loader, return_y=True) probs = torch.softmax(logits, dim=-1) preds = torch.argmax(probs, dim=1) print( f"Validation accuracy: {np.mean(preds.numpy() == truths.numpy()) * 100:.2f}%" ) df_out = pd.DataFrame({ "truth": truths.numpy(), "max_prob": np.max(probs.numpy(), axis=1), "truth_prob": torch.gather(probs, 1, truths[:, None]).numpy()[:, 0], "pred": preds, "path": [ valid_loader.dataset._df.iloc[i].image_path for i in range(len(valid_loader.dataset)) ] }) df_out.to_csv(CACHE_DIR / "valid_preds.csv", index=False)