如果用公式 y = f(wx+b)来表示整个运算过程的话,那么w和b就是我们需要训练的东西,w称为权值,在cnn中也可以叫做卷积核(filter),b是偏置项。f是激活函数,有sigmoid、relu等。x就是输入的数据。
数据训练完成后,保存在caffemodel里面的,实际上就是各层的w和b值。
我们运行代码:
1 | root = '/home/wei.cheng/' |
就把所有的参数和数据都加载到一个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 | w1=net.params['Convolution1'][0].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 | # -*- coding:utf-8 -*- |