caffe模型各层数据和参数可视化
先用caffe对cifar10进行训练,将训练的结果模型进行保存,得到一个caffemodel,然后从测试图片中选出一张进行测试,并进行可视化。
- #加载必要的库
- import numpy as np
- import matplotlib.pyplot as plt
- %matplotlib inline
- import sys,os,caffe
- #设置当前目录,判断模型是否训练好
- caffe_root = '/home/bnu/caffe/'
- sys.path.insert(0, caffe_root + 'python')
- os.chdir(caffe_root)
- if not os.path.isfile(caffe_root + 'examples/cifar10/cifar10_quick_iter_4000.caffemodel'):
- print("caffemodel is not exist...")
- #利用提前训练好的模型,设置测试网络
- caffe.set_mode_gpu()
- net = caffe.Net(caffe_root + 'examples/cifar10/cifar10_quick.prototxt',
- caffe_root + 'examples/cifar10/cifar10_quick_iter_4000.caffemodel',
- caffe.TEST)
- net.blobs['data'].data.shape
- (1, 3, 32, 32)
- #加载测试图片,并显示
- im = caffe.io.load_image('examples/images/32.jpg')
- print im.shape
- plt.imshow(im)
- plt.axis('off')
- (32, 32, 3)
- (-0.5, 31.5, 31.5, -0.5)
- # 编写一个函数,将二进制的均值转换为python的均值
- def convert_mean(binMean,npyMean):
- blob = caffe.proto.caffe_pb2.BlobProto()
- bin_mean = open(binMean, 'rb' ).read()
- blob.ParseFromString(bin_mean)
- arr = np.array( caffe.io.blobproto_to_array(blob) )
- npy_mean = arr[0]
- np.save(npyMean, npy_mean )
- binMean=caffe_root+'examples/cifar10/mean.binaryproto'
- npyMean=caffe_root+'examples/cifar10/mean.npy'
- convert_mean(binMean,npyMean)
- #将图片载入blob中,并减去均值
- transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
- transformer.set_transpose('data', (2,0,1))
- transformer.set_mean('data', np.load(npyMean).mean(1).mean(1)) # 减去均值
- transformer.set_raw_scale('data', 255)
- transformer.set_channel_swap('data', (2,1,0))
- net.blobs['data'].data[...] = transformer.preprocess('data',im)
- inputData=net.blobs['data'].data
- #显示减去均值前后的数据
- plt.figure()
- plt.subplot(1,2,1),plt.title("origin")
- plt.imshow(im)
- plt.axis('off')
- plt.subplot(1,2,2),plt.title("subtract mean")
- plt.imshow(transformer.deprocess('data', inputData[0]))
- plt.axis('off')
- (-0.5, 31.5, 31.5, -0.5)
- #运行测试模型,并显示各层数据信息
- net.forward()
- [(k, v.data.shape) for k, v in net.blobs.items()]
- [('data', (1, 3, 32, 32)),
- ('conv1', (1, 32, 32, 32)),
- ('pool1', (1, 32, 16, 16)),
- ('conv2', (1, 32, 16, 16)),
- ('pool2', (1, 32, 8, 8)),
- ('conv3', (1, 64, 8, 8)),
- ('pool3', (1, 64, 4, 4)),
- ('ip1', (1, 64)),
- ('ip2', (1, 10)),
- ('prob', (1, 10))]
- #显示各层的参数信息
- [(k, v[0].data.shape) for k, v in net.params.items()]
- [('conv1', (32, 3, 5, 5)),
- ('conv2', (32, 32, 5, 5)),
- ('conv3', (64, 32, 5, 5)),
- ('ip1', (64, 1024)),
- ('ip2', (10, 64))]
- # 编写一个函数,用于显示各层数据
- def show_data(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.figure()
- plt.imshow(data,cmap='gray')
- plt.axis('off')
- plt.rcParams['figure.figsize'] = (8, 8)
- plt.rcParams['image.interpolation'] = 'nearest'
- plt.rcParams['image.cmap'] = 'gray'
- #显示第一个卷积层的输出数据和权值(filter)
- show_data(net.blobs['conv1'].data[0])
- print net.blobs['conv1'].data.shape
- show_data(net.params['conv1'][0].data.reshape(32*3,5,5))
- print net.params['conv1'][0].data.shape
- (1, 32, 32, 32)
- (32, 3, 5, 5)
- #显示第一次pooling后的输出数据
- show_data(net.blobs['pool1'].data[0])
- net.blobs['pool1'].data.shape
- (1, 32, 16, 16)
- #显示第二次卷积后的输出数据以及相应的权值(filter)
- show_data(net.blobs['conv2'].data[0],padval=0.5)
- print net.blobs['conv2'].data.shape
- show_data(net.params['conv2'][0].data.reshape(32**2,5,5))
- print net.params['conv2'][0].data.shape
- (1, 32, 16, 16)
- (32, 32, 5, 5)
- #显示第三次卷积后的输出数据以及相应的权值(filter),取前1024个进行显示
- show_data(net.blobs['conv3'].data[0],padval=0.5)
- print net.blobs['conv3'].data.shape
- show_data(net.params['conv3'][0].data.reshape(64*32,5,5)[:1024])
- print net.params['conv3'][0].data.shape
- (1, 64, 8, 8)
- (64, 32, 5, 5)
- #显示第三次池化后的输出数据
- show_data(net.blobs['pool3'].data[0],padval=0.2)
- print net.blobs['pool3'].data.shape
- (1, 64, 4, 4)
- # 最后一层输入属于某个类的概率
- feat = net.blobs['prob'].data[0]
- print feat
- plt.plot(feat.flat)
- [ 5.21440245e-03 1.58397834e-05 3.71246301e-02 2.28459597e-01
- 1.08315737e-03 7.17785358e-01 1.91939052e-03 7.67927198e-03
- 6.13298907e-04 1.05107691e-04]
- [<matplotlib.lines.Line2D at 0x7f3d882b00d0>]
从输入的结果和图示来看,最大的概率是7.17785358e-01,属于第5类(标号从0开始)。与cifar10中的10种类型名称进行对比:
airplane、automobile、bird、cat、deer、dog、frog、horse、ship、truck
根据测试结果,判断为dog。 测试无误!
原文见:http://www.cnblogs.com/denny402/p/5105911.html
caffe模型各层数据和参数可视化的更多相关文章
- Caffe学习系列(17):模型各层数据和参数可视化
cifar10的各层数据和参数可视化 .caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1p ...
- Caffe学习笔记4图像特征进行可视化
Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...
- Caffe模型读取
caffe模型最终保存使用过的protobuf形式,将一个已经训练好的caffe模型读取出来,可以参考如下: 1,包含的头文件: #include <google/protobuf/io/cod ...
- (原)linux下caffe模型转tensorflow模型
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7419352.html 参考网址: https://github.com/ethereon/caffe- ...
- TensorFlow模型转为caffe模型
最近由于要将训练好的模型移植到硬件上,因此需要将TensorFlow转为caffe模型. caffe模型需要两个文件,一个是定义网络结构的prototxt,一个是存储了参数的caffemodel文件. ...
- tensorflow笔记:模型的保存与训练过程可视化
tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 ...
- 使用caffe模型测试图片(python接口)
1.加载相关模块 1.1 加载numpy import numpy as np 1.2 加载caffe 有两种方法. 方法一(静态导入): 找到当前环境使用的python的site-packages目 ...
- c++ 和 matlab 下的caffe模型输入差异
在向一个caffe模型传递输入数据的时候,要注意以下两点: 1. opencv中Mat数据在内存中的存放方式是按行存储,matlab中图像在内存中的存放方式是按列存储. 2. opencv中Mat数据 ...
- caffe模型参数解释
作者:wjmishuai 出处: http://blog.csdn.net/wjmishuai/article/details/50890214 原始数据是28*28 1:数据层: layer { n ...
随机推荐
- QT中|Qt::Tool类型窗口自动退出消息循环问题解决(setQuitOnLastWindowClosed必须设置为false,最后一个窗口不显示的时候,程序会退出消息循环)
为application 设置setQuitOnLastWindowClosed属性,确实为true: 将其显示为false; 退出该应该程序不能调用QDialog的close消息槽,只能调用qApp ...
- ORA-1157错误解决
一.错误描述 ORA-1157, "cannot identify/lock data file %s - see DBWR trace file" 引起的原因: 因为数据文件已经 ...
- Adobe ZXPInstaller 报错 Installation failed because of a file operation error.
1. Drag a ZXP file or click here to select a file. 拖放一个 zxp 文件或点击打开选择一个 zxp 文件来安装: 2. Installation f ...
- 51nod 1770 数数字 找规律,注意进位,时间复杂度O(n)
题目: 这题很简单,找规律即可. 考虑两次进位: 1.a*b时的进位. 2.aa*b时加法时进位. 代码: #include <bits\stdc++.h> using namespace ...
- VP相关
1.485模块电平,如果是集成的IC模块,则发送低电平,接收高电平: 2.阀门程序移植至PLC注意事项: 1) 阀门程序中的变量厘清,移植过程中阀门程序中的模块有些用到了,有些没用到,所以这是变量也很 ...
- HDU 1587 Flowers【贪心】
题意:给出n种花的价钱,和总的金额m,问最多能够买到多少朵花.先排序,然后就是便宜的花在能够买的范围内能够多买就多买 #include<iostream> #include<cstd ...
- swift 20 - Nested Types
Nested Types 只是为了方便类型的整合和使用 struct BlackjackCard { // nested Suit enumeration enum Suit: Character { ...
- CorelDRAW X6低价再次冲破底线
平时我们看到的标志设计.杂志排版.产品商标.插图描画......这些都是设计师们使用CorelDRAW设计而来.如今CorelDRAW已经成为每个设计师必装的软件,从12年发布CorelDRAW X6 ...
- (2016北京集训十三)【xsy1532】网络战争 - 最小割树+树上倍增+KD树
题解: 好题!! 这题似乎能上我代码长度记录的前五? 调试时间长度应该也能上前五QAQ 首先题目要求的明显就是最小割,当然在整个森林上求Q次最小割肯定是会GG的,所以我们需要一个能快速求最小割的算法— ...
- ip iproute2的典型应用
net-tools和iproute2的命令做对比,做到简单明了,分别演示如何去获取.配置和操作系统网络信息. 以下是net-tools和iproute2的大致对比: 4.1 ip link set-- ...