1

caffe 权重介绍

 2 years ago
source link: https://davidchan0519.github.io/2019/08/30/caffe-model-introduce/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

caffe 权重介绍

Posted on

2019-08-30

| Views: 94

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

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

我们运行代码:

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: 保存各层的数据值;

可用命令:

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

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

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

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

[(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

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

但是要注意的是,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

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

示例代码:

# -*- 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()

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK