Fork me on GitHub

caffe 权重介绍

如果用公式 y = f(wx+b)来表示整个运算过程的话,那么w和b就是我们需要训练的东西,w称为权值,在cnn中也可以叫做卷积核(filter),b是偏置项。f是激活函数,有sigmoid、relu等。x就是输入的数据。

数据训练完成后,保存在caffemodel里面的,实际上就是各层的w和b值。

我们运行代码:

1
2
3
4
root = '/home/wei.cheng/'
deploy = root + 'deploy.prototxt' #deploy文件
caffe_model = root + 'lenet_iter_1000.caffemodel' #训练好的 caffemodel
net = caffe.Net(net_file,caffe_model,caffe.TEST) #加载model和network

就把所有的参数和数据都加载到一个net变量里面了,但是net是一个很复杂的object, 想直接显示出来看是不行的。其中:

net.params: 保存各层的参数值(w和b)

net.blobs: 保存各层的数据值;

可用命令:

1
[(k,v[0].data) for k,v in net.params.items()]

查看各层的参数值,其中k表示层的名称,v[0].data就是各层的W值,而v[1].data是各层的b值

注意:并不是所有的层都有参数,只有卷积层全连接层才有。

也可以不查看具体值,只想看一下shape,可用命令

1
[(k,v[0].data.shape) for k,v in net.params.items()]

假设我们知道其中第一个卷积层的名字叫’Convolution1’, 则我们可以提取这个层的参数:

1
2
w1=net.params['Convolution1'][0].data
b1=net.params['Convolution1'][1].data

同理,除了查看参数,我们还可以查看数据。

但是要注意的是,net里面刚开始是没有数据的,需要在运行前向计算之后才可以看到数据:

1
net.forward()

之后才会有数据。我们可以用代码:

1
[(k,v.data.shape) for k,v in net.blobs.items()]

1
[(k,v.data) for k,v in net.blobs.items()]

来查看各层的数据。注意和上面查看参数的区别,一个是net.params, 一个是net.blobs.

实际上数据刚输入的时候,我们叫图片数据,卷积之后我们就叫特征了。

如果要抽取第一个全连接层的特征,则可用命令:

1
fea=net.blobs['InnerProduct1'].data

只要知道某个层的名称,就可以抽取这个层的特征。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding:utf-8 -*-
import caffe
import numpy as np

def execute():
root = '/home/lwang/work/chengw/test/python/learn_caffe/'
prototxt_file = root + 'train_val.prototxt'
caffe_model = root + 'bvlc_alexnet.caffemodel'
net = caffe.Net(prototxt_file, caffe_model, caffe.TEST) # 加载model和network
#[(k, v[0].data.shape) for k, v in net.params.items()] # 查看各层参数规模
for k, v in net.params.items():
print 'k:',k
print 'data shape:',v[0].data.shape
print 'bias shape:',v[1].data.shape

w1 = net.params['conv3'][0].data # 提取参数w
print 'conv3 w1 shape:',net.params['conv3'][0].shape
print 'conv3 w1 data:',w1

b1 = net.params['conv3'][1].data # 提取参数b
print 'conv3 b1 shape:',net.params['conv3'][1].shape
print 'conv3 b1:',b1

net.forward() # 运行测试

#[(k, v.data.shape) for k, v in net.blobs.items()] # 查看各层数据规模
for k, v in net.blobs.items():
print 'k:',k
print 'data shape:',v.data.shape

fea = net.blobs['fc7'].data # 提取某层数据(特征)
print 'fc7:',fea
return

if __name__ == '__main__':
execute()
您的鼓励是我持之以恒的动力