import numpy as np | |
from pytorch_grad_cam.base_cam import BaseCAM | |
class XGradCAM(BaseCAM): | |
def __init__( | |
self, | |
model, | |
target_layers, | |
use_cuda=False, | |
reshape_transform=None): | |
super( | |
XGradCAM, | |
self).__init__( | |
model, | |
target_layers, | |
use_cuda, | |
reshape_transform) | |
def get_cam_weights(self, | |
input_tensor, | |
target_layer, | |
target_category, | |
activations, | |
grads): | |
sum_activations = np.sum(activations, axis=(2, 3)) | |
eps = 1e-7 | |
weights = grads * activations / \ | |
(sum_activations[:, :, None, None] + eps) | |
weights = weights.sum(axis=(2, 3)) | |
return weights | |