예제 #1
0
def generate_one_image_smooth_gradient(model_name,
                                       image_name,
                                       target_class,
                                       full_image_path,
                                       pretrain=True):
    if model_name == 'denseNet':
        pretrained_model = models.densenet121(pretrained=pretrain)
    elif model_name == "resNet":  # res net
        pretrained_model = models.resnet18(pretrained=pretrain)

    original_image = Image.open(full_image_path).convert('RGB')
    prep_img = customPreProcessing(original_image)
    save_image_name = image_name + model_name + '_SM_pretrained'
    # save_image_name = image_name + model_name + '_SM_randomWeights'

    # Vanilla backprop
    VBP = VanillaBackprop(pretrained_model, _type=model_name)
    param_n = 50
    param_sigma_multiplier = 4
    smooth_grad = generate_smooth_grad(
        VBP,  # ^This parameter
        prep_img,
        target_class,
        param_n,
        param_sigma_multiplier)
    # Save colored gradients
    save_gradient_images(smooth_grad, save_image_name + '_colored')
    # Convert to grayscale
    grayscale_smooth_grad = convert_to_grayscale(smooth_grad)
    # Save grayscale gradients
    save_gradient_images(grayscale_smooth_grad, save_image_name)
    print('Smooth grad completed')
예제 #2
0
def generate_attribution_map(img_batch, model, numbered_layer, device):
    VBP = VanillaBackprop(model)
    myExtractor = FeatureExtractor(model, extracted_layers=numbered_layer)
    output = myExtractor(img_batch)

    grad = []
    if 'feature' in numbered_layer.keys():
        for i in range(len(numbered_layer['feature'])):
            grad.append(
                VBP.generate_gradients(img_batch, numbered_layer['feature'][i],
                                       'feature', device) *
                img_batch.data.cpu().numpy())

    if 'classifier' in numbered_layer.keys():
        for i in range(len(numbered_layer['classifier'])):
            grad.append(
                VBP.generate_gradients(
                    img_batch, numbered_layer['classifier'][i], 'classifier',
                    device) * img_batch.data.cpu().numpy())

    return (output, grad)
예제 #3
0
        # Calculate gradients
        vanilla_grads = Backprop.generate_gradients(noisy_img, target_class)
        # Add gradients to smooth_grad
        smooth_grad = smooth_grad + vanilla_grads
    # Average it out
    smooth_grad = smooth_grad / param_n
    return smooth_grad


if __name__ == '__main__':
    # Get params
    target_example = 0  # Snake
    (original_image, prep_img, target_class, file_name_to_export, pretrained_model) =\
        get_example_params(target_example)

    VBP = VanillaBackprop(pretrained_model)
    # GBP = GuidedBackprop(pretrained_model)  # if you want to use GBP dont forget to
    # change the parametre in generate_smooth_grad

    param_n = 50
    param_sigma_multiplier = 4
    smooth_grad = generate_smooth_grad(
        VBP,  # ^This parameter
        prep_img,
        target_class,
        param_n,
        param_sigma_multiplier)

    # Save colored gradients
    save_gradient_images(smooth_grad,
                         file_name_to_export + '_SmoothGrad_color')