Esempio n. 1
0
def run_eval(data_dir, checkpoints_dir, log_dir):

    # load and update labels
    df = pd.read_csv(data_dir / "train.csv")
    df = df[["file_name", "category_id"]]
    classes_map = utils.load_json(data_dir / "classes_map.json")

    # Update class labels
    new_labels = [classes_map[str(i)] for i in df["category_id"]]
    df["new_labels"] = new_labels

    ds = datatset.HerbDataSet(df, data_dir, 256, label="new_labels")
    loader = DataLoader(ds, batch_size=16, shuffle=True)

    # Metrics
    acc = metrics.Accuracy()
    f1 = metrics.F1()
    writer = SummaryWriter(log_dir / "validation")
    manager = metrics.MetricManager([acc, f1], writer)

    # Loss
    criterion = nn.CrossEntropyLoss()

    # Model
    m = model.get_model(models.resnet50(pretrained=False),
                        p1=0,
                        p2=0,
                        device="gpu")  # no drop out, trying to over fit

    Eval(manager, criterion, loader, m, checkpoints_dir).run()
def input():
    contracts = ''
    psc_codes = db.session.query(consolidated_data2.product_or_service_code_description).order_by(consolidated_data2.product_or_service_code_description).distinct()
    set_asides = db.session.query(consolidated_data2.type_of_set_aside_code).order_by(consolidated_data2.type_of_set_aside_code).distinct()

# Precision, Recall, F1

    # Return contracts if on post request
    if request.method == "POST":
        queryString = request.form.get('set_aside')
        psc_filter = request.form['psc_code']
        
        AccuracyScore = metrics.Accuracy(queryString)
        PrecisionScore = metrics.Precision(queryString)
        RecallScore = metrics.Recall(queryString)
        F1Score = metrics.F1(queryString)

        if psc_filter == "All":
            contracts = consolidated_data2.query.filter_by(type_of_set_aside_code=queryString).order_by(consolidated_data2.base_and_exercised_options_value.desc()).limit(10)
        else:
            contracts = consolidated_data2.query.filter_by(type_of_set_aside_code=queryString, product_or_service_code_description=psc_filter).order_by(consolidated_data2.base_and_exercised_options_value.desc()).limit(10)

        # Log the set aside, psc code, and the query to the server. 
        print(queryString + " : " + psc_filter)
        print("return value: "+ str(contracts))
        return render_template("input.html", accuracy="90.27", psc_codes=psc_codes, contracts=contracts, set_asides=set_asides,
                              AccuracyScore=AccuracyScore, PrecisionScore=PrecisionScore, RecallScore=RecallScore,
                               F1Score=F1Score, set_aside=queryString, psc_filter=psc_filter)
    
    # If not a post request, just load the input page. 
    else:
        return render_template("input.html", psc_codes=psc_codes, contracts='', set_asides=set_asides,
                              AccuracyScore=0, PrecisionScore=0, RecallScore=0, F1Score=0, set_aside="None", psc_filter="All")
Esempio n. 3
0
def default_classical_scorings(task="predict"):
    if task == 'predict':
        scorings = (mm.Accuracy(tensor=False),
                    mm.BalancedAccuracy(tensor=False),
                    mm.F1Score(average='macro', tensor=False),
                    mm.Precision(average='macro', tensor=False),
                    mm.Recall(average='macro', tensor=False),
                    mm.ROCAUC(average='macro', tensor=False))
    else:
        scorings = (mm.CIndex(tensor=False, hazard=True), )
    return scorings
Esempio n. 4
0
def run_eval(data, checkpoints_dir, log_dir):

    # Data
    images_path = data / "images"
    labels_path = data / "labels"
    ds = dataset.HeartDataSet(images_path, labels_path)
    loader = DataLoader(ds, batch_size=8, shuffle=True)

    # Metrics
    acc = metrics.Accuracy()
    miou = metrics.Miou()
    writer = SummaryWriter(log_dir / "validation")
    manager = metrics.MetricManager([acc, miou], writer)

    # Loss
    criterion = nn.CrossEntropyLoss()
    # criterion = nn.CrossEntropyLoss(weight=torch.tensor([1e-3,1,1,1], device="cuda"))

    # Model
    unet = model.ResNetUNet(4)

    Eval(manager, criterion, loader, unet, checkpoints_dir).run()
