예제 #1
0
파일: trainer.py 프로젝트: namanphy/EVA5
    def __init__(self,
                 model,
                 optimizer,
                 criterion,
                 data_loader,
                 valid_data_loader=None,
                 lr_scheduler=None,
                 scheduler_monitor_value=None,
                 l1_loss=False,
                 l1_factor=0.001):
        if scheduler_monitor_value:
            assert scheduler_monitor_value in [
                None, 'loss', 'accuracy'
            ], 'scheduler_monitor_value can be either `loss` or `accuracy`'

        self.device = enable_cuda()
        self.model = model.to(self.device)

        self.train_loader, self.test_loader = data_loader, valid_data_loader
        self.do_validation = True if self.test_loader else False

        self.lr_scheduler = lr_scheduler
        self.scheduler_monitor_value = scheduler_monitor_value

        self.l1_loss = l1_loss
        self.l1_factor = l1_factor
        self.optimizer = optimizer
        self.criterion = criterion
예제 #2
0
파일: trainer.py 프로젝트: namanphy/EVA5
    def __init__(self,
                 model,
                 optimizer,
                 criterion,
                 data_loader,
                 valid_data_loader=None,
                 callbacks=None,
                 l1_loss=False,
                 l1_factor=0.001):

        self.device = enable_cuda()
        self.model = model.to(self.device)

        self.train_loader, self.test_loader = data_loader, valid_data_loader
        self.do_validation = True if self.test_loader else False

        self.l1_loss = l1_loss
        self.l1_factor = l1_factor
        self.optimizer = optimizer
        self.criterion = criterion

        self.lr_schedulers = {
            'step_lr': None,
            'plateau_lr': None,
            'one_cycle_lr': None
        }
        if callbacks is not None:
            self._make_schedulers(callbacks)
예제 #3
0
def plot_gradcam(image,
                 model,
                 layer,
                 model_path=None,
                 classes=None,
                 class_id=None,
                 save_as_file=False,
                 **kwargs):
    """
    @param image: image object
    @param image_path:
    """
    assert type(image) in [
        str, torch.Tensor
    ], '`image` param can be either `str` if path of image is given or `torch.Tensor` for processed image'
    device = enable_cuda()

    image, original_image = load_images(image, **kwargs)
    image = torch.stack(image).to(device)

    if model_path:
        model.load_state_dict(torch.load(model_path))
    model.to(device)
    model.eval()

    gcam = GradCAM(model=model, candidate_layers=layer)
    probs, ids = gcam.forward(image, original_image[0])

    if class_id and classes:
        assert type(class_id) is int, "class id value must be an integer."
        if class_id in range(len(classes)):
            ids = torch.tensor([[class_id]], dtype=torch.int64).to(device)
            probs = torch.tensor([[probs[0, class_id]]])
        else:
            raise ValueError('class id is not present in classes.')

    gcam.backward(ids=ids[:, [0]])
    region = gcam.generate(target_layer=layer)

    print(
        f" #GRADCAM: {classes[ids[0, 0]] if classes else ids[0, 0]} (prob : {probs[0, 0]})"
    )

    # Grad-CAM save
    out = save_gradcam(
        filename=
        f"gradcam-{model.__class__.__name__}-{layer}-{classes[ids[0, 0]] if classes else ids[0, 0]}.png",
        gcam=region[0, 0],
        raw_image=original_image[0],
        save_as_file=save_as_file)

    gcam.remove_hook()

    return out
예제 #4
0
파일: trainer.py 프로젝트: namanphy/EVA5
    def __init__(self, model, optimizer, criterion, data_loader, valid_data_loader=None, lr_scheduler=None,
                 l1_loss=False, l1_factor=0.001):
        self.device = enable_cuda()
        self.model = model.to(self.device)

        self.train_loader, self.test_loader = data_loader, valid_data_loader
        self.do_validation = True if self.test_loader else False

        self.lr_scheduler = lr_scheduler

        self.l1_loss = l1_loss
        self.l1_factor = l1_factor
        self.optimizer = optimizer
        self.criterion = criterion
예제 #5
0
def plot_gradcam(image_path,
                 model,
                 layer,
                 model_path=None,
                 classes=None,
                 class_id=None,
                 **kwargs):
    device = enable_cuda()

    image, original_image = load_images(image_path, **kwargs)
    image = torch.stack(image).to(device)

    if model_path:
        model.load_state_dict(torch.load(model_path))
    model.to(device)
    model.eval()

    gcam = GradCAM(model=model, candidate_layers=layer)
    probs, ids = gcam.forward(image, original_image[0])

    if class_id and classes:
        assert type(class_id) is int, "class id value must be an integer."
        if class_id in range(len(classes)):
            ids = torch.tensor([[class_id]], dtype=torch.int64).to(device)
            probs = torch.tensor([[probs[0, class_id]]])
        else:
            raise ValueError('class id is not present in classes.')

    gcam.backward(ids=ids[:, [0]])
    region = gcam.generate(target_layer=layer)

    print(
        f" #GRADCAM: {classes[ids[0, 0]] if classes else ids[0, 0]} (prob : {probs[0, 0]})"
    )

    # Grad-CAM save
    save_gradcam(
        filename=
        f"gradcam-{model.__class__.__name__}-{layer}-{classes[ids[0, 0]] if classes else ids[0, 0]}.png",
        gcam=region[0, 0],
        raw_image=original_image[0])

    gcam.remove_hook()
예제 #6
0
def class_wise_accuracy(model, model_path, test_loader, classes):
    incorrect_map = {}
    total_map = {}

    for i in range(len(classes)):
        incorrect_map[i] = 0
        total_map[i] = 0

    # identifying device
    device = enable_cuda()

    # Load the model
    model.load_state_dict(torch.load(model_path))
    model.to(device)
    model.eval()

    # Identify misclassified images
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)

            pred = output.argmax(
                dim=1,
                keepdim=True)  # get the index of the max log-probability
            result = pred.eq(target.view_as(pred))

            target_list = list(target.view_as(pred))

            for i in range(test_loader.batch_size):
                total_map[target_list[i]] += 1
                if not list(result)[i]:
                    incorrect_map[target_list[i]] += 1

    return {
        classes[x]: (total_map[x] - incorrect_map[x]) / total_map[x]
        for x in total_map
    }
예제 #7
0
def identify_misclassification(model, model_path, test_loader, limit=25):
    incorrect_samples = []

    # identifying device
    device = enable_cuda()

    # Load the model
    model.load_state_dict(torch.load(model_path))
    model.to(device)
    model.eval()

    # Identify misclassified images
    with torch.no_grad():
        for data, target in test_loader:
            images = data
            data, target = data.to(device), target.to(device)
            output = model(data)

            pred = output.argmax(
                dim=1,
                keepdim=True)  # get the index of the max log-probability
            result = pred.eq(target.view_as(pred))

            # Save incorrect samples
            if len(incorrect_samples) < limit:
                for i in range(test_loader.batch_size):
                    if not list(result)[i]:
                        incorrect_samples.append({
                            'prediction':
                            list(pred)[i],
                            'label':
                            list(target.view_as(pred))[i],
                            'image':
                            list(images)[i]
                        })

    return incorrect_samples