# Saliency Maps的原理与简单实现(使用Pytorch实现)

• A+

## Saliency Maps的原理

### 简单解释 ### 对于复杂的网络 ### Saliency Maps的另外一种解释 ### Saliency Maps实验结果 ## Saliency Maps的具体操作

• 计算Saliency Map的时候首先要计算与图像像素对应的正确分类中的标准化分数的梯度(这是一个标量)。如果图像的形状是(3, H, W)，这个梯度的形状也是(3, H, W)；
• 对于图像中的每个像素点，这个梯度告诉我们当像素点发生轻微改变时，正确分类分数变化的幅度。
• 之后，我们计算出梯度的绝对值，然后再取三个颜色通道的最大值；因此最后的saliency map的形状是(H, W)为一个通道的灰度图。

## Saliency Maps简单实现(Pytorch版本)

### 计算输入X的导数

1. def compute_saliency_maps(X, y, model):
2.     """
3.     X表示图片, y表示分类结果, model表示使用的分类模型
4.
5.     Input :
6.     - X : Input images : Tensor of shape (N, 3, H, W)
7.     - y : Label for X : LongTensor of shape (N,)
8.     - model : A pretrained CNN that will be used to computer the saliency map
9.
10.     Return :
11.     - saliency : A Tensor of shape (N, H, W) giving the saliency maps for the input images
12.     """
13.     # 确保model是test模式
14.     model.eval()
17.     saliency = None
18.     logits = model.forward(X)
19.     logits = logits.gather(1, y.view(-1, 1)).squeeze() # 得到正确分类
20.     logits.backward(torch.FloatTensor([1., 1., 1., 1., 1.])) # 只计算正确分类部分的loss
21.     saliency = abs(X.grad.data) # 返回X的梯度绝对值大小
22.     saliency, _ = torch.max(saliency, dim=1)
23.     return saliency.squeeze()

### 显示实验结果

1. def show_saliency_maps(X, y):
2.     # Convert X and y from numpy arrays to Torch Tensors
3.     X_tensor = torch.cat([preprocess(Image.fromarray(x)) for x in X], dim=0)
4.     y_tensor = torch.LongTensor(y)
5.     # Compute saliency maps for images in X
6.     saliency = compute_saliency_maps(X_tensor, y_tensor, model)
7.     # Convert the saliency map from Torch Tensor to numpy array and show images
8.     # and saliency maps together.
9.     saliency = saliency.numpy()
10.     N = X.shape
11.     for i in range(N):
12.         plt.subplot(2, N, i + 1)
13.         plt.imshow(X[i])
14.         plt.axis('off')
15.         plt.title(class_names[y[i]])
16.         plt.subplot(2, N, N + i + 1)
17.         plt.imshow(saliency[i], cmap=plt.cm.hot)
18.         plt.axis('off')
19.         plt.gcf().set_size_inches(12, 5)
20.     plt.show()
21. show_saliency_maps(X, y) ### 关于gather的一些说明 ## Saliency Maps的应用 • 最左侧为原图像；
• 第二列表示计算得到的Saliency Maps；
• 第三列表示作者设定了一个阈值，超过认为是重要的(图中蓝色的部分是比较重要的)；
• •
{"ft_lang_label":"__label__zh","ft_lang_prob":0.7788007,"math_prob":0.9610037,"size":3237,"snap":"2019-51-2020-05","text_gpt3_token_len":1861,"char_repetition_ratio":0.14846891,"word_repetition_ratio":0.011142061,"special_character_ratio":0.25548348,"punctuation_ratio":0.19327731,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9651579,"pos_list":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24],"im_url_duplicate_count":[null,3,null,3,null,3,null,3,null,3,null,3,null,3,null,3,null,3,null,null,null,null,null,null,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2020-01-29T14:06:46Z\",\"WARC-Record-ID\":\"<urn:uuid:4efcd211-1f74-40f1-908d-49d6df8d8e50>\",\"Content-Length\":\"69935\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:fc0c7764-e60b-4639-beaa-4b495462b566>\",\"WARC-Concurrent-To\":\"<urn:uuid:3e776168-936c-4c81-b556-7beb1e3ae45a>\",\"WARC-IP-Address\":\"118.190.158.119\",\"WARC-Target-URI\":\"https://mathpretty.com/10683.html\",\"WARC-Payload-Digest\":\"sha1:PRIYM7USGT5TUDSIDB5EF22F3U2T6JPR\",\"WARC-Block-Digest\":\"sha1:KR73KV3LLVFYUUJUXEPM4RCIZ3AZ5XUK\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2020/CC-MAIN-2020-05/CC-MAIN-2020-05_segments_1579251799918.97_warc_CC-MAIN-20200129133601-20200129163601-00101.warc.gz\"}"}