コード例 #1
0
def valid(net,
          optimizer,
          valid_loader,
          use_lovasz=False,
          save_imgs=False,
          fold_num=0):
    net.eval()
    # keep track of losses
    val_ious = []
    val_iter_loss = 0.
    # no gradients during validation
    with torch.no_grad():
        for i, data in enumerate(valid_loader):
            valid_imgs = data['img'].to(device)
            valid_msks = data['msk'].to(device)
            valid_msk_bool = data['has_msk'].float().to(device)
            # get predictions
            msk_vpreds, bool_vpreds = net(valid_imgs)
            msk_blend_vpreds = msk_vpreds * bool_vpreds.view(
                valid_imgs.size(0), 1, 1, 1)

            if save_imgs:
                img_grid = vsn.utils.make_grid(valid_imgs, normalize=True)
                msk_grid = vsn.utils.make_grid(msk_vpreds)

                vsn.utils.save_image(
                    img_grid,
                    '../imgs/valid_imgs_fold-{}.png'.format(fold_num))
                vsn.utils.save_image(
                    msk_grid,
                    '../imgs/valid_msks_fold-{}.png'.format(fold_num))

            # calculate loss
            if use_lovasz:
                vloss = L.lovasz_hinge(msk_vpreds, valid_msks)
                #vloss += focal_loss(msk_vpreds, valid_msks)
                #vloss -= dice(msk_vpreds.sigmoid(), valid_msks)
            else:
                vloss = focal_loss(msk_vpreds, valid_msks)
                vloss += L.lovasz_hinge(msk_vpreds, valid_msks)
                #vloss -= dice(msk_vpreds.sigmoid(), valid_msks)

            vloss += args.lambda_bool * bce(bool_vpreds,
                                            valid_msk_bool.view(-1, 1))
            vloss += args.lambda_bool * focal_loss(msk_blend_vpreds,
                                                   valid_msks)

            #vloss += args.lambda_dice * dice(msk_vpreds.sigmoid(), valid_msks)
            # get validation stats
            val_iter_loss += vloss.item()

            val_ious.append(
                get_iou_vector(
                    valid_msks.cpu().numpy()[:, :, 13:114, 13:114],
                    msk_vpreds.sigmoid().cpu().numpy()[:, :, 13:114, 13:114]))

    epoch_vloss = val_iter_loss / (len(valid_loader.dataset) / args.batch_size)
    print('Avg Eval Loss: {:.4}, Avg IOU: {:.4}'.format(
        epoch_vloss, np.mean(val_ious)))
    return epoch_vloss, np.mean(val_ious)
コード例 #2
0
def valid(net, optimizer, valid_loader, mtype='student', use_lovasz=False):
    net.eval()
    # keep track of losses
    val_ious = []
    val_iter_loss = 0.
    # no gradients during validation
    with torch.no_grad():
        for i, data in enumerate(valid_loader):
            valid_imgs = data['img'].cuda()
            valid_msks = data['msk'].cuda()
            valid_msk_bool = data['has_msk'].float().cuda()
            # get predictions
            msk_vpreds, bool_v = net(valid_imgs)
            # calculate loss
            if use_lovasz:
                vloss = L.lovasz_hinge(msk_vpreds, valid_msks)
            else:
                vloss = focal_loss(msk_vpreds, valid_msks)
                vloss += L.lovasz_hinge(msk_vpreds, valid_msks)
            vloss += bce(bool_v, valid_msk_bool.view(-1, 1))
            # get validation stats
            val_iter_loss += vloss.item()

            val_ious.append(
                get_iou_vector(
                    valid_msks.cpu().numpy()[:, :, 13:114, 13:114],
                    msk_vpreds.sigmoid().cpu().numpy()[:, :, 13:114, 13:114]))

    epoch_vloss = val_iter_loss / (len(valid_loader.dataset) / args.batch_size)
    print('{} Avg Eval Loss: {:.4}, Avg IOU: {:.4}'.format(
        mtype, epoch_vloss, np.mean(val_ious)))
    return epoch_vloss, np.mean(val_ious)
コード例 #3
0
def valid(net, optimizer, valid_loader, save_imgs=False, fold_num=0):
    net.eval()
    # keep track of losses
    val_ious = []
    val_iter_loss = 0.
    # no gradients during validation
    with torch.no_grad():
        for i, data in enumerate(valid_loader):
            valid_imgs = data['img'].to(device)
            valid_msks = data['msk']
            #valid_msks_half = data['msk_half'].to(device)
            #valid_msks_qrtr = data['msk_qrtr'].to(device)
            valid_msk_bool = data['has_msk'].to(device)
            # get predictions
            msk_vpreds = net(valid_imgs)

            # calculate loss
            # main mask loss
            vloss = focal_loss(msk_vpreds[0], valid_msks[0].to(device))
            vloss += L.lovasz_hinge(msk_vpreds[0], valid_msks[0].to(device))

            # aux mask losses
            for j in range(len(valid_msks)):
                #print(msk_preds[i+1].size(), msks[i].size())
                vloss += 0.1 * focal_loss(
                    msk_vpreds[j + 1][valid_msk_bool],
                    valid_msks[j][valid_msk_bool].to(device))
                vloss += 0.1 * L.lovasz_hinge(
                    msk_vpreds[j + 1][valid_msk_bool],
                    valid_msks[j][valid_msk_bool].to(device))

            # binary loss
            vloss += 0.05 * bce(msk_vpreds[-1],
                                valid_msk_bool.float().view(-1, 1))

            # get validation stats
            val_iter_loss += vloss.item()

            val_ious.append(
                get_iou_vector(
                    valid_msks[0].cpu().numpy()[:, :, 13:114, 13:114],
                    msk_vpreds[0].sigmoid().cpu().numpy()[:, :, 13:114,
                                                          13:114]))

    epoch_vloss = val_iter_loss / (len(valid_loader.dataset) / args.batch_size)
    print('Avg Eval Loss: {:.4}, Avg IOU: {:.4}'.format(
        epoch_vloss, np.mean(val_ious)))
    return epoch_vloss, np.mean(val_ious)