Caffe查看每一层学习出来的pattern

Filter visualization


http://www.cnblogs.com/dupuleng/articles/4244877.html

这一节参考http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb,主要介绍如何显示每一层的参数及输出,这一部分非常重要,因为在深度学习中我们关注的就是它学习出来的到底是什么东西

1、导入相关模块以及设置画图参数

复制代码
import numpy as np
import matplotlib.pyplot as plt# Make sure that caffe is on the python path:
caffe_root = '../'  # this file is expected to be in {caffe_root}/examples,建议使用绝对路径
import sys
sys.path.insert(0, caffe_root + 'python')import caffeplt.rcParams['figure.figsize'] = (10, 10)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
复制代码

2、获取分类器并设定相关参数

 通过下面命令获取训练模型

 ./scripts/download_model_binary.py models/bvlc_reference_caffenet
复制代码
caffe.set_phase_test()
caffe.set_mode_cpu()
net = caffe.Classifier(caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt',caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')
# input preprocessing: 'data' is the name of the input blob == net.inputs[0]
net.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'))  # ImageNet mean
net.set_raw_scale('data', 255)  # 像素值范围[0,255]
net.set_channel_swap('data', (2,1,0))  # 训练模型是BGR而不是RGB,所以将测试图片转为BGR格式 
复制代码

3、预测

scores = net.predict([caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')])

4、每一层的特征及大小

[(k, v.data.shape) for k, v in net.blobs.items()]
复制代码
[('data', (10, 3, 227, 227)),('conv1', (10, 96, 55, 55)),('pool1', (10, 96, 27, 27)),('norm1', (10, 96, 27, 27)),('conv2', (10, 256, 27, 27)),('pool2', (10, 256, 13, 13)),('norm2', (10, 256, 13, 13)),('conv3', (10, 384, 13, 13)),('conv4', (10, 384, 13, 13)),('conv5', (10, 256, 13, 13)),('pool5', (10, 256, 6, 6)),('fc6', (10, 4096, 1, 1)),('fc7', (10, 4096, 1, 1)),('fc8', (10, 1000, 1, 1)),('prob', (10, 1000, 1, 1))]
复制代码

以('data', (10, 3, 227, 227))为例,‘data'表示层的名字,10表示批处理数据大小,3表示特征图的个数,227,227分别表示特征图的大小

5、每层参数及大小

[(k, v[0].data.shape) for k, v in net.params.items()]
复制代码
[('conv1', (96, 3, 11, 11)),('conv2', (256, 48, 5, 5)),('conv3', (384, 256, 3, 3)),('conv4', (384, 192, 3, 3)),('conv5', (256, 192, 3, 3)),('fc6', (1, 1, 4096, 9216)),('fc7', (1, 1, 4096, 4096)),('fc8', (1, 1, 1000, 4096))]
复制代码

以('conv1', (96, 3, 11, 11)为例,’conv1'表示层名,96表示滤波器个数,(3,11,11)表示滤波器大小,3为上一层feature map的个数,conv1的上一层是输入为RGB三个通道,因为feature map的个数为3。但对于('conv2', (256, 48, 5, 5)),上一层为 ('norm1', (10, 96, 27, 27)) feature map的个数为96,而48是92/2 , 所以不太清楚是怎么实现的,猜测是第二个卷积层只从norm1层中选择一半进行卷积,可能得去具体研究一下模型了。

6、辅助函数:绘制特征图

复制代码
def vis_square(data, padsize=1, padval=0):data -= data.min()data /= data.max()
    # force the number of filters to be squaren = 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 imagedata = 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)
复制代码

8、显示输入图

plt.imshow(net.deprocess('data', net.blobs['data'].data[4]))

9、"conv1"权重图

filters = net.params['conv1'][0].data  
vis_square(filters.transpose(0, 2, 3, 1)) # RGB转GBR

可以看到是彩色图,因为每个滤波器有三个通道(3,10,10),总共96个。可以看到每个滤波器学到的是特征明显的边缘

10、显示”conv1"输出

feat = net.blobs['conv1'].data[4, :36]
vis_square(feat, padval=1)

“conv1"的输出有256个feature map,这里只显示前36个,当然你也可以选择全部显示

12、可视化”conv2"的权重,“conv2"包含256个大小为 5*5*48的滤波器,这里只显示一部分

48**48 即 48*48。其实要观察第二层到底学习到什么特征,需要考虑第一层的权重,因为这是一个级联的过程,现在有一部分人已经做了这方面的工作了。

filters = net.params['conv2'][0].data
vis_square(filters[:48].reshape(48**2, 5, 5))

12、可视化”conv2"层的输出,即feature map

feat = net.blobs['conv2'].data[4, :36]
vis_square(feat, padval=1)

13、“conv3"层的feature map

feat = net.blobs['conv3'].data[4]
vis_square(feat, padval=0.5)

14、”conv4"层feature map

feat = net.blobs['conv4'].data[4]
vis_square(feat, padval=0.5)

同理可以观察你想输出的任意层的feature map

16、接下来看一下pooling层的影响 

下面是分别是"conv5" "pool5"的输出,可以看出通过pooling层后,每一个feature map的可区分性更强了,这正是分类模型所期望的

17、”fc6" "fc7"是两个全连接层,输出大小为4096*1,”fc6"层的分布比较均匀区分性比较弱,而通过“fc7"层各输出之间的可区分性增强

18、“prob"层即预测层,预测该样本属于每一类的概率,ImageNet数据库有1000类,那么该层输出为1000*1

19、输出top 5的分类 

复制代码
# load labels
imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'
try:labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
except:!../data/ilsvrc12/get_ilsvrc_aux.shlabels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')# sort top k predictions from softmax output
top_k = net.blobs['prob'].data[4].flatten().argsort()[-1:-6:-1]
print labels[top_k]
复制代码
['n02123045 tabby, tabby cat' 'n02123159 tiger cat''n02124075 Egyptian cat' 'n02119022 red fox, Vulpes vulpes''n02127052 lynx, catamount']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 3.0 新 JSON API - Utf8JsonWriter

Utf8JsonWriter类 下面研究一下如何写入json文件。这里需要使用Utf8JsonWriter类。 直接看代码: 这个类需要传递的参数类型是Stream或者Buffer,也就是向Stream或Buffer里面写入数据。 那么就提供一个buffer: 下面单独写一个方法,来…

python查看CNN训练模型参数

参照:http://blog.csdn.net/u011762313/article/details/49851795 #!/usr/bin/env python# 引入“咖啡” import caffeimport numpy as np# 使输出的参数完全显示 # 若没有这一句,因为参数太多,中间会以省略号“……”的形式代替 np.set_prin…

Bumblebee微服务网关之consul服务发现

网关需要维护相关负载的服务器,手动添加相对来说是一件比较麻烦的工作;为了解决这一问题组件扩展了一个基于consul服务发现插件,通过配置这个插件和启用后网关会自动从consul服务中获取服务并添加到网关对应的路由负载规则中。引用插件Bumble…

Github带来的不止是开源,还有折叠的认知

几乎每个程序员都知道github,但是知道目前上面有多少repositories的估计没几个。Z哥今天去看了下,最新的数量显示是1.39亿个。▲截图来自于github.com而这个数字在2008年那会只是3.3万个。这个增长速度可谓真的是“爆炸式增长”。与此同时,大…

最优间隔分类器-SVM

http://blog.csdn.net/Andrewseu/article/details/46991541 本讲大纲: 1.最优间隔分类器(optimal margin classifier) 2.原始/对偶优化问题(KKT)(primal/dual optimization problem) 3.SVM对偶(SVM dual) 4.核方法(…

自动给 Asp.Net Core Api 增加 ApiVersionNeutral

自动给 Asp.Net Core Api 增加 ApiVersionNeutralIntro新增加一个 Controller 的时候,经常忘记在 Controller 上增加 ApiVersion ,结果就导致前端使用指定的 ApiVersion 访问的时候就会失败,不支持的 Api 版本。错误信息如下:{ &q…

K-means与高斯混合模型

K-means http://blog.pluskid.org/?p17 Clustering 中文翻译作“聚类”,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它“这个东西被分为某某类”这样一些例子&#xf…

轻量级ORM《sqlcommon》第一个版本发布了

一、sqlcommon的特色1. 轻量级,整个包只有123kb。2. 性能好,自测。。。3. API和功能简单、代码简短、可维护性好基本都能看懂。这个点我认为很重要,你不用为了实现一个需求而四处查资料,这意味着这个包你可以自行维护修改&#xf…

从基于直方图的Graph-Cut到Grab-Cut

http://blog.csdn.net/zouxy09/article/details/8534954 区别: (1)Graph Cut的目标和背景的模型是灰度直方图,Grab Cut取代为RGB三通道的混合高斯模型GMM; (2)Graph Cut的能量最小化&#xf…

1024程序员节活动继续:购书优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50!满200减100!满300-150!机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码,优惠码使用后相当于:400减230 …

Shape Context

http://blog.csdn.net/u012507022/article/details/52437149 形状上下文特征是一种很流行的形状描述子,多用于目标识别,它采用一种基于形状轮廓的特征描述方法,其在对数极坐标系下利用直方图描述形状特征能够很好地反映轮廓上采样点的分布情况。 形状上下…

使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组

Magicodes.SwaggerUI快速配置和集成SwaggerUI特点通过配置文件简单配置即可完成SwaggerUI的API格式JSON生成和集成支持API分组和隐藏支持自定义页面和验证Nuget包联系我们订阅号关注“麦扣聊技术”微信订阅号可以获得最新文章、教程、文档。QQ群编程交流群<85318032>产品…

机器学习四大降维方法

http://www.36dsj.com/archives/26723 引言 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。…

深入研究.NET Core的本地化机制

ASP.NET Core中提供了一些本地化服务和中间件&#xff0c;可将网站本地化为不同的语言文化。ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。在.NET Core 2.0以上版本, Microsoft.AspNetCore.Localization已经包含在了Microsoft.AspNetCore.All中…

.Net Core 3.0 IdentityServer4 快速入门02

.Net Core 3.0 IdentityServer4 快速入门—— resource owner password credentials&#xff08;密码模式&#xff09;一、前言OAuth2.0默认有四种授权模式&#xff08;GrantType&#xff09;&#xff1a;1&#xff09;授权码模式2&#xff09;简化模式3&#xff09;密码模式&a…

.Net Core3.0 日志 logging

多年的经验&#xff0c;日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试&#xff0c;可以检测到一些问题&#xff0c;但是在上线之后&#xff0c;日志的记录起到至关重要的作用。它可使我们在系统出现问…

在微软工作一年,我学会了什么

大家好&#xff0c;我是运营小马。正如我们所知道的那样&#xff0c;10.23日 &#xff0c;崔庆才因为写文写得很痛苦&#xff0c;将公众号转给我运营。10.24 我兴致勃勃又小心翼翼的宣布了我要运营10.25 崔庆才回来了&#xff0c;他说他有喷薄而出抑制不住的写作欲望&#xff0…

Eclipse调试方法

http://blog.jobbole.com/93421/ 一、Eclipse调试介绍 二、Eclipse中和Debug相关的视图 2.1 Debug View2.2 Variables View2.3 Breakpoints View2.4 Expressions View2.5 Display View 三、Debug 3.1 设置断点 3.2 调试程序 3.2.1 调试本地 Java 语言程序 3.3.2 远程调试 一、…

聊聊 Docker Swarm 部署 gRPC 服务的坑

gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向移动和 HTTP/2 设计&#xff0c;也是目前流行的微服务架构中比较突出的跨语言 RPC 框架。一直以来&#xff0c;我们的微服务都是基于 gRPC 来开发&#xff0c;使用的语言有 .NET、JAVA、Node.js&#xff0c;整体还比较…

动手造轮子:实现一个简单的依赖注入(零)

动手造轮子&#xff1a;实现一个简单的依赖注入(零)Intro依赖注入为我们写程序带来了诸多好处&#xff0c;在微软的 .net core 出来的同时也发布了微软开发的依赖注入框架 Microsoft.Extensions.DependencyInjection&#xff0c;大改传统 asp.net 的开发模式&#xff0c;asp.ne…