dreamocean


  • 首页

  • 分类

  • 归档

  • 标签

深度学习ResNet/ResNeXt网络

发表于 2017-07-15 | 阅读次数

ResNet

ResNet——MSRA何凯明团队的Residual Networks,在2015年ImageNet上大放异彩,在ImageNet的classification、detection、localization以及COCO的detection和segmentation上均斩获了第一名的成绩,而且Deep Residual Learning for Image Recognition也获得了CVPR2016的best paper,实在是实至名归。
ResNet最根本的动机就是解决所谓的“退化”问题,即当模型的层次加深时,错误率却提高了,如下图:

阅读全文 »

深度学习LeNet/AlexNet/VGG网络

发表于 2017-07-07 | 阅读次数

各个比较成熟的卷积神经网络模型出现的时间点如下:

Lenet,1985年
Alexnet,2012年
GoogleNet,2014年
VGG,2014年
Deep Residual Learning,2015年

LeNet

1985年,Rumelhart和Hinton等人提出了后向传播(Back Propagation,BP)算法,使得神经网络的训练变得简单可行。1989年,LeCun利用BP算法来训练多层神经网络用于识别手写邮政编码,这个工作就是CNN的开山之作,参考论文《Backpropagation applied to handwritten zip code recognition》,网络中多处用到了5*5的卷积核,但在文章中LeCun只是说把5*5的相邻区域作为感受野,并未提及卷积或卷积神经网络。
1998年的LeNet5标注着CNN的真正面世,参考文章《Gradient-based learning applied to document recognition》,但是这个模型在后来的一段时间并未能火起来,主要原因是费机器(当时没有GPU),而且其他的算法(如SVM)也能达到类似的效果甚至超过。
LeNet主要是用于识别10个手写数字的,当然,只要稍加改造也能用在ImageNet数据集上,但效果较差。具体案例分析参考之前写的文章CNN手写体识别示例及分析。

阅读全文 »

深度学习GoogLeNet Inception网络

发表于 2017-07-01 | 阅读次数

GoogLeNet

GoogLeNet最早是谷歌团队为了参加ILSVRC 2014比赛而提出的,具体实验结果在论文《Going deeper with convolutions》中,链接为https://arxiv.org/pdf/1409.4842.pdf,下面将详细解析GoogLeNet的Inception系列网络及其相关的变种。

InceptionV1

Inception结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
深度学习以及神经网络快速发展,人们不再只关注更给力的硬件、更大的数据集、更大的模型,而是更在意新的idea、新的算法以及模型的改进。一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,这也就意味着巨量的参数。但是,巨量参数容易产生过拟合也会大大增加计算量。
论文认为解决上述两个缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。一方面现实生物神经系统的连接也是稀疏的,另一方面有文献表明:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化。
早些的时候,为了打破网络对称性和提高学习能力,传统的网络都使用了随机稀疏连接。但是,计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet中又重新启用了全连接层,目的是为了更好地优化并行运算。
所以,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,据此论文提出了名为Inception的结构来实现此目的。
作者提出了如下的Inception结构:

阅读全文 »

CNN手写体识别示例及分析

发表于 2017-06-20 | 阅读次数

这里将详细分析深度学习领域一个里程碑之作-CNN(卷积神经网络),并以上篇文章的手写体识别来做示例。

卷积神经网络

卷积神经网络是一种专门用来处理具有类似网格结构的数据的 神经网络,如图像数据,注意之前的全连接层在训练时只是将图像转换为向量,而忽略了像素在水平和垂直维度上的空间信息,卷积层的作用就是通过使用一个更结构化的权重W来克服这一缺点。
比较好的示例图如下:

阅读全文 »

MLP手写体识别示例及分析

发表于 2017-06-13 | 分类于 deep learning | 阅读次数

目前深度学习的训练采用了mxnet框架,接下来会从具体的应用示例出发,详细分析深度学习的具体流程和一些trick,在示例分析中穿插相关概念的介绍。

MXNet简介

mxnet是一个开源的深度学习框架,它可以使你能自行定义、训练、配置和部署深度人工神经网络,并且适用于从云端到移动端诸多不同的设备上。可快速模型训练、灵活支持各种编程模型和语言使得mxnet具有高度的可扩展性。同时,它还允许混合使用命令式与符号式编程以最大化程序的效率和性能。具体mxnet的底层实现以及同caffe、tensorflow、theano框架对比如下:


目前facebook最新发布caffe2同样支持移动端部署,具体mxnet设计和实现简介可参考官方文档https://github.com/dmlc/mxnet/issues/797?url_type=39&object_type=webpage&pos=1。

阅读全文 »

