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