使用LIME解释CNN
我們已經介紹過很多解析機器學習模型的方法,例如如pdp、LIME和SHAP,但是這些方法都是用在表格數據的,他們能不能用在神經網絡模型呢?今天我們來LIME解釋CNN。
圖像與表格數據集有很大不同(顯然)。如果你還記得,在之前我們討論過的任何解釋方法中,我們都是根據特征重要性,度量或可視化來解釋模型的。比如特征“A”在預測中比特征“B”有更大的影響力。但在圖像中沒有任何可以命名的特定特征,那么怎么進行解釋呢?
一般情況下我們都是用突出顯示圖像中模型預測的重要區域的方法觀察可解釋性,這就要求了解如何調整LIME方法來合并圖像,我們先簡單了解一下LIME是怎么工作的。
LIME在處理表格數據時為訓練數據集生成摘要統計:
- 使用匯總統計生成一個新的人造數據集
- 從原始數據集中隨機提取樣本
- 根據與隨機樣本的接近程度為生成人造數據集中的樣本分配權重
- 用這些加權樣本訓練一個白盒模型
- 解釋白盒模型
就圖像而言,上述方法的主要障礙是如何生成隨機樣本,因為在這種情況下匯總統計將沒有任何用處
如何生成人造數據集?
最簡單的方法是,從數據集中提取一個隨機樣本,隨機打開(1)和關閉(0)一些像素來生成新的數據集
但是通常在圖像中,出現的對象(如狗vs貓的分類中的:狗&貓)導致模型的預測會跨越多個像素,而不是一個像素。所以即使你關掉一兩個像素,它們看起來仍然和我們選擇樣本非常相似。
所以這里需要做的是設置一個相鄰像素池的ON和OFF,這樣才能保證創造的人工數據集的隨機性。所以將圖像分割成多個稱為超像素的片段,然后打開和關閉這些超像素來生成隨機樣本。
讓我們使用LIME進行二進制分類來解釋CNN的代碼。例如我們有以下的兩類數據。
類別0:帶有任意大小的白色矩形的隨機圖像
類別1:隨機生成的圖像(沒有白色矩形)
然后創建一個簡單的CNN模型
LIME示例
%matplotlib inlineimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom keras.layers import Input, Dense, Embedding, Flattenfrom keras.layers import SpatialDropout1Dfrom keras.layers.convolutional import Conv2D, MaxPooling2Dfrom keras.models import Sequentialfrom randimage import get_random_image, show_arrayimport randomimport pandas as pdimport numpy as npimport limefrom lime import lime_imagefrom skimage.segmentation import mark_boundaries#preparing above dataset artificiallytraining_dataset = []training_label = []for x in range(200):img_size = (64,64)img = get_random_image(img_size) a,b = random.randrange(0,img_size[0]/2),random.randrange(0,img_size[0]/2)c,d = random.randrange(img_size[0]/2,img_size[0]),random.randrange(img_size[0]/2,img_size[0])value = random.sample([True,False],1)[0]if value==False:img[a:c,b:d,0] = 100img[a:c,b:d,1] = 100img[a:c,b:d,2] = 100training_dataset.append(img)training_label.append(value)#training baseline CNN modeltraining_label = [1-x for x in training_label]X_train, X_val, Y_train, Y_val = train_test_split(np.array(training_dataset).reshape(-1,64,64,3),np.array(training_label).reshape(-1,1), test_size=0.1, random_state=42)epochs = 10batch_size = 32model = Sequential()model.add(Conv2D(32, kernel_size=3, padding='same', activation='relu'))model.add(MaxPooling2D(pool_size=2))model.add(Flatten())# Output layermodel.add(Dense(32,activation='relu'))model.add(Dense(1, activation='sigmoid'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])model.fit(X_train, Y_train, validation_data=(X_val, Y_val), epochs=epochs, batch_size=batch_size, verbose=1)讓我們引入LIME
x=10explainer = lime_image.LimeImageExplainer(random_state=42)explanation = explainer.explain_instance(X_val[x], model.predict,top_labels=2))image, mask = explanation.get_image_and_mask(0, positives_only=True,hide_rest=True)上面的代碼片段需要一些解釋
我們初始化了LimeImageExplainer對象,該對象使用explain_instance解釋特定示例的輸出。這里我們從驗證集中選取了第10個樣本,Get_image_and_mask()返回模型與原始圖像一起預測的高亮區域。
讓我們看看一些樣本,它們實際上是1(隨機圖像),但檢測到為0(帶白框的隨機圖像)
可以看到下圖有黃色的突出顯示區域,這張圖片的標簽為1,但被標記為0,這是因為高亮顯示的區域看起來像一個矩形,因此讓模型感到困惑,也就是說模型錯吧黃色標記的部分當成了我們需要判斷的白色矩形遮蔽。
再看看上面兩個圖,與前面的例子類似,模型也預測了class=0。通過黃色區域可以判斷,某種形狀可能被模型曲解為白色方框了。
這樣我們就可以理解模型導致錯誤分類的實際問題是什么,這就是為什么可解釋和可解釋的人工智能如此重要。
https://avoid.overfit.cn/post/8b647e2966aa4aea9da61a81b5f4f3de
作者:Mehul Gupta
總結
以上是生活随笔為你收集整理的使用LIME解释CNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel公式编辑器_用EXCEL图表制
- 下一篇: Swift-基本运算符