ZfNet解卷积:可视化CNN模型( PythonCode可视化Cifar10)
原文链接:caffe Model的可视化 snapshot: 6000
一个在线可视化小工具:http://blog.csdn.net/10km/article/details/52713027
Place205 Model集结地:http://places.csail.mit.edu/downloadCNN.html
参考文章:深度学习之可视化-ZfNet去卷积
前言
由来已久,ANN方法被称为模式识别里面的“黑盒”方法,因为ANN模型不能使用明确的函数——形式化的数学公式进行表示,同时也意味着应对评价模型,面对函数寻求最优解的优化方程也不能形式化表示。
基于NN的分层堆叠性,NN即使以特定结构三层网便可以以任意精度逼近任意非线性函数,也同时表示函数形式在NN中的难以形式化。K曾经证明(1957),在单位超立方体内的任意连续函数,都可以选择适当的参数展开为两级级数求和问题。后来的研究发现,任意一个从x到y的映射,都存在一个合适的三层神经网络以任意的精度逼近它。
反过来看,从神经网络结构和参数,去描述函数的一个形式,涉及到拟合问题,是个不确定问题。进而以此归结出基于模型函数的优化函数,则是不可能完成的事情。从这个角度上看来,NN是个语义和语法的黑箱。
好在对于学习来说,形式化是非必须的,可形式化的SVM也面临着核函数的形式化难题,而CNN可以从语义层次进行解析,以弥补语法不能完备的缺憾。
ZFNet思想及过程
从科学的观点出发,如果不能归纳,只能进行遍历。如果不知道神经网络为什么取得了如此好的效果,那么只能靠不停的实验来寻找更好的模型。
ZFNet使用一个多层的反卷积网络来可视化训练过程中特征的演化及发现潜在的问题;同时根据遮挡图像局部对分类结果的影响来探讨对分类任务而言到底那部分输入信息更重要。
反卷积可视化:
一个卷积层加一个对应的反卷积层;
输入是feature map,输出是图像像素;
过程包括反池化操作、relu和反卷积过程。
反池化:
严格意义上的反池化是无法实现的。作者采用近似的实现,在训练过程中记录每一个池化操作的一个z*z的区域内输入的最大值的位置,这样在反池化的时候,就将最大值返回到其应该在的位置,其他位置的值补0。
relu纠正:
卷积神经网络使用relu非线性函数来保证输出的feature map总是为正数。在反卷积的时候,也需要保证每一层的feature map都是正值,所以这里还是使用relu作为非线性激活函数。
滤波:
使用原卷积核的转秩和feature map进行卷积。反卷积其实是一个误导,这里真正的名字就是转秩卷积操作。反卷积网中利用卷积网中的相同的滤波器的转置应用到纠正过的特征图中,而不是上层的输出。也就是对滤波器进行水平方向和垂直方向的翻转。从高层向下投影使用转换变量switch,这个转化变量switch产生自向上的卷积网的最大池化操作。由于重建由一个单独的激活获得,因此也就只对应于原始输入图像的一小块。
上图左半部分是一个解卷积层,右半部分为一个卷积层。解卷积层将会重建一个来自下一层的卷积特征近似版本。图中使用switc来记录在卷积网中进行最大池化操作时每个池化区域的局部最大值的位置,经过非池化操作之后,原来的非最大值的位置都置为0。
特征可视化:
每个特征单独投影到像素空间揭露了不同的结构能刺激不同的一个给定的特征图,因此展示了它对于变形的输入内在的不变性。下图即在一个已经训练好的网络中可视化后的图。
上图所示是训练结束后,模型各个隐藏层提取的特征,图所示的是给定输出特征时,反卷积产生的最强的9个输入特征。将这些计算所得的特征,用像素空间表示后,可以清晰地看出:一组特定的输入特征(通过重构获得),将刺激卷积网产生一个固定的输出特征。图2的右边是对应的输入图片,和重构特征相比,输入图片和其之间的差异性很大,而重构特征只包含那些具有判别能力的纹理结构。例如,第5层第1行第2列的9张输入图片各不相同差异很大,而对应的重构输入特征则都显示了背景中的草地,没有显示五花八门的前景。
每一层的可视化结果都展示了网络的层次化特点。第2层展示了物体的边缘和轮廓,以及与颜色的组合,第3层拥有了更复杂的不变性,主要展示了相似的纹理,第4层不同组重构特征存在着重大差异性,开始体现了类与类之间的差异,第5层每组图片都展示了存在重大差异的一类物体。
训练过程中的feature变化:
外表突然的变化导致图像中的一个变换即产生了最强烈的激活。模型的底层在少数几个epoches就能收敛聚集,然而上层在一个相当多的epoches(40-50)之后才能有所变化,这显示了让模型完全训练到完全收敛的必要性。可以由下图看到颜色对比度都逐步增强。
特征不变性
下图所示,5个不同的例子,它们分别被平移、旋转和缩放。图5右边显示了不同层特征向量所具有的不变性能力。在第一层,很小的微变都会导致输出特征变化明显,但是越往高层走,平移和尺度变化对最终结果的影响越小,网络的输出对于平移和尺度变化都是稳定的。卷积网无法对旋转操作产生不变性,除非物体具有很强的对称性,看似是个伪命题。
同类不同图像的一致性分析
对五张小狗(同一类)的不同图片的不同区域进行掩盖,然后进行分析观察探究深度模型是对一类物体的那部分进行一致性分析的过程...............
第5层随机遮挡的情况比其他眼睛鼻子被遮挡的情况一致性分析较差,而第7层中,这四类却都差不多,那是因为底层判别的是一类物体共有的部分,而高层判别的是类别中不同的品种这种更高维的部分了。
迁移学习的可行性
把预训练的CNN模型用于新的场景,是迁移学习的应用表现。底层CNN-featureMap的通用性为这种移动提供了一个有力的实验支持。迁移学习一般从复杂模型迁移到简单模型,且一般使用迁移模型的底层部分,高层模型需要进行重建。
PythonCode
code1.训练Cifar10网络
下载Cifar10的数据集:得到
mean.binaryproto 文件
cifar10_test_lmdb cifar10_train_lmdb 文件夹,把三个文件和目录,复制到examples\cifar10 目录
建立CMD文件 cifar10_train_full.cmd 到工程的根目录,与example平级
内容为:D:\Works\CNN\MsCaffe\Build\x64\Release/caffe.exe train --solver=examples/cifar10/cifar10_quick_solver.prototxt
pause
运行cmd命令
训练结果:
生成结果到 examples/cifar10/根目录,生成了H5后缀的训练模型。
2. 可视化Caffe model
在Eclipse工程中,添加一个py文件,内容为:
#coding=utf-8
"""
Caffe visualize
Display and Visualization Functions and caffe model. Copyright (c) 2017 Matterport, Inc.
Licensed under the MIT License (see LICENSE for details)
Written by wishchin yang MayBe I should use jupyter notebook
""" import numpy as np
import matplotlib.pyplot as plt
import os,sys,caffe
#%matplotlib inline #编写一个函数,用于显示各层的参数
def show_feature(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);
plt.axis('off'); #第一个实例,测试cifar10模型
def mainex(): caffe_root='D:/Works/CNN/MsCaffe/';
os.chdir(caffe_root);
sys.path.insert(0,caffe_root+'python'); plt.rcParams['figure.figsize'] = (8, 8);
plt.rcParams['image.interpolation'] = 'nearest';
plt.rcParams['image.cmap'] = 'gray'; net = caffe.Net(caffe_root + 'examples/cifar10/cifar10_quick_train_test.prototxt',
caffe_root + 'examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5',
caffe.TEST); [(k, v[0].data.shape) for k, v in net.params.items()]; # 第一个卷积层,参数规模为(32,3,5,5),即32个5*5的3通道filter
weight = net.params["conv1"][0].data
print(weight.shape);
show_feature(weight.transpose(0, 2, 3, 1)); # 第二个卷积层的权值参数,共有32*32个filter,每个filter大小为5*5
weight = net.params["conv2"][0].data;
print weight.shape;
show_feature( weight.reshape(32**2, 5, 5) ); # 第三个卷积层的权值,共有64*32个filter,每个filter大小为5*5,取其前1024个进行可视化
weight = net.params["conv3"][0].data ;
print weight.shape ;
show_feature(weight.reshape(64*32, 5, 5)[:1024]); if __name__ == '__main__':
import argparse
mainex();
调试运行.............................................
结果显示:
conv1层 conv2层
结果分析:迭代4000次训练的结果不是特别好,并没有训练得到明显的底层特征。
ZfNet解卷积:可视化CNN模型( PythonCode可视化Cifar10)的更多相关文章
- 【深度学习系列】CNN模型的可视化
前面几篇文章讲到了卷积神经网络CNN,但是对于它在每一层提取到的特征以及训练的过程可能还是不太明白,所以这节主要通过模型的可视化来神经网络在每一层中是如何训练的.我们知道,神经网络本身包含了一系列特征 ...
- visual formatting model (可视化格式模型)【持续修正】
概念: visual formatting model,可视化格式模型 The CSS visual formatting model is an algorithm that processes a ...
- Visual formatting model 可视化格式模型
在可视化格式模型里,每个元素都是由一个或者多个盒子组成,这些盒子的布局由下面规则控制: box dimensions and type.(块元素和行内元素) positioning scheme (n ...
- 可视化CNN神经网路第一层参数
在上Andrew Ng的课的时候搜集到了课程里面自带的显示NN参数的代码,但是只能显示灰度图,而且NN里的参数没有通道的概念.所以想要获得可视化CNN的参数,并且达到彩色的效果就不行了. 所以就自己写 ...
- CSS概念 - 可视化格式模型(二) 定位概述(普通流、绝对定位)
2.定位概念 上一节熟悉了盒模型, 现在来看一下可视化格式模型和定位模型. 理解这两个模型的细微差异是非常重要的, 因为它们一起控制着如何在页面上布置每个元素 2.1 可视化格式模型 CSS有三种基本 ...
- CSS概念 - 可视化格式模型(一) 盒模型与外边距叠加
可以参考<精通CSS 高级WEB标准解决方案>第三章. 可视化格式模型 可视化格式模型要掌握的3个最重要的CSS概念是 浮动.定位.盒模型. 这些概念控制在页面上安排和显示元素的方式, 形 ...
- CSS——可视化格式模型
CSS的可视化格式模型 CSS中规定每一个元素都有自己的盒子模型(相当一规定了这个元素如何显示): 然后可视化格式模型则是把这些盒子模型按照规则摆放到页面上,也就是如何布局: 换句话说,盒子模型规定了 ...
- 可视化格式模型(visual formatting model)
原文 简书原文:https://www.jianshu.com/p/7632f16ff555 大纲 1.认识可视化模型 2.可视化模型的内容 3.可视化模型的影响因素 1.认识可视化模型 盒子模型是C ...
- pytorch模型结构可视化,可显示每层的尺寸
最近在学习一些检测方面的网络,使用的是pytorch.模型结构可视化是学习网络的有用的部分,pytorch没有原生支持这个功能,需要找一些其他方式,下面总结几种方法(推荐用4). 1. torch . ...
随机推荐
- T1002 搭桥 codevs
http://codevs.cn/problem/1002/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城 ...
- MYSQL中插入数据以及修改数据的部分方法
#插入/增加:使用INSERT #修改:使用ALTER #修改数据类型ALTER TABLE table02 MODIFY COLUMN cname VARCHAR(100);ALTER TABLE ...
- Spring/Maven/MyBatis配置文件结合properties文件使用
使用properties文件也叫注入,比如把一些常用的配置项写入到这个文件,然后在Spring的XML配置文件中使用EL表达式去获取. 这种方式不只Spring可以使用,同样MyBatis也可以使用, ...
- 可恢复的安全rm
我们常常使用rm去删除一些文件.假设不小手一抖,那么就悲剧了.你们都懂的... 在经历过一次这种慘剧后.决定永远杜绝这种情况.重写写了shell函数.运行安全的rm.这个函数会把要删除的文件按日期备份 ...
- Scope Is the Enemy of Success
 Scope Is the Enemy of Success Dave Quick SCopE REFERS To A pRojECT'S SizE. How much time, effort, ...
- geek青年的状态机,查表,纯C语言实现
geek青年的状态机,查表,纯C语言实现 1. 问题的提出.抽象 建一,不止是他,不少人跟我讨论过这种问题:怎样才干保证在需求变更.扩充的情况下.程序的主体部分不动呢? 这是一个很深刻和艰难的问题.在 ...
- webrtc 视频 demo
webrtc 视频 demo webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B A webrtc.html作为offer <!DOCTYPE ...
- swift 2.0 语法 可选类型
import UIKit /*: 可选类型(可以有值, 也可以没有值) * 在OC中我们可以给一个对象类型变量赋值为nil或者一个对象, 而在Swift中如果想给一个变量赋值为nil那么必须明确指定为 ...
- 利用 gnuplot_i 在你的 c 程序中调用 GNUPLOT
这是一篇非常早曾经写的小文章,最初发表于我的搜狐博客(2008-09-23 22:55).由于自从转移到这里后,sohu 博客就不再维护了,所以把这篇文章也一起挪了过来. GNUPLOT 是一款功能强 ...
- LeetCode 387. First Unique Character in a String (字符串中的第一个唯一字符)
题目标签:String, HashMap 题目给了我们一个 string,让我们找出 第一个 唯一的 char. 设立一个 hashmap,把 char 当作 key,char 的index 当作va ...