深度学习中基于梯度的优化方法

发表于 2017-06-12 | 分类于 deep learning | 阅读次数

梯度下降法(Gradient Descent)是一个广泛被用来最小化模型误差的参数优化算法,它未必是最优的计算权重参数的方法,但是作为一种简单快速的方法,常常被使用。
对于训练得到的模型,如:
$$ h(x) = {w_1x_1 + w_2x_2 … + w_nx_n + b } = {W^TX+b} $$
我们会定义一个loss function来评估该模型的好坏,如:

$$ J(W) = {\sum_{i}^n (h(x^{(i)}) - y^{(i)})^2 \over2} $$
优化的目标就是使得J(W)达到最小值。
梯度下降法流程如下:

1
2
1、首先对权重W赋值,这个值可以是随机的,也可以让W是一个全零的向量。
2、改变权重W的值,使得J(W)按梯度下降的方向进行减少。


阅读全文 »

新闻文本爬取方法及流程

发表于 2017-05-23 | 阅读次数

主要尝试了基于python第三方库Beautiful Soup来做网站新闻的爬取,Beautiful Soup提供了一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能,自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
安装命令:pip install beautifulsoup4
Beautiful Soup除了支持Python标准库中的HTML解析器,还支持一些第三方的解析器,各个解释器比较如下:

解析器 调用方法 优缺点
Python标准库 BeautifulSoup(html, “html.parser”) 内置标准库,执行速度适中,文档容错能力强;Python 2.7.3/3.2.2前的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(html, “lxml”) 速度快,文档容错能力强;需要安装第三方库
lxml XML 解析器 BeautifulSoup(markup, “xml”) 速度快,唯一支持XML的解析器
html5lib BeautifulSoup(html, “html5lib”) 最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档;速度慢
阅读全文 »

多进程/多线程/互斥锁

发表于 2017-05-22 | 阅读次数

多进程

进程是程序执行时的一个实例,从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。它具有以下几个特点:

  • 进程有独立的地址空间或内存空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;
  • 进程具有独立的数据空间,要进行数据的传递只能通过通信的方式进行(信号量、消息队列、共享内存、管道、文件、套接字);
  • 对于服务器应用而言稳定性是最重要的,而多进程会比较容易实现这一点。一方面,当单个服务开启多个进程时,可以将前端的业务请求分流到不同的进程,提高业务并发数量;另一方面,在主进程里开启一个附属进程(如python里的os.system()方法),当主进程崩溃时,附属进程同样可以继续提供服务;

多线程

线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。同一进程间的线程可共享的资源:

  • 堆。堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;
  • 全局变量。它是与具体某一函数无关的,所以也与特定线程无关,因此也是共享的;
  • 静态变量。对于线程内局部静态变量来说,其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的;
  • 文件等公用资源。使用这些公共资源的线程必须同步,几种同步资源的方式,包括信号、临界区、事件和互斥。

线程间非共享资源:

阅读全文 »

protobuf详解

发表于 2017-05-21 | 阅读次数

protobuf简介

protobuf(Protocol Buffer)是google的一个开源序列化框架,类似于xml、json数据文本交换格式。开发人员需要自己定义结构化的消息格式(proto文件),然后通过protobuf自带的protoc命令来将proto协议文件转换成对应语言的类文件,可以支持php、Java、c++、python语言,我们可以在工程里直接使用生成的类文件来做数据交互。

与json比较

  • protobuf采用二进制数据传输,只传输数据本身,不会传输数据的格式(如何属性的名称)。虽然json数据大小会小于xml,但是还是基于纯文本形式,传输时会把数据的组织格式也进行传输。一条消息数据,protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来protobuf的优势还是很明显的。
  • protobuf只要开发人员定义好消息格式,就可以通过命令生成相关语言(java、c++、python等)的类,项目之间调用生成的类就可以完成序列化和反序列化的工作。而json不同语言需要引用不同的json库(如python的json、c++的rapidjson),不同的json库的解析效率也会存在很大区别。
阅读全文 »

JSON详解

发表于 2017-05-04 | 分类于 json | 阅读次数

JSON简介

json(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于ECMAScript规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得json成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
json与xml比较:

json和xml都拥有丰富的解析手段;
xml可读性相对json较好;
json相对xml而言,数据体积更小;
json传输速度远远快于xml;
json编解码更容易,xml需要考虑子节点和父节点。

阅读全文 »
123
MengyangZhang

MengyangZhang

技术笔记与分享,与君共勉

28 日志
16 分类
24 标签
微博 GitHub
© 2018 MengyangZhang
由 Hexo 强力驱动
主题 - NexT.Pisces