基於caffe的特徵視覺化

2021-07-04 01:08:04 字數 2904 閱讀 1764

lian jie:

最近想看一看卷積神經網路中各層的卷積結果,但在網上搜尋feature visualization並沒能找到通俗易懂的內容。在caffe的官網教程中,有這麼乙個instant recognition with caffe,參照它可以很快的做出視覺化的結果。但感覺裡面還是稍有些複雜,這裡做了些簡化,達到目的即可。

import caffe

import matplotlib.pyplot as plt

import matplotlib.cm as cm

import numpy as np

利用配置檔案載入訓練好的模型:

net = caffe.classifier("./alexnet_deploy.prototxt","bvlc_alexnet.caffemodel", mean=np.float([104.0, 116.0, 122.0]), channel_swap=(2,1,0))
這裡我使用的是alexnet模型。

caffe中的資料都是在blobs中存的,我們可以看一下其結構:

in [103]: net.blobs

out[103]: ordereddict([('data', ), ('conv1', ), ('norm1', ), ('pool1', ), ('conv2', ), ('norm2', ), ('pool2', ), ('conv3', ), ('conv4', ), ('conv5', ), ('pool5', ), ('fc6', ), ('fc7', ), ('fc8', ), ('prob', )])

可以看到輸入的data,五層卷積+pooling,以及三層全連線fc,和最後的**概率結果prob

然後,使用這個模型做**:

net.predict([caffe.io.load_image("./image.jpg")])
這裡會直接輸出1000維的陣列,每個值都是**該類的概率。這**結果不是重點,可以忽略。

跑了一遍**之後,各層就有了具體的資料,我們就可以看每層的視覺化結果了。比如,conv1層:

in [104]: net.blobs['conv1']

out[104]: in [105]: conv1 = net.blobs['conv1']

in [106]: conv1.

conv1.channels conv1.data conv1.height conv1.reshape

conv1.count conv1.diff conv1.num conv1.width

可以看到conv1層有8個引數,其中channels是該層的卷積核的數量,即96,heightwidth分別是該層結果的高和寬,即55×55,num是patch的個數,是在模型的配置檔案中alexnet_deploy.prototxt設定好的,這裡是10,count是引數的總個數,本層有2904000個引數,diff是訓練時使用的誤差,這裡不是訓練,所以全部為0,data裡包含了我們需要的資料,其維度為10×96×55×55,因為我們就識別了一張,所以只取第乙個就可以了:

conv1_data = conv1.data[0,:]
要視覺化就需要顯示結果,可以使用下面的函式:

def vis_square(data, padsize=1, padval=0):

data -= data.min()

data /= data.max()

n = int(np.ceil(np.sqrt(data.shape[0])))

padding = ((0, n**2-data.shape[0]), (0, padsize), (0, padsize))+((0,0),)*(data.ndim-3)

data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))

data = data.reshape((n,n)+data.shape[1:]).transpose((0,2,1,3)+tuple(range(4, data.ndim+1)))

data = data.reshape((n*data.shape[1], n*data.shape[3])+data.shape[4:])

plt.imshow(data, cmap=cm.gray)

這個函式來自於caffe官方的文件,我僅在最後一行做了修改,新增了cmap=cm.gray,讓結果顯示為灰度,而不是彩色的。

先看下卷積第一層96個結果:

in [122]: vis_square(conv1_data, padval=1)

in [123]: plt.show()

結果如下,看灰度可能不太明顯,可以刪掉函式vis_square中最後一行的cmap=cm.gray,得到彩色的結果,看起來就明顯多了。

看下第85個結果:

in [180]: res = conv1_data[84:85, :]

in [181]: vis_square(res, padval=1)

in [182]: plt.show()

特徵視覺化

colormap 色度圖 的視覺表示和colormap 的數值,左邊的顏色模式表示較低的灰度值,右邊的則表示較高的灰度值。得到特徵圖fea後,heatmap np.mean fea,axis 1 heatmap np.maximum heatmap,0 heatmap與0比較,取其大者 heatma...

caffe模型視覺化

通過前面的學習,我們已經能夠正常訓練各種資料了。設定好solver.prototxt後,我們可以把訓練好的模型儲存起來,如lenet iter 10000.caffemodel。訓練多少次就自動儲存一下,這個是通過snapshot進行設定的,儲存檔案的路徑及檔名字首是由snapshot prefix...

Caffe網路視覺化

最近在學習caffe,但是作為曾經的windows深度使用者,還是比較習慣視覺化的介面。然而,caffe當然是在linux os x系統下更好啦,因為一般還是寫script在命令列裡面玩的。所以這樣就不直觀咯,為了能直觀地看清楚網路結構,而不是看prototxt腦補 視覺化就很重要了。幸好,開發ca...