一個成熟的神經網路就應該有一點自己的想法了!
導讀:為什麼神經網路能做出決策?長久以來,這個黑盒問題一直困擾著我們。不過好在一些技術能幫助我們理解神經網路的決策過程。Hive是一家利用深度學習進行資料分析的公司,他們創造的模型grad-cam能幫助我們一窺神經網路的內部機制。
我們很想知道神經網路學到了什麼、它是依靠什麼來判斷某張圖片是有用的。利用grad-cam,我們研究了模型的預測:運動型別、行動/靜止、毒品(drugs)、暴力、吸引點、種族、年齡等等。

很顯然,在上面兩個圖片中,吸引力模型關注更多的是身體,也就是圖片中部而非人臉。有趣的是,在訓練中並沒有加入任何邊框資訊,但模型自己就學會了定位。該模型在20萬張圖片上進行訓練,研究團隊Hive從中將其分成三類:hot、neutral、not。然後將每組中的分數合併,生成一個打分器,分數從0到10。可以點選這裡,上傳自己的照片試一試。

主要思想是在全域性池化之前將Logit層應用到最後一個卷積層。這會建立一個地圖,展示網路決策中每個畫素的重要性。

上圖最左,橄欖球運動員的照片告訴模型這是一個動作。分類器同樣能識別中間的裸體圖片和右邊代表暴力的槍支。

上圖右側的圖片中有一位穿著西裝的男士,分類器將其認成“電視節目”而非“商業事物”,而這是幫助我們瞭解grad-CAM是如何解釋模型決策的重要例子。

分類器還可以識別動畫片。分類器的關注點往往在人物的邊緣,同時還會加上背景,非常有趣。

CAM和GradCam
類別啟用地圖(CAM)最初是由Zhou建立的,它可以顯示網路正在檢視什麼。對於每個類別,CAM可以標明影象中最重要的部分。
接著,Ramprasaath擴大了CAM的應用範圍。具體來說,CAM可以處理全連線層和更加複雜的場景,例如問答。幸運的是,我們不需要修改網路就能計算grad-CAM。
最近,Chattopadhyay進一步改進了模型,提高了輸出熱圖的準確度,改進後的模型成為Grad-CAM++,它能夠更高效地處理多個類別中的物件,同時能識別出物件的整個輪廓,而非只對明顯部位有反應。這樣的結果是通過正偏導數的加權組合得到的。
以下是在TensorFlow上的安裝方法
one_hot = tf.sparse_to_dense(predicted_class, [num_classes], 1.0) signal = tf.multiply(end_points[‘Logits’], one_hot) loss = tf.reduce_mean(signal)
然後我們計算了損失函式相對於最後一個卷積層的導數,並對這些梯度進行歸一化。
output, grads_val = sess.run([conv_layer, norm_grads], feed_dict={imgs0: img})
之後執行圖形來計算最後一個卷積層的輸出和歸一化的梯度。
weights = np.mean(grads_val, axis = (0, 1)) # [2048] cam = np.ones(output.shape[0 : 2], dtype = np.float32) # [10,10]
計算每個10×10網格的梯度均值作為權重(假設輸入的是299×299的圖片)。由於在最終的10×10的卷積層上有2048個輸出通道,因此有2048個權重。
cam = np.ones(output.shape[0 : 2], dtype = np.float32) # [10,10] for i, w in enumerate(weights): cam += w * output[:, :, i]
生成10×10的粗略輸出作為平均梯度值和最終卷積層的加權總和。
將cam通過RELU,只取積極的分類結果。然後我們將地圖的粗略輸出調整為適合輸入的大小並顯示出來。
最後,主要功能為TensorFlow的slim模型和預處理功能。通過它們計算出grad-CAM的輸出,並將其與輸入照片混合。在下面的程式碼中,我們使用softmax概率最大的類別作為grad_cam的輸入。除此之外,我們還可以選擇任意一個類別,例如:

該模型以99%的概率將圖片預測為“酒精”,0.4%的概率是“賭博”。但是當把predicted_class從酒精轉換成賭博後,我們可以看到,儘管賭博的概率很低,但它仍然能清楚地定點陣圖片中表示賭博的地方。
結語
給大家送一波福利:人工智慧學習資料,有意向的可以加我V,回覆:【學習資料】來領取整理好100G的學習資料