Esempio n. 5
0
def main(args):
    """ Main benchmark routine. Parses the arguments, loads models and data,
    runs the evaluation loop and produces the output.

    """

    # Compose the model list
    modellist = []
    if args['model']:
        modellist.append(args['model'])

    benchmark = None
    benchmark = load_benchmark(args['benchmark'])
    modellist.extend(benchmark['models'])

    # Run the model evaluation
    is_silent = (args['output'] == 'html')
    ev = evaluator.Evaluator(
        modellist,
        benchmark['data.test'],
        benchmark['data.train'],
        silent=is_silent)

    with silence_stdout(is_silent):
        res_df = ev.evaluate()

    # Run the metric visualizer
    html_viz = metrics.HTMLVisualizer([
        metrics.Accuracy(),
        metrics.SubjectBoxes()
    ])
    html = html_viz.to_html(res_df)

    if args['output'] == 'browser':
        metrics.load_in_default_browser('\n'.join(html).encode('utf8'))
    elif args['output'] == 'html':
        print(' '.join(html))
Esempio n. 6
0
def train(dataset, model_dir, writer):
    dataloaders = dataset.get_dataloaders()

    # we now set GPU training parameters
    # if the given index is not available then we use index 0
    # also when using multi gpu we should specify index 0
    if dataset.config.gpu_index + 1 > torch.cuda.device_count(
    ) or dataset.config.multi_gpu:
        dataset.config.gpu_index = 0

    logging.info('Using GPU cuda:{}, script PID {}'.format(
        dataset.config.gpu_index, os.getpid()))
    if dataset.config.multi_gpu:
        logging.info('Training on multi-GPU mode with {} devices'.format(
            torch.cuda.device_count()))
    device = torch.device('cuda:{}'.format(dataset.config.gpu_index))

    if dataset.config.model == 'unet':
        model = unet(input_size=dataset.config.num_feats,
                     num_classes=dataset.config.num_classes,
                     kernel_size=dataset.config.kernel_size).to(device)
    else:
        model = deeplab(backbone=dataset.config.backbone,
                        input_size=dataset.config.num_feats,
                        num_classes=dataset.config.num_classes,
                        kernel_size=dataset.config.kernel_size,
                        sigma=dataset.config.sigma).to(device)

    # if use multi_gou then convert the model to DataParallel
    if dataset.config.multi_gpu:
        model = nn.DataParallel(model)

    # create optimizer, loss function, and lr scheduler
    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=dataset.config.lr,
                                 weight_decay=1e-4)
    criterion = nn.CrossEntropyLoss()
    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
        optimizer,
        mode='min',
        factor=dataset.config.lr_decay,
        patience=dataset.config.lr_patience,
        verbose=True)

    logging.info('Config {}'.format(dataset.config))
    logging.info(
        'TB logs and checkpoint will be saved in {}'.format(model_dir))

    phases = ['train', 'test']

    # create metric trackers: we track lass, class accuracy, and overall accuracy
    trackers = {
        x: {
            'loss':
            metrics.LossMean(),
            'acc':
            metrics.Accuracy(),
            'iou':
            None,
            'cm':
            metrics.ConfusionMatrix(
                num_classes=int(dataset.config.num_classes))
        }
        for x in phases
    }

    # create initial best state object
    best_state = {
        'model': model.state_dict(),
        'optimizer': optimizer.state_dict(),
        'scheduler': scheduler.state_dict() if scheduler else None,
        'train_loss': float('inf'),
        'test_loss': float('inf'),
        'train_acc': 0.0,
        'test_acc': 0.0,
        'train_mIoU': 0.0,
        'test_mIoU': 0.0,
        'convergence_epoch': 0,
        'num_epochs_since_best_acc': 0
    }

    # now we train!
    for epoch in range(dataset.config.max_epochs):
        for phase in phases:
            if phase == 'train':
                model.train()
            else:
                model.eval()

            # reset metrics
            trackers[phase]['loss'].reset()
            trackers[phase]['cm'].reset()

            for step_number, inputs in enumerate(
                    tqdm(dataloaders[phase],
                         desc='[{}/{}] {} '.format(epoch + 1,
                                                   dataset.config.max_epochs,
                                                   phase))):
                data = inputs[0].to(device, dtype=torch.float).permute(0, 2, 1)
                coords = inputs[1].to(device,
                                      dtype=torch.float).permute(0, 2, 1)
                label = inputs[2].to(device, dtype=torch.long)

                # compute gradients on train only
                with torch.set_grad_enabled(phase == 'train'):
                    out = model(data, coords)
                    loss = criterion(out, label)
                    if phase == 'train':
                        optimizer.zero_grad()
                        loss.backward()
                        optimizer.step()

                # now we update metrics
                trackers[phase]['loss'].update(average_loss=loss,
                                               batch_size=data.size(0))
                trackers[phase]['cm'].update(y_true=label, y_logits=out)

            logging.info('Computing accuracy...')

            # compare with my metrics
            epoch_loss = trackers[phase]['loss'].result()
            epoch_overall_acc = trackers[phase]['cm'].result(metric='accuracy')
            epoch_iou = trackers[phase]['cm'].result(metric='iou')
            epoch_miou = epoch_iou.mean()

            logging.info(
                '--------------------------------------------------------------------------------'
            )
            logging.info(
                '[{}/{}] {} Loss: {:.2e}. Overall Acc: {:.4f}. mIoU {:.4f}'.
                format(epoch + 1, dataset.config.max_epochs, phase, epoch_loss,
                       epoch_overall_acc, epoch_miou))
            iou_per_class_str = ' '.join(
                ['{:.4f}'.format(s) for s in epoch_iou])
            logging.info('IoU per class: {}'.format(iou_per_class_str))
            logging.info(
                '--------------------------------------------------------------------------------'
            )

            # we update our learning rate scheduler if loss does not improve
            if phase == 'test' and scheduler:
                scheduler.step(epoch_loss)
                writer.add_scalar('params/lr', optimizer.param_groups[0]['lr'],
                                  epoch + 1)

            writer.add_scalar('loss/epoch_{}'.format(phase), epoch_loss,
                              epoch + 1)
            writer.add_scalar('miou/epoch_{}'.format(phase), epoch_miou,
                              epoch + 1)
            writer.add_scalar('acc_all/epoch_{}'.format(phase),
                              epoch_overall_acc, epoch + 1)

        # after each epoch we update best state values as needed
        # first we save our state when we get better test accuracy
        if best_state['test_mIoU'] > trackers['test']['cm'].result(
                metric='iou').mean():
            best_state['num_epochs_since_best_acc'] += 1
        else:
            logging.info('Got a new best model with mIoU {:.4f}'.format(
                trackers['test']['cm'].result(metric='iou').mean()))
            best_state = {
                'model': model.state_dict(),
                'optimizer': optimizer.state_dict(),
                'scheduler': scheduler.state_dict() if scheduler else None,
                'train_loss': trackers['train']['loss'].result(),
                'test_loss': trackers['test']['loss'].result(),
                'train_acc': trackers['train']['cm'].result(metric='accuracy'),
                'test_acc': trackers['test']['cm'].result(metric='accuracy'),
                'train_mIoU':
                trackers['train']['cm'].result(metric='iou').mean(),
                'test_mIoU':
                trackers['test']['cm'].result(metric='iou').mean(),
                'convergence_epoch': epoch + 1,
                'num_epochs_since_best_acc': 0
            }

            file_name = os.path.join(model_dir, 'best_state.pth')
            torch.save(best_state, file_name)
            logging.info('saved checkpoint in {}'.format(file_name))

        # we check for early stopping when we have trained a min number of epochs
        if epoch >= dataset.config.min_epochs and best_state[
                'num_epochs_since_best_acc'] >= dataset.config.early_stopping:
            logging.info('Accuracy did not improve for {} iterations!'.format(
                dataset.config.early_stopping))
            logging.info('[Early stopping]')
            break

    utl.dump_best_model_metrics_to_tensorboard(writer, phases, best_state)

    logging.info('************************** DONE **************************')
