zoukankan      html  css  js  c++  java
  • 【caffe-windows】 caffe-master 之 卷积核可视化(利用matlab)

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

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

    第一步:

    在创建D:caffe-mastermatlabdemo 下创建 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-mastermatlabdemo 下创建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~

  • 相关阅读:
    一轮项目冲刺9
    一轮项目冲刺8
    一轮项目冲刺7
    一轮项目冲刺6
    一轮项目冲刺5
    一轮项目冲刺4
    一轮项目冲刺3
    一轮项目冲刺2
    一轮项目冲刺1
    移山小分队---每日记录01
  • 原文地址:https://www.cnblogs.com/TensorSense/p/6305737.html
Copyright © 2011-2022 走看看