若是用公式 y=f(wx+b)函數
來表示整個運算過程的話,那麼w和b就是咱們須要訓練的東西,w稱爲權值,在cnn中也能夠叫作卷積核(filter),b是偏置項。f是激活函數,有sigmoid、relu等。x就是輸入的數據。測試
數據訓練完成後,保存的caffemodel裏面,實際上就是各層的w和b值。spa
咱們運行代碼:code
deploy=root + 'mnist/deploy.prototxt' #deploy文件 caffe_model=root + 'mnist/lenet_iter_9380.caffemodel' #訓練好的 caffemodel net = caffe.Net(net_file,caffe_model,caffe.TEST) #加載model和network
就把全部的參數和數據都加載到一個net變量裏面了,可是net是一個很複雜的object, 想直接顯示出來看是不行的。其中:blog
net.params: 保存各層的參數值(w和b)圖片
net.blobs: 保存各層的數據值it
可用命令:io
[(k,v[0].data) for k,v in net.params.items()]
查看各層的參數值,其中k表示層的名稱,v[0].data就是各層的W值,而v[1].data是各層的b值。注意:並非全部的層都有參數,只有卷積層和全鏈接層纔有。class
也能夠不查看具體值,只想看一下shape,可用命令import
[(k,v[0].data.shape) for k,v in net.params.items()]
假設咱們知道其中第一個卷積層的名字叫'Convolution1', 則咱們能夠提取這個層的參數:
w1=net.params['Convolution1'][0].data b1=net.params['Convolution1'][1].data
輸入這些代碼,實際查看一下,對你理解network很是有幫助。
同理,除了查看參數,咱們還能夠查看數據,可是要注意的是,net裏面剛開始是沒有數據的,須要運行:
net.forward()
以後纔會有數據。咱們能夠用代碼:
[(k,v.data.shape) for k,v in net.blobs.items()]
或
[(k,v.data) for k,v in net.blobs.items()]
來查看各層的數據。注意和上面查看參數的區別,一個是net.params, 一個是net.blobs.
實際上數據剛輸入的時候,咱們叫圖片數據,卷積以後咱們就叫特徵了。
若是要抽取第一個全鏈接層的特徵,則可用命令:
fea=net.blobs['InnerProduct1'].data
只要知道某個層的名稱,就能夠抽取這個層的特徵。
推薦你們在spyder中,運行一下上面的全部代碼,深刻理解模型各層。
最後,總結一個代碼:
import caffe import numpy as np root='/home/xxx/' #根目錄 deploy=root + 'mnist/deploy.prototxt' #deploy文件 caffe_model=root + 'mnist/lenet_iter_9380.caffemodel' #訓練好的 caffemodel net = caffe.Net(deploy,caffe_model,caffe.TEST) #加載model和network
[(k,v[0].data.shape) for k,v in net.params.items()] #查看各層參數規模
w1=net.params['Convolution1'][0].data #提取參數w
b1=net.params['Convolution1'][1].data #提取參數b
net.forward() #運行測試
[(k,v.data.shape) for k,v in net.blobs.items()] #查看各層數據規模
fea=net.blobs['InnerProduct1'].data #提取某層數據(特徵)