caffemodel的卷积层可视化(Python接口)
模型文件为自己训练的caffenet_iter_720.caffemodel,模型配置文件为deploy.prototxt。使用jupyter notebook作为Python可视化工具
#首先导入必要的库
In[1]: import numpy as np
import matplotlib.pyplot as plt
import os,sys,caffe
%matplotlib inline
#设置caffe根目录路径,并动态修改系统路径。os.chdir() 方法用于改变当前工作目录到指定的路径。sys.path.insert(0,*)动态修改系统路径
In[2]: caffe_root = '/home/che/caffe-master/'
os.chdir(caffe_root)
sys.path.insert(0,caffe_root+'python')
#显示的图像大小为10*10,图像的插值是以最近为原则,图像颜色为灰色
In[3]: plt.rcParams['figure.figsize'] = [10,10]
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
#加载模型配置文件,即deploy.prototxt文件,和模型文件
In[4]: net = caffe.Net(caffe_root + 'examples/256/deploy.prototxt',
caffe_root + 'examples/256/models/caffenet_iter_720.caffemodel',
caffe.TEST)
[(k, v[0].data.shape) for k, v in net.params.items()]
#编写一个函数用于显示各层参数
In[5]: def show_feature(data, padsize = 1,padval = 0)
data - = data.min()
data /= data.max()
n = int(np.ceil(np.sqrt(data.shape[0])))
padding = ( ( 0 , n ** 2 - data.shape [ 0 ] ) , ( 0 , padsize) , ( 0 , padsize) ) + ( ( 0 , 0 ) , ) * ( data.ndim - 3 )
data = np.pad(data , padding , mode = 'constant' , constant_values = (padval , padval ) )
data = data.reshape( (n , n ) + data.shape[1:] ).transpose((0,2,1,3) + tuple(range(4,data.ndim +1 ) ) )
data = data.reshape( (n * data.shape[1],n * data.shape[3] ) + data.shape[4:])
plt.imshow(data)
plt.axis('off')
#显示conv1权值参数。参数有两种类型:权值和偏置。此处仅显示权值["conv1"][0]
In[6]: weight = net.params["conv1"][0].data
print weight.shape
show_feature(weight.transpose(0,2,3,1))
#显示conv2的前1024个像素的权值参数
In[7] weight = net.params["conv2"][0].data
print weight.shape
show_feature(weight.reshape(256*48,5,5)[:1024])