1、获得深度CNN网络某一层的参数的数值
- 在Matcaffe中,首先激活caffe,并将Net实例化(比如执行语句caffe_net = caffe.Net(test_net_def_file, 'test')) 。假设你的inputs都已经准备好了。前面的其他步骤此处不再提及。(此处用的是Faster R-CNN中的ZF网络)
- 看一看Net.m文件中对相关参数的实现。需要传入的参数包括层的名字layer_name,以及blob的索引号blob_index。
function blob = params(self, layer_name, blob_index)
%通过layer名称与该层中某个blob的索引,获得该blob的参数
CHECK(ischar(layer_name), 'layer_name must be a string');
CHECK(isscalar(blob_index), 'blob_index must be a scalar');
blob = self.layer_vec(self.name2layer_index(layer_name)).params(blob_index);
end
- layer_name是你想获得的参数所在层的名称。通过caffe_net.layer_names命令可获得所有层的名称。比如我想获得conv5的卷积核参数值,则上面的参数layer_name='conv5'
- 一般,在卷积层,卷积核参数包括两个blob,一个是weights,另一个是biases,前者的blob_index为1,后者的blob_index为2。
- 获得blob。
conv5_blob_weights = caffe_net.params('conv5' , 1); %权重blob :
conv5_blob_biases = caffe_net.params('conv5' , 2); %权重blob :
- 从权重blob获得数值,使用的是Blob类的get_data()函数。
conv5_weights = conv5_blob_weights.get_data();
conv5_biases = conv5_blob_biases.get_data();
- 最终,得到的权重和偏置都是4-D的数据,它们也就是卷积核的参数。比如:我的conv5_weights的size为[3,3,384,256],则卷积核的尺寸是3*3大小,被卷积的数据(上一个卷积层输出的卷积特征图)的通道数是384,所以卷积核的通道数也就是384,保持一致。卷积核的第四维度是256,它决定了卷积之后的特征图的通道数是256。我执行conv5_output = caffe_net.blob('conv5').get_data()获得卷积层conv5的输出的数据,那么conv5_output的size为[15,15,256],其中15*15是特征图的大小,256是通道数。conv5_biases的数据说起来是4维的,其实除了第一维度,其他维度都是1,比如此时我的conv5_biases的size为256,对应conv5_weights的“输出维度”256。