可视化卷及神经网络热力图
我們這里介紹的一種可視化方法,它有助于了解一張圖像的哪一部分讓卷積神經網絡做出了最終的分類決策。這有助于對卷積神經網絡的決策過程進行調試,特別是分類錯誤的情況下。這種方法可以定位圖像中的特定目標。
我們使用預訓練的VGG網絡來演示這種方法。
from keras.applications.vgg16 import VGG16K.clear_session() model = VGG16(weights='imagenet')
如圖所示,這是兩只非洲象的圖片。我們將這張圖片轉換為VGG16能夠讀取的格式:模型大小為224224的圖像上進行訓練,這些訓練圖像都根據keras.applications.vgg16.preprocess_input函數中的內置的規則進行預處理。因此,我們需要加載圖像,將其大小調整為224224,然后將其轉化為float32格式的Numpy張量,并應用這些預處理規則。
可以在圖像上運行預訓練的VGG16網絡,并將預測向量解碼為我們可以讀的形式。
preds = model.predict(x) print('Predicted:', decode_predictions(preds, top=3)[0])Predicted: [(‘n02504458’, ‘African_elephant’, 0.90942144), (‘n01871265’, ‘tusker’, 0.08618243), (‘n02504013’, ‘Indian_elephant’, 0.0043545929)]
對這個圖像預測的前三個類別分別是:
- 非洲象:92.5%的概率
- 長牙動物:7%的概率
- 印度象:0.4%的概率
網絡認為預測向量中最大激活的元素對應是“非洲象”類別的元素,索引編號386
np.argmax(preds[0])386
為了展示圖像中哪些部分最像非洲象,我們使用Grad-CAM算法:
african_elephant_output = model.output[:, 386] # 預測向量中的非洲象元素last_conv_layer = model.get_layer('block5_conv3') # block5_conv3層的輸出特征圖,它是VGG16的最后一個卷積層grads = K.gradients(african_elephant_output, last_conv_layer.output)[0] # 非洲象類別相對于block5_conv3輸出特征圖的梯度pooled_grads = K.mean(grads, axis=(0, 1, 2)) # 形狀是(512, )的向量,每個元素是特定特征圖通道的梯度平均大小iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]]) # 這個函數允許我們獲取剛剛定義量的值:對于給定樣本圖像,pooled_grads和block5_conv3層的輸出特征圖pooled_grads_value, conv_layer_output_value = iterate([x]) # 給我們兩個大象樣本圖像,這兩個量都是Numpy數組for i in range(512):conv_layer_output_value[:, :, i] *= pooled_grads_value[i] # 將特征圖數組的每個通道乘以這個通道對大象類別重要程度heatmap = np.mean(conv_layer_output_value, axis=-1) # 得到的特征圖的逐通道的平均值即為類激活的熱力圖 heatmap = np.maximum(heatmap, 0) heatmap /= np.max(heatmap) plt.matshow(heatmap) plt.show()最后,我們可以用OpenCV來生成一張圖像,將原始圖像疊加在剛剛得到的熱力圖上
import cv2img = cv2.imread(img_path) # 用cv2加載原始圖像heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0])) # 將熱力圖的大小調整為與原始圖像相同heatmap = np.uint8(255 * heatmap) # 將熱力圖轉換為RGB格式heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) # 將熱力圖應用于原始圖像superimposed_img = heatmap * 0.4 + img # 這里的0.4是熱力圖強度因子cv2.imwrite('/Users/fchollet/Downloads/elephant_cam.jpg', superimposed_img) # 將圖像保存到硬盤更多精彩內容,歡迎關注我的微信公眾號:數據瞎分析
總結
以上是生活随笔為你收集整理的可视化卷及神经网络热力图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷机神经网络的可视化(可视化中间激活)
- 下一篇: 实现对文本的简单one-hot编码