def do_train():
    device = args.device
    set_seed(args.seed)

    label_map = load_dict(args.tag_path)
    id2label = {val: key for key, val in label_map.items()}

    print("Loading the ernie model and tokenizer...")
    model = ErnieForSequenceClassification(num_classes=len(label_map))
    model.to(torch.device(device))
    tokenizer = AutoTokenizer.from_pretrained("nghuyong/ernie-1.0")

    print("============start train==========")
    train_ds = DuEventExtraction(args.train_data, args.tag_path)
    dev_ds = DuEventExtraction(args.dev_data, args.tag_path)
    # test_ds = DuEventExtraction(args.test_data, args.tag_path)

    trans_func = partial(convert_example,
                         tokenizer=tokenizer,
                         label_map=label_map,
                         max_seq_len=args.max_seq_len)

    batchify_fn = lambda samples, fn=Tuple(
        Pad(axis=0, pad_val=tokenizer.vocab[tokenizer.pad_token]),
        Pad(axis=0, pad_val=tokenizer.vocab[tokenizer.pad_token]),
        Stack(dtype="int64")  # label
    ): fn(list(map(trans_func, samples)))

    train_loader = DataLoader(dataset=train_ds,
                              batch_size=args.batch_size,
                              shuffle=True,
                              collate_fn=batchify_fn)
    dev_loader = DataLoader(dataset=dev_ds,
                            batch_size=args.batch_size,
                            collate_fn=batchify_fn)
    # test_loader = DataLoader(
    #     dataset=test_ds,
    #     batch_size=args.batch_size,
    #     collate_fn=batchify_fn)

    num_training_steps = len(train_loader) * args.num_epoch
    metric = metrics.Accuracy()
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.AdamW(lr=args.learning_rate, params=model.parameters())

    best_performerence = 0.0
    model.train()
    for epoch in range(args.num_epoch):
        for step, (input_ids, token_type_ids,
                   labels) in enumerate(train_loader):
            input_ids = to_var(input_ids, device=device).long()
            token_type_ids = to_var(token_type_ids, device=device).long()
            labels = to_var(labels, device=device).squeeze()

            logits = model(input_ids, token_type_ids)
            # print("labels shape: ", labels.shape, "logits shape: ", logits.shape)
            loss = criterion(logits, labels)
            probs = torch.softmax(logits, dim=1)

            if device == "cuda":
                probs = probs.detach().cpu()
                labels = labels.detach().cpu()
            # calculate accuracy
            correct = metric.compute(probs, labels)
            metric.update(correct)
            acc = metric.accumulate()

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            if device == "cuda":
                loss_item = loss.detach().cpu().numpy().item()
            else:
                loss_item = loss.detach().numpy().item()
            if step > 0 and step % args.skip_step == 0:
                print(f'train epoch: {epoch} - step: {step} (total: {num_training_steps}) ' \
                    f'- loss: {loss_item:.6f} acc {acc:.5f}')
            if step > 0 and step % args.valid_step == 0:
                loss_dev, acc_dev = evaluate(model, criterion, metric,
                                             dev_loader, device)
                print(f'dev step: {step} - loss: {loss_dev:.6f} accuracy: {acc_dev:.5f}, ' \
                        f'current best {best_performerence:.5f}')
                if acc_dev > best_performerence:
                    best_performerence = acc_dev
                    print(f'==============================================save best model ' \
                            f'best performerence {best_performerence:5f}')
                    if not os.path.exists(args.checkpoints):
                        os.mkdir(args.checkpoints)
                    torch.save(model.state_dict(),
                               '{}/best.pt'.format(args.checkpoints))
            step += 1

    # save the final model
    torch.save(model.state_dict(), '{}/final.pt'.format(args.checkpoints))
