windows caffe matlab 可视化

来源:互联网 发布:医药销售数据分析 编辑:程序博客网 时间:2024/06/05 08:57

参考:
http://blog.csdn.net/zb1165048017/article/details/52643188

http://blog.csdn.net/ws_20100/article/details/50525879

%%%%%将.m文件都放在caffe的根目录下,运行下面的代码时也都是在caffe根目录下运行addpath('matlab');%添加+caffe的路径caffe.set_mode_cpu();%设置cpu模式model='models/bvlc_reference_caffenet/deploy.prototxt';%模型weights='models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';%训练好的权值数据%%%%下面两句用于在matlab中创建训练好的网络,即创建一个net的对象,也可以用下面一句代码代替net = caffe.Net(model, weights, 'test'); net=caffe.Net(model,'test');net.copy_from(weights);net%显示网络结构d=load('matlab/+caffe/imagenet/ilsvrc_2012_mean.mat');%%下载均值文件mean_data=d.mean_data;%%%%%%%%%%%%%%%%裁剪生成10幅图片,并显示,裁剪图片过程中用到的都是matlab的基本函数,无关caffe的特定函数im=imread('examples/images/cat.jpg');IMAGE_DIM=256;CROPPED_DIM=227;im_data=im(:,:,[3,2,1]);im_data=permute(im_data,[2,1,3]);im_data=single(im_data);im_data=imresize(im_data,[IMAGE_DIM,IMAGE_DIM],'bilinear');im_data=im_data-mean_data;crops_data=zeros(CROPPED_DIM,CROPPED_DIM,3,10,'single');indices=[0 IMAGE_DIM-CROPPED_DIM]+1;%裁剪生成12346789张图片n=1;for i=indicesfor j=indicescrop_data(:,:,:,n)=im_data(i:i+CROPPED_DIM-1,j:j+CROPPED_DIM-1,:);crop_data(:,:,:,n+5)=crop_data(end:-1:1,:,:,n);n=n+1;endend%%裁剪生成第5和第10张图片center=floor(indices(2)/2)+1;crop_data(:,:,:,5)=im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);crop_data(:,:,:,10)=crop_data(end:-1:1,:,:,5);%%%%%下面的语句用于将裁剪生成的10张图片一起输出,都是matlab的一些基本操作,无关caffe的特定操作cat_map=zeros(CROPPED_DIM*2,CROPPED_DIM*5,3);cat_num=0;for i=0:1for j=0:4cat_num=cat_num+1;cat_map(CROPPED_DIM*i+1:CROPPED_DIM*(i+1),CROPPED_DIM*j+1:CROPPED_DIM*(j+1),:)=crop_data(:,:,:,cat_num);endendimshow(uint8(cat_map));%%%%%%%%%%%%%%%%%前向运算过程%前向运算可用net.forward或net.forward_prefilled%函数net.forward将一个包含输入blob(s)的cell数组作为输入,并输出一个包含输出blob(s)的cell数组。%通过下面两句可以得到1000*10个数据,对于该结构的卷积网络,每幅图片生成1000个输出,共10幅图片,每幅图片的1000个数据代表输出1000个类别的概率%若使用net.forward_prefilled则程序变为:%net.blobs('data').set_data(crop_data);%net.forward_prefilled();%prob = net.blobs('prob').get_data();%%%%%%%%%res=net.forward({crop_data});prob=res{1};%后面这两句可用于判别哪个类别的概率最大prob1=mean(prob,2);[~,maxlabel]=max(prob1);%%%%%%%%%%%%%%%%%%%可视化特征图function[]=feature_partvisual(net,mapnum,crop_num)names=net.blob_names;%%%%对应的是每一层的top,表示输出数据%%访问每一个输出top的方法为net.blobs(这里面是每一个输出blob的名字).get_data();%%mapnum是几就表示获取了第几层的特征图featuremap=net.blobs(names{mapnum}).get_data();%%crop_num表示第几张图片的特征图,前面已将原始图片crop成10张%下面的代码只是用于将某张图片的某层的特征图显示出来,无关caffe特有的函数[m_size,n_size,num,crop]=size(featuremap);row=ceil(sqrt(num));col=row;feature_map=zeros(m_size*row,n_size*col);cout_map=1;for i=0:row-1    for j=0:col-1        if cout_map<=num            feature_map(i*m_size+1:(i+1)*m_size,j*n_size+1:(j+1)*n_size)=(mapminmax(featuremap(:,:,cout_map,crop_num),0,1)*255)';            cout_map=cout_map+1;        end    endendimshow(uint8(feature_map));end%%%%%%%%%%%%%%%%可视化权值function[]=weight_partvisual(net,layer_num,channel_num)layers=net.layer_names;%把所有层的名字列出来covlayer=[];%%找出所有的卷积层for i=1:length(layers)if strcmp(layers{i}(1:3),'con')covlayer=[covlayer;layers{i}];endend%%获取某一层的权值参数和偏置参数w=net.layers(covlayer(layer_num,:)).params(1).get_data();b=net.layers(covlayer(layer_num,:)).params(2).get_data();%%%下面只是将权值显示出来minval=min(min(min(min(w))));maxval=max(max(max(max(w))));w=(w-minval)/maxval*255;weight=w(:,:,channel_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    endendfigureimshow(uint8(weight_map));end
阅读全文
0 0
原创粉丝点击