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,height
和width
分別是該層結果的高和寬,即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...