Esempio n. 8
0
def main():
    warnings.filterwarnings('ignore')

    # config
    parser = argparse.ArgumentParser()
    parser.add_argument('-s',
                        '--save',
                        default='./save',
                        help='保存的文件夹路径,如果有重名,会在其后加-来区别')
    parser.add_argument('-is',
                        '--image_size',
                        default=224,
                        type=int,
                        help='patch会被resize到多大,默认时224 x 224')
    parser.add_argument('-vts',
                        '--valid_test_size',
                        default=(0.1, 0.1),
                        type=float,
                        nargs=2,
                        help='训练集和测试集的大小,默认时0.1, 0.1')
    parser.add_argument('-bs',
                        '--batch_size',
                        default=32,
                        type=int,
                        help='batch size,默认时32')
    parser.add_argument('-nw',
                        '--num_workers',
                        default=12,
                        type=int,
                        help='多进程数目,默认时12')
    parser.add_argument('-lr',
                        '--learning_rate',
                        default=0.0001,
                        type=float,
                        help='学习率大小,默认时0.0001')
    parser.add_argument('-e',
                        '--epoch',
                        default=10,
                        type=int,
                        help='epoch 数量,默认是10')
    parser.add_argument('--reduction',
                        default='mean',
                        help='聚合同一bag的instances时的聚合方式,默认时mean')
    parser.add_argument('--multipler',
                        default=2.0,
                        type=float,
                        help="为了平衡pos和neg,在weight再乘以一个大于1的数,默认是2.0")
    args = parser.parse_args()
    save = args.save
    image_size = (args.image_size, args.image_size)
    valid_size, test_size = args.valid_test_size
    batch_size = args.batch_size
    num_workers = args.num_workers
    lr = args.learning_rate
    epoch = args.epoch
    reduction = args.reduction
    multipler = args.multipler

    # ----- 读取数据 -----
    neg_dir = './DATA/TCT/negative'
    pos_dir = './DATA/TCT/positive'

    dat = MilData.from2dir(neg_dir, pos_dir)
    train_transfer = transforms.Compose([
        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),
        transforms.Resize(image_size),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])
    ])
    test_transfer = transforms.Compose([
        transforms.Resize(image_size),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])
    ])
    train_dat, valid_dat, test_dat = dat.split_by_bag(
        test_size,
        valid_size,
        train_transfer=train_transfer,
        valid_transfer=test_transfer,
        test_transfer=test_transfer)
    dataloaders = {
        'train':
        data.DataLoader(train_dat,
                        batch_size=batch_size,
                        num_workers=num_workers,
                        shuffle=True),
        'valid':
        data.DataLoader(
            valid_dat,
            batch_size=batch_size,
            num_workers=num_workers,
        ),
        'test':
        data.DataLoader(
            test_dat,
            batch_size=batch_size,
            num_workers=num_workers,
        )
    }

    # ----- 构建网络和优化器 -----
    net = NormalCnn()
    criterion = nn.BCELoss(reduction='none')
    optimizer = optim.Adam(net.parameters(), lr=lr)
    scorings = [
        mm.Loss(),
        mm.Recall(reduction=reduction),
        mm.ROCAUC(reduction=reduction),
        mm.BalancedAccuracy(reduction=reduction),
        mm.F1Score(reduction=reduction),
        mm.Precision(reduction=reduction),
        mm.Accuracy(reduction=reduction)
    ]

    # ----- 训练网络 -----
    try:
        net, hist, weighter = train(net,
                                    criterion,
                                    optimizer,
                                    dataloaders,
                                    epoch=epoch,
                                    metrics=scorings,
                                    weighter_multipler=multipler)

        test_hist = evaluate(net, dataloaders['test'], criterion, scorings)
    except Exception as e:
        import ipdb
        ipdb.set_trace()  # XXX BREAKPOINT

    # 保存结果
    dirname = check_update_dirname(save)
    torch.save(net.state_dict(), os.path.join(dirname, 'model.pth'))
    torch.save(weighter, os.path.join(dirname, 'weigher.pth'))
    pd.DataFrame(hist).to_csv(os.path.join(dirname, 'train.csv'))
    with open(os.path.join(dirname, 'config.json'), 'w') as f:
        json.dump(args.__dict__, f)
    with open(os.path.join(dirname, 'test.json'), 'w') as f:
        json.dump(test_hist, f)
def train(config, model_dir, writer):
    """
    Function train and evaluate a part segmentation model for
    the Shapenet dataset. The training parameters are specified
    in the config file (for more details see config/config.py).

    :param config: Dictionary with configuration paramters
    :param model_dir: Checkpoint save directory
    :param writer: Tensorboard SummaryWritter object
    """
    phases = ['train', 'test']

    datasets, dataloaders = ds.get_modelnet40_dataloaders(
        root_dir=args.root_dir,
        phases=phases,
        batch_size=config['batch_size'],
        augment=config['augment'])

    # add number of classes to config
    config['num_classes'] = 40

    # we now set GPU training parameters
    # if the given index is not available then we use index 0
    # also when using multi gpu we should specify index 0
    if config['gpu_index'] + 1 > torch.cuda.device_count(
    ) or config['multi_gpu']:
        config['gpu_index'] = 0

    logging.info('Using GPU cuda:{}, script PID {}'.format(
        config['gpu_index'], os.getpid()))
    if config['multi_gpu']:
        logging.info('Training on multi-GPU mode with {} devices'.format(
            torch.cuda.device_count()))
    device = torch.device('cuda:{}'.format(config['gpu_index']))

    # we load the model defined in the config file
    model = res.resnet101(in_channels=config['in_channels'],
                          num_classes=config['num_classes'],
                          kernel_size=config['kernel_size']).to(device)

    # if use multi_gpu then convert the model to DataParallel
    if config['multi_gpu']:
        model = nn.DataParallel(model)

    # create optimizer, loss function, and lr scheduler
    optimizer = torch.optim.Adam(model.parameters(),
                                 lr=config['lr'],
                                 weight_decay=1e-4)
    criterion = nn.CrossEntropyLoss()
    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
        optimizer,
        mode='min',
        factor=config['lr_decay'],
        patience=config['lr_patience'],
        verbose=True)

    logging.info('Config {}'.format(config))
    logging.info(
        'TB logs and checkpoint will be saved in {}'.format(model_dir))

    utl.dump_config_details_to_tensorboard(writer, config)

    # create metric trackers: we track lass, class accuracy, and overall accuracy
    trackers = {
        x: {
            'loss': metrics.LossMean(),
            'acc': metrics.Accuracy(),
            'iou': None,
            'cm':
            metrics.ConfusionMatrix(num_classes=int(config['num_classes']))
        }
        for x in phases
    }

    # create initial best state object
    best_state = {
        'config': config,
        'model': model.state_dict(),
        'optimizer': optimizer.state_dict(),
        'scheduler': scheduler.state_dict() if scheduler else None,
        'train_loss': float('inf'),
        'test_loss': float('inf'),
        'train_acc': 0.0,
        'test_acc': 0.0,
        'train_class_acc': 0.0,
        'test_class_acc': 0.0,
        'convergence_epoch': 0,
        'num_epochs_since_best_acc': 0
    }

    # now we train!
    for epoch in range(config['max_epochs']):
        for phase in phases:
            if phase == 'train':
                model.train()
            else:
                model.eval()

            # reset metrics
            trackers[phase]['loss'].reset()
            trackers[phase]['cm'].reset()

            for step_number, (data, label) in enumerate(
                    tqdm(dataloaders[phase],
                         desc='[{}/{}] {} '.format(epoch + 1,
                                                   config['max_epochs'],
                                                   phase))):
                data = data.to(device, dtype=torch.float).permute(0, 2, 1)
                label = label.to(device, dtype=torch.long).squeeze()

                # compute gradients on train only
                with torch.set_grad_enabled(phase == 'train'):
                    out = model(data)
                    loss = criterion(out, label)

                    if phase == 'train':
                        optimizer.zero_grad()
                        loss.backward()
                        optimizer.step()

                # now we update metrics
                trackers[phase]['loss'].update(average_loss=loss,
                                               batch_size=data.size(0))
                trackers[phase]['cm'].update(y_true=label, y_logits=out)

            # logging.info('Computing accuracy...')

            # compare with my metrics
            epoch_loss = trackers[phase]['loss'].result()
            epoch_overall_acc = trackers[phase]['cm'].result(metric='accuracy')
            epoch_class_acc = trackers[phase]['cm'].result(
                metric='class_accuracy').mean()

            # we update our learning rate scheduler if loss does not improve
            if phase == 'test' and scheduler:
                scheduler.step(epoch_loss)
                writer.add_scalar('params/lr', optimizer.param_groups[0]['lr'],
                                  epoch + 1)

            # log current results and dump in Tensorboard
            logging.info(
                '[{}/{}] {} Loss: {:.2e}. Overall Acc: {:.4f}. Class Acc {:.4f}'
                .format(epoch + 1, config['max_epochs'], phase, epoch_loss,
                        epoch_overall_acc, epoch_class_acc))

            writer.add_scalar('loss/epoch_{}'.format(phase), epoch_loss,
                              epoch + 1)
            writer.add_scalar('acc_class/epoch_{}'.format(phase),
                              epoch_class_acc, epoch + 1)
            writer.add_scalar('acc_all/epoch_{}'.format(phase),
                              epoch_overall_acc, epoch + 1)

        # after each epoch we update best state values as needed
        # first we save our state when we get better test accuracy
        if best_state['test_acc'] > trackers['test']['cm'].result(
                metric='accuracy'):
            best_state['num_epochs_since_best_acc'] += 1
        else:
            logging.info('Got a new best model with accuracy {:.4f}'.format(
                trackers['test']['cm'].result(metric='accuracy')))
            best_state = {
                'config':
                config,
                'model':
                model.state_dict(),
                'optimizer':
                optimizer.state_dict(),
                'scheduler':
                scheduler.state_dict() if scheduler else None,
                'train_loss':
                trackers['train']['loss'].result(),
                'test_loss':
                trackers['test']['loss'].result(),
                'train_acc':
                trackers['train']['cm'].result(metric='accuracy'),
                'test_acc':
                trackers['test']['cm'].result(metric='accuracy'),
                'train_class_acc':
                trackers['train']['cm'].result(metric='class_accuracy').mean(),
                'test_class_acc':
                trackers['test']['cm'].result(metric='class_accuracy').mean(),
                'convergence_epoch':
                epoch + 1,
                'num_epochs_since_best_acc':
                0
            }

            file_name = os.path.join(model_dir, 'best_state.pth')
            torch.save(best_state, file_name)
            logging.info('saved checkpoint in {}'.format(file_name))

        # we check for early stopping when we have trained a min number of epochs
        if epoch >= config['min_epochs'] and best_state[
                'num_epochs_since_best_acc'] >= config['early_stopping']:
            logging.info('Accuracy did not improve for {} iterations!'.format(
                config['early_stopping']))
            logging.info('[Early stopping]')
            break

    utl.dump_best_model_metrics_to_tensorboard(writer, phases, best_state)

    logging.info('************************** DONE **************************')
