【caffe源码研究】第二章:使用篇(5) : 模型可视化

使用python可以比较方便的将模型的过程可视化,看看中间的结果。

我在一个预测年龄的python脚本后面进行。拿之前的数字识别来做实验也可以。
原脚本如下 :

mean_filename='mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean  = caffe.io.blobproto_to_array(a)[0]

age_net_pretrained='./age_net.caffemodel'
age_net_model_file='./deploy_age.prototxt'

age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
                      # mean=mean,
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

example_image = 'test.jpg'
input_image = caffe.io.load_image(example_image)

age_list=['(0, 2)','(4, 6)','(8, 12)','(15, 20)','(25, 32)','(38, 43)','(48, 53)','(60, 100)']
prediction = age_net.predict([input_image]) 

print 'predicted age:', age_list[prediction[0].argmax()]               

添加代码

#打印信息
#网络各层特征和结构,输出:参数中第一个为网络名,后面四个数分别为批处理大小,#滤波器个数,每个神经元中图像大小
print '网络结构\n',[(k, v.data.shape) for k, v in age_net.blobs.items()]

#参数的形状,输出网络参数:
print '网络参数\n',[(k, v[0].data.shape) for k, v in age_net.params.items()]

输出

网络结构
[('data', (1L, 3L, 227L, 227L)), ('conv1', (1L, 96L, 56L, 56L)), ('pool1', (1L, 96L, 28L, 28L)), ('norm1', (1L, 96L, 28L, 28L)), ('conv2', (1L, 256L, 28L, 28L)), ('pool2', (1L, 256L, 14L, 14L)), ('norm2', (1L, 256L, 14L, 14L)), ('conv3', (1L, 384L, 14L, 14L)), ('pool5', (1L, 384L, 7L, 7L)), ('fc6', (1L, 512L)), ('fc7', (1L, 512L)), ('fc8', (1L, 8L)), ('prob', (1L, 8L))]
网络参数
[('conv1', (96L, 3L, 7L, 7L)), ('conv2', (256L, 96L, 5L, 5L)), ('conv3', (384L, 256L, 3L, 3L)), ('fc6', (512L, 18816L)), ('fc7', (512L, 512L)), ('fc8', (8L, 512L))]

新添加一个函数

def vis_square(data, padsize=1, padval=0):
    data -= data.min()
    data /= data.max()

    # force the number of filters to be square
    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))

    # tile the filters into an image
    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.squeeze())
    plt.show()

将第一层卷积层conv1 的滤波器参数可视化

#网络可视化
#显示conv1的滤波器
filters = age_net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))

这里写图片描述

第一层conv1的输出可视化

#第一层的输出:如果个数太多,可以只显示部分
feat = age_net.blobs['conv1'].data[0, :]
vis_square(feat, padval=0.5)

这里写图片描述

同理第二层

#显示conv2的滤波器,注意conv2的参数为('conv2', (50L, 20L, 5L, 5L))
filters = age_net.params['conv2'][0].data
vis_square(filters[:].reshape(256*96, 5, 5))

#第二层的输出,这里只显示前64个
feat = age_net.blobs['conv2'].data[0, :64]
vis_square(feat, padval=1)

注意,这里的
vis_square(filters[:].reshape(256*96, 5, 5))与conv2的参数(‘conv2’, (256L, 96L, 5L, 5L))是相关的,自己的网络需要更改成对应的参数。
这里写图片描述

池化层结果可视化

#池化层1
feat = age_net.blobs['pool1'].data[0,:]
vis_square(feat, padval=1)

#池化层2
feat = age_net.blobs['pool2'].data[0,:]
vis_square(feat, padval=1)

这里写图片描述

这里写图片描述

全连接层ip1参数权重和分布直方图,注意大小改为与自己的参数大小相同

#全连接层ip1滤波器
filters = age_net.params['fc6'][0].data
plt.imshow(filters)
plt.show()
#vis_square(filters[:192].reshape(192*24576, 1, 1))
#全连接层ip2输出直方分布图

feat = age_net.blobs['fc6'].data[0]
plt.subplot(2, 1, 1)
print feat.flat
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)
plt.show()

feat = age_net.blobs['fc7'].data[0]
plt.subplot(2, 1, 1)
print feat.flat
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)
plt.show()

feat = age_net.blobs['fc8'].data[0]
plt.subplot(2, 1, 1)
print feat.flat
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)
plt.show()

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

预测层输出

feat = age_net.blobs['prob'].data[0]
plt.figure(figsize=(15, 3))
plt.plot(feat.flat)
plt.show()

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值