예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)