caffe的python接口学习(8):caffemodel中的参数及特征的抽取

若是用公式  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   #提取某层数据(特征)
相关文章
相关标签/搜索