Esempio n. 10
0
def auc(modelpath, idxlist, datasetpath, for_all=False):
    model = torch.load(modelpath).cuda().eval()

    dataset = dataset_class.Loading_dataset(idxlist, datasetpath, False, False)
    my_dataset_loader = torch.utils.data.DataLoader(dataset=dataset,
                                                    batch_size=1,
                                                    shuffle=False,
                                                    num_workers=1)

    eth = 0.5
    print("testing..")
    precisions = [0.0]
    recalls = [1.0]
    while (eth < 0.95):
        idfix = 0
        ious = 0
        kappas = 0
        accs = 0
        tps = 0
        fps = 0
        precs = 0
        recs = 0
        for sample in my_dataset_loader:
            pts_tensor = sample['pts'].float().permute(0, 3, 1, 2)
            normals_tensor = sample['normals'].float().permute(0, 3, 1, 2)
            colors_tensor = sample['colors'].float().permute(0, 3, 1, 2)
            target_tensor = sample['gt']
            input_tensor = torch.cat([pts_tensor, normals_tensor], 1).cuda()
            # input_tensor = torch.cat([pts_tensor,normals_tensor,colors_tensor],1).cuda()
            # input_tensor  = colors_tensor.cuda()
            # input_tensor = pts_tensor.cuda()
            target_tensor = target_tensor.to(device="cuda", dtype=torch.long)

            with torch.no_grad():
                out = model(input_tensor)
            softmax_mx = out.detach().permute(0, 2, 3, 1).cpu().numpy()[0]

            softmax_mx[softmax_mx[:, :, 1] < eth] = 0.0
            softmax_mx[softmax_mx[:, :, 1] != 0.0] = 1.0

            pts = pts_tensor.detach().permute(0, 2, 3, 1).numpy()[0]
            pts2 = pts.reshape((pts.shape[0] * pts.shape[1], 3))
            idxs = np.any(pts2 != [0.0, 0.0, 0.0], axis=-1)

            pred = softmax_mx[:, :, 1]
            gta = target_tensor.cpu().numpy()[0]
            pred = pred.reshape((pred.shape[0] * pred.shape[1]))
            gta = gta.reshape((gta.shape[0] * gta.shape[1]))
            pred = pred[idxs]
            gta = gta[idxs]

            union = np.logical_or(pred, gta)
            intersection = np.logical_and(pred, gta)
            iou = intersection.sum() / union.sum()

            ious = ious + iou
            kappa = metrics.Kappa_cohen(pred, gta)
            acc = metrics.Accuracy(pred, gta)
            something = metrics.precision_recall(pred, gta)
            tps = something[2] / (something[2] + something[5]) + tps
            fps = something[3] / (something[4] + something[3]) + fps
            precs = precs + something[0]
            recs = recs + something[1]
            kappas = kappas + kappa
            accs = accs + acc
            idfix = idfix + 1

        precisions.append(precs / idfix)
        recalls.append(recs / idfix)
        print(accs / idfix, kappas / idfix, ious / idfix)
        eth = eth + 0.05
    precisions.append(1.0)
    recalls.append(0.0)
    precisions = np.array(precisions)
    recalls = np.array(recalls)
    print(precisions, recalls)
    print(m.auc(recalls, precisions))
    print("TPS", tps / idfix)
    print("FPS", fps / idfix)
    print("MIoU", ious / idfix)
    print("kappas", kappas / idfix)
    print("accuracy", accs / idfix)
    print("precision", precs / idfix)
    print("recall", recs / idfix)
Esempio n. 11
0
def train(model,
          criterion,
          optimizer,
          dataloaders,
          scheduler=NoneScheduler(None),
          epoch=100,
          device=torch.device('cuda:0'),
          l2=0.0,
          metrics=(mm.Loss(), mm.Accuracy()),
          standard_metric_index=1,
          clip_grad=False):
    best_model_wts = copy.deepcopy(model.state_dict())
    best_metric = 0.0
    best_metric_name = metrics[standard_metric_index].__class__.__name__ + \
        '_valid'
    history = {
        m.__class__.__name__ + p: []
        for p in ['_train', '_valid'] for m in metrics
    }

    for e in range(epoch):
        for phase in ['train', 'valid']:
            if phase == 'train':
                scheduler.step()
                model.train()
                iterator = pb.progressbar(dataloaders[phase], prefix='Train: ')
            else:
                model.eval()
                iterator = dataloaders[phase]
            for m in metrics:
                m.reset()
            for batch_x, batch_y in iterator:
                batch_x = batch_x.to(device)
                batch_y = batch_y.to(device)
                optimizer.zero_grad()
                with torch.set_grad_enabled(phase == 'train'):
                    logit = model(batch_x)
                    loss = criterion(logit, batch_y)
                    # 只给weight加l2正则化
                    if l2 > 0.0:
                        for p_n, p_v in model.named_parameters():
                            if p_n == 'weight':
                                loss += l2 * p_v.norm()
                    if phase == 'train':
                        loss.backward()
                        if clip_grad:
                            nn.utils.clip_grad_norm_(model.parameters(),
                                                     max_norm=1)
                        optimizer.step()
                with torch.no_grad():
                    for m in metrics:
                        if isinstance(m, mm.Loss):
                            m.add(loss.cpu().item(), batch_x.size(0))
                        else:
                            m.add(logit.squeeze(), batch_y)

            for m in metrics:
                history[m.__class__.__name__ + '_' + phase].append(m.value())
            print("Epoch: %d, Phase:%s, " % (e, phase) + ", ".join([
                '%s: %.4f' % (m.__class__.__name__,
                              history[m.__class__.__name__ + '_' + phase][-1])
                for m in metrics
            ]))

            if phase == 'valid':
                epoch_metric = history[best_metric_name][-1]
                if epoch_metric > best_metric:
                    best_metric = epoch_metric
                    best_model_wts = copy.deepcopy(model.state_dict())

    print("Best metric: %.4f" % best_metric)
    model.load_state_dict(best_model_wts)
    return model, history
Esempio n. 12
0
def main():

    # ----- 根据data来读取不同的数据和不同的loss、metrics -----
    if config.args.data == 'brca':
        rna = RnaData.predicted_data(config.brca_cli, config.brca_rna,
                                     {'PAM50Call_RNAseq': 'pam50'})
        rna.transform(tf.LabelMapper(config.brca_label_mapper))
        out_shape = len(config.brca_label_mapper)
        criterion = nn.CrossEntropyLoss()
        scorings = (mm.Loss(), mm.Accuracy(), mm.BalancedAccuracy(),
                    mm.F1Score(average='macro'), mm.Precision(average='macro'),
                    mm.Recall(average='macro'), mm.ROCAUC(average='macro'))
    elif config.args.data == 'survival':
        if os.path.exists('./DATA/temp_pan.pth'):
            rna = RnaData.load('./DATA/temp_pan.pth')
        else:
            rna = RnaData.survival_data(config.pan_cli, config.pan_rna,
                                        '_OS_IND', '_OS')
        out_shape = 1
        if config.args.loss_type == 'cox':
            criterion = NegativeLogLikelihood()
        elif config.args.loss_type == 'svm':
            criterion = SvmLoss(rank_ratio=config.args.svm_rankratio)
        scorings = (mm.Loss(), mm.CIndex())
    rna.transform(tf.ZeroFilterCol(0.8))
    rna.transform(tf.MeanFilterCol(1))
    rna.transform(tf.StdFilterCol(0.5))
    norm = tf.Normalization()
    rna.transform(norm)

    # ----- 构建网络和优化器 -----
    inpt_shape = rna.X.shape[1]
    if config.args.net_type == 'mlp':
        net = MLP(inpt_shape, out_shape, config.args.hidden_num,
                  config.args.block_num).cuda()
    elif config.args.net_type == 'atten':
        net = SelfAttentionNet(inpt_shape, out_shape, config.args.hidden_num,
                               config.args.bottle_num, config.args.block_num,
                               config.args.no_res, config.act,
                               config.args.no_head, config.args.no_bottle,
                               config.args.no_atten,
                               config.args.dropout_rate).cuda()
    elif config.args.net_type == 'resnet':
        net = ResidualNet(inpt_shape, out_shape, config.args.hidden_num,
                          config.args.bottle_num,
                          config.args.block_num).cuda()

    # ----- 训练网络,cross validation -----
    split_iterator = rna.split_cv(config.args.test_size,
                                  config.args.cross_valid)
    train_hists = []
    test_hists = []
    for split_index, (train_rna, test_rna) in enumerate(split_iterator):
        print('##### save: %s, split: %d #####' %
              (config.args.save, split_index))
        #  从train中再分出一部分用作验证集,决定停止
        train_rna, valid_rna = train_rna.split(0.1)
        dats = {
            'train': train_rna.to_torchdat(),
            'valid': valid_rna.to_torchdat(),
        }
        dataloaders = {
            k: data.DataLoader(v, batch_size=config.args.batch_size)
            for k, v in dats.items()
        }
        test_dataloader = data.DataLoader(test_rna.to_torchdat(),
                                          batch_size=config.args.batch_size)
        # 网络训练前都进行一次参数重置,避免之前的训练的影响
        net.reset_parameters()
        # train
        optimizer = optim.Adamax(net.parameters(),
                                 lr=config.args.learning_rate)
        lrs = config.lrs(optimizer)
        net, hist = train(
            net,
            criterion,
            optimizer,
            dataloaders,
            epoch=config.args.epoch,
            metrics=scorings,
            l2=config.args.l2,
            standard_metric_index=config.args.standard_metric_index,
            scheduler=lrs)
        # test
        test_res = evaluate(net, criterion, test_dataloader, metrics=scorings)
        # 将多次训练的结果保存到一个df中
        hist = pd.DataFrame(hist)
        hist['split_index'] = split_index
        train_hists.append(hist)
        # 保存多次test的结果
        test_res['split_index'] = split_index
        test_hists.append(test_res)
        # 每个split训练的模型保存为一个文件
        torch.save(net.state_dict(),
                   os.path.join(config.save_dir, 'model%d.pth' % split_index))
    # 保存train的结果
    train_hists = pd.concat(train_hists)
    train_hists.to_csv(os.path.join(config.save_dir, 'train.csv'))
    # 保存test的结果
    test_hists = pd.DataFrame(test_hists)
    test_hists.to_csv(os.path.join(config.save_dir, 'test.csv'))