对训练后的网络权值进行可视化可以判断模型的优劣及是否欠(过)拟合。经过良好训练的网络权值通常表现为美观,光滑;反之则表现为噪声图像,或者图案相关性太高,或者缺乏结构性,或有较多‘死’区域。
可视化代码只需要读取训练后的网络结构和权值文件,将各层的权值数据投影到像素空间即可。
主程序
clear;
clc;
close all;
addpath('matlab');
caffe.set_mode_cpu();
model_dir = 'models/bvlc_reference_caffenet/';
net_model = [model_dir 'deploy.prototxt'];
net_weights = [model_dir 'bvlc_reference_caffenet.caffemodel'];
phase = 'test'; % run with phase test (so that dropout isn't applied)
% Initialize a network
net = caffe.Net(net_model, net_weights, phase);
param_names={'conv1','conv2','conv3','conv4','conv5'};
for i=1:length(param_names)
visualize_weight(net,param_names{i},1);
end
可视化函数
function visualize_weight(net,param_name,space)
w=net.params(param_name,1).get_data();
size(w)
nums=size(w,4);
channels=size(w,3);
width=size(w,2);
count=nums*channels;
n=ceil(sqrt(count));
weight_map=zeros(n*(width+space),n*(width+space),'uint8');
w=w-min(w(:));
w=w/max(w(:))*255;
w=uint8(w);
for i=0:count-1
c=mod(i,n);
r=floor(i/n);
j=mod(i,channels)+1;
k=floor(i/channels)+1;
weight_map(r*(width+space)+(1:width),c*(width+space)+(1:width))=w(:,:,j,k);
end
figure;
imshow(weight_map);
title(param_name);
结果
第一个卷积层的卷积核参数大小为:
11×11×3×96
。