"ValueError: max_evals=500 is too low for the Permutation explainer" shap answers me do I have to give more data (photos)?

Viewed 67

I want to test the explainability of a multiclass semantic segmentation model, deeplab_v3plus with shap to know which features contribute the most to semantic classification. However I have a ValueError: max_evals=500 is too low when running my file, and I struggle to understand the reason.

import glob
from PIL import Image

import torch
from torchvision import transforms
from torchvision.utils import make_grid
import torchvision.transforms.functional as tf

from deeplab import deeplab_v3plus

import shap

def test(args):
    # make a video prez
    
    model = deeplab_v3plus('resnet101', num_classes=args.nclass, output_stride=16, pretrained_backbone=True)
    model.load_state_dict(torch.load(args.seg_file,map_location=torch.device('cpu'))) # because no gpu available on sandbox environnement
    model = model.to(args.device)
    model.eval()
    explainer = shap.Explainer(model)
    with torch.no_grad():
        for i, file in enumerate(args.img_folder):
            img = img2tensor(file, args)
    
            pred = model(img)
            print(explainer(img))

if __name__ == '__main__':
    class Arguments:
        def __init__(self):
            self.device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")
            self.seg_file = "Model_Woodscape.pth"
            self.img_folder = glob.glob("test_img/*.png")
            self.mean = [0.485, 0.456, 0.406]
            self.std = [0.229, 0.224, 0.225]
            self.h, self.w = 483, 640
            self.nclass = 10
            self.cmap = {
                1: [128, 64, 128],  # "road",
                2: [69, 76, 11],    # "lanemarks",
                3: [0, 255, 0],     # "curb",
                4: [220, 20, 60],   # "person",
                5: [255, 0, 0],     # "rider",
                6: [0, 0, 142],     # "vehicles",
                7: [119, 11, 32],   # "bicycle",
                8: [0, 0, 230],     # "motorcycle",
                9: [220, 220, 0],   # "traffic_sign",
                0: [0, 0, 0]        # "void"
            }

    args = Arguments()
    test(args)

But it returns:

(dee_env) jovyan@jupyter:~/use-cases/Scene_understanding/Code_Woodscape/deeplab_v3+$ python test_shap.py 
BILINEAR is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BILINEAR instead.
Traceback (most recent call last):
  File "/home/jovyan/use-cases/Scene_understanding/Code_Woodscape/deeplab_v3+/test_shap.py", line 85, in <module>
    test(args)
  File "/home/jovyan/use-cases/Scene_understanding/Code_Woodscape/deeplab_v3+/test_shap.py", line 37, in test
    print(explainer(img))
  File "/home/jovyan/use-cases/Scene_understanding/Code_Woodscape/deeplab_v3+/dee_env/lib/python3.9/site-packages/shap/explainers/_permutation.py", line 82, in __call__
    return super().__call__(
  File "/home/jovyan/use-cases/Scene_understanding/Code_Woodscape/deeplab_v3+/dee_env/lib/python3.9/site-packages/shap/explainers/_explainer.py", line 266, in __call__
    row_result = self.explain_row(
  File "/home/jovyan/use-cases/Scene_understanding/Code_Woodscape/deeplab_v3+/dee_env/lib/python3.9/site-packages/shap/explainers/_permutation.py", line 164, in explain_row
    raise ValueError(f"max_evals={max_evals} is too low for the Permutation explainer, it must be at least 2 * num_features + 1 = {2 * len(inds) + 1}!")
ValueError: max_evals=500 is too low for the Permutation explainer, it must be at least 2 * num_features + 1 = 1854721!

In the source code it looks like it's because I don't give enough arguments. I only have three images in my test_img/* folder, is that why?

0 Answers
Related