TensorSense

此篇是利用matlab对caffemodel的卷积核进行可视化。只介绍了卷积核的可视化,不涉及特征图的可视化。 
是参考此博客: http://blog.csdn.net/zb1165048017/article/details/52643188

前期准备,需要两个东西 
1. 模型的描述文件 deploy.prototxt 
2. 模型本身lenet_iter_10000.caffemodel (此处用的examples中的mnist里的)

第一步:

在创建D:\caffe-master\matlab\demo 下创建 visualizing.m

clc
clear
addpath(\'..\') % 加入+caffe路径  
caffe.set_mode_cpu() ;% 设置CPU模式  
model = \'D:/caffe-master/examples/mnist/lenet.prototxt\'; % 模型描述  
weights = \'D:/caffe-master/examples/mnist/lenet_iter_10000.caffemodel\'; % 参数  
net = caffe.Net(model,\'test\'); % 读取net
weight_partvisual( net, 1,1)  % 调用部分显示函数 weight_partvisual( net,layer_num ,channels_num )  
                               %  layer_num是第几个卷积层, channels_num 表示
                               %  显示第几个通道的卷积核,取值范围为 (0,上一层的特征图数)

第二步:

在创建D:\caffe-master\matlab\demo 下创建weight_partvisual.m

function [  ] = weight_partvisual( net,layer_num ,channels_num )  
layers=net.layer_names;  
convlayer=[];  
for i=1:length(layers)  
    if strcmp(layers{i}(1:3),\'con\')  
        convlayer=[convlayer;layers{i}];  
    end  
end  
w=net.layers(convlayer(layer_num,:)).params(1).get_data();  
b=net.layers(convlayer(layer_num,:)).params(2).get_data();  
w=w-min(w(:));  
w=w/max(w(:))*255;  

weight=w(:,:,channels_num,:);%四维,核长*核宽*核左边输入*核右边输出(核个数)  
[kernel_r,kernel_c,input_num,kernel_num]=size(w);  
map_row=ceil(sqrt(kernel_num));%行数  
map_col=map_row;%列数  
weight_map=zeros(kernel_r*map_row,kernel_c*map_col);  
kernelcout_map=1;  
for i=0:map_row-1  
    for j=0:map_col-1  
        if kernelcout_map<=kernel_num  
            weight_map(i*kernel_r+1+i:(i+1)*kernel_r+i,j*kernel_c+1+j:(j+1)*kernel_c+j)=weight(:,:,:,kernelcout_map);  
            kernelcout_map=kernelcout_map+1;  
        end  
    end  
end  
figure  
hAxe=axes(\'Parent\',gcf,... % 设置新的axe, 将\'parent\' 属性设置为当前窗口gcf
    \'Units\',\'pixels\',...     %设置单位为pixels
    \'Position\',[500 0 605 705]);  % 指定axe的位置 left和bottom设定了axe的左下角坐标,width和height设定了窗口的宽度和高度
axes(hAxe);
imshow(uint8(weight_map))  
str1=strcat(\'weight num:\',num2str(kernelcout_map-1));  
title(str1)  

end  

运行 visualizing.m

结果如图: 
这里写图片描述

感觉看不出什么规律来,是否因为mnist图像太小? 而像训练imagenet时模型输入是 256*256,因此训练得到的卷积核看起来有一些规律(类似边缘)。

PS: 这里用的是将 权值(w -min(w) / max(w) ) *255 
这个原理没搞明白,如果有清楚的同学告诉我吧,THX~

分类:

技术点:

相关文章:

猜你喜欢