MCPcopy Create free account
hub / github.com/DragonisCV/RAM / IGAnalysis

Class IGAnalysis

scripts/ig.py:8–48  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6import torch
7
8class IGAnalysis(BaseAnalysis):
9 def __init__(self, opt):
10 super().__init__(opt)
11
12 def analyze(self):
13 total_filter_mac = [0.0] * len(self.hook_list)
14 for test_loader in self.test_loaders:
15 test_set_name = test_loader.dataset.opt['name']
16 num_samples = self.opt.get('num_samples',10)
17 print(f'Analyzing {test_set_name}...\n')
18 pbar = tqdm(total=num_samples, desc='')
19 for idx, val_data in enumerate(test_loader):
20 if idx >= num_samples:
21 break
22 tensor_lq = val_data['lq'].to(self.device)
23 imgname = osp.basename(val_data['lq_path'][0])
24 tensor_base = torch.zeros_like(tensor_lq)
25 layer_conductance = self._integrated_gradients(tensor_base, tensor_lq)
26 total_filter_mac = [a + b for a, b in zip(total_filter_mac, layer_conductance)]
27 pbar.set_description(f'Read {imgname}')
28 pbar.update(1)
29 self._save_results(total_filter_mac, 'ig')
30
31 def _integrated_gradients(self, base_img, final_img):
32 total_step = self.opt['total_step']
33 order_array = np.random.permutation(final_img.shape[-2] * final_img.shape[-1])
34 start_ratio = self.opt['pretrained_ratio']
35 all_hook_layer_gradiant = [0.0] * len(self.hook_list)
36
37 for step in range(total_step):
38 alpha = 1 - start_ratio + start_ratio * step / total_step
39 interpolated_img = self._get_interpolated_img_from_linear_path(base_img, final_img, alpha, order_array)
40 self.model.zero_grad()
41 interpolated_output = self.model(interpolated_img)
42 loss = attr_grad(interpolated_output)
43 loss.backward()
44
45 grad = [hook.grad.detach() for hook in self.hook_list]
46 all_hook_layer_gradiant = grad if step == 0 else [a + g for a, g in zip(all_hook_layer_gradiant, grad)]
47
48 return [torch.mean(torch.abs(ig)).detach().cpu().numpy() for ig in all_hook_layer_gradiant]
49
50def main():
51 root_path = osp.abspath(osp.join(__file__, osp.pardir, osp.pardir))

Callers 1

mainFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected