# https://github.com/zhoubolei/CAM/blob/master/pytorch_CAM.py
def returnCAM(feature_conv, weight_softmax, class_idx):
# generate the class activation maps upsample to 256x256
size_upsample = (256, 256)
bz, nc, h, w = feature_conv.shape
output_cam = []
for idx in class_idx:
cam = weight_softmax[idx].dot(feature_conv.reshape((nc, h*w)))
cam = cam.reshape(h, w)
cam = cam - np.min(cam)
cam_img = cam / np.max(cam)
cam_img = np.uint8(255 * cam_img)
output_cam.append(cv2.resize(cam_img, size_upsample))
return output_cam
I am using this cam class for MNIST dataset. However, when I call this for my model I am getting this error.
# generate class activation mapping for the top1 prediction
CAMs = returnCAM(features_blobs[0], weight_softmax, class_idx)
# file name to save the resulting CAM image with
save_name = f"{image_path.split('/')[-1].split('.')[0]}"
# show and save the results
show_cam(CAMs, width, height, orig_image, class_idx, save_name)
Error
ValueError Traceback (most recent call last)
<ipython-input-191-387de70af5d3> in <module>()
30
31 # generate class activation mapping for the top1 prediction
---> 32 CAMs = returnCAM(features_blobs[0], weight_softmax, class_idx)
33 # file name to save the resulting CAM image with
34 save_name = f"{image_path.split('/')[-1].split('.')[0]}"
<ipython-input-186-a6d4fdff602f> in returnCAM(feature_conv, weight_softmax, class_idx)
7 for idx in class_idx:
8
----> 9 cam = weight_softmax[idx].dot(feature_conv.reshape((nc, h*w)))
10 cam = cam.reshape(h, w)
11 cam = cam - np.min(cam)
ValueError: shapes (500,) and (20,144) not aligned: 500 (dim 0) != 20 (dim 0)
Here is my model parameters.
model(
(layer1): Sequential(
(0): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(layer2): Sequential(
(0): Conv2d(20, 50, kernel_size=(5, 5), stride=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(fc1): Linear(in_features=800, out_features=500, bias=True)
(dropout1): Dropout(p=0.5, inplace=False)
(fc2): Linear(in_features=500, out_features=10, bias=True)
)
This is the hook code and I am getting values
# hook the feature extractor
# https://github.com/zhoubolei/CAM/blob/master/pytorch_CAM.py
features_blobs = []
def hook_feature(module, input, output):
features_blobs.append(output.data.cpu().numpy())
model._modules.get('layer1').register_forward_hook(hook_feature)
# get the softmax weight
params = list(model.parameters())
weight_softmax = np.squeeze(params[-2].data.cpu().numpy())
Your help is really appreciated.