CNN网络--AlexNet
AlexNet是Hinton和他的学生Alex Krizhevsky在12年ImageNet Challenge使用的模型结构,刷新了Image Classification的几率,从此deep learning在Image这块开始一次次超过state-of-art,甚至于搭到打败人类的地步,看这边文章的过程中,发现了很多以前零零散散看到的一些优化技术
模型结构
- 首先认定一个完整的卷积层可能包括一层convolution,一层Rectified Linear Units,一层max-pooling,一层normalization。则整个网络结构包括五层卷积层和三层全连接层,网络的最前端是输入图片的原始像素点,最后端是图片的分类结果。
conv1层
1.输入Input的图像规格: 224*224*3(RGB图像),实际上会经过预处理变为227*227*3
2.使用的96个大小规格为11*11的过滤器filter,或者称为卷积核,进行特征提取,(ps:图上之所以看起来是48个是由于采用了2个GPU服务器处理,每一个服务器上承担了48个).
需要特别提一下的是,原始图片为RBG图像,也就是三个通道的,我们这96个过滤器也是三通道的,也就是我们使用的实际大小规格为11*11*3,也就是原始图像是彩色的,我们提取到的特征也是彩色的,在卷积的时候,我们会依据这个公式来提取特征图: 【img_size - filter_size】/stride +1 = new_feture_size,所以这里我们得到的特征图大小为:
([227-11] / 4 + 1 )= 55 注意【】表示向下取整. 我们得到的新的特征图规格为55*55,注意这里提取到的特征图是彩色的.这样得到了96个55*55大小的特征图了,并且是RGB通道的.
需要特别说明的一点是,我们在使用过滤器filter和数据进行卷积时(ps: 卷积就是[1,2,3]*[1,1,1] = 1*1+2*1+3*1=6,也就是对应相乘并求和),而且我们使用的卷积核尺寸是11*11,也就是采用的是局部链接,每次连接11*11大小区域,然后得到一个新的特征,再次基础上再卷积,再得到新的特征,也就是将传统上采用的全链接的浅层次神经网络,通过加深神经网路层次也就是增加隐藏层,然后下一个隐藏层中的某一个神经元是由上一个网络层中的多个神经元乘以权重加上偏置之后得到的,也就是所偶为的权值共享,通过这来逐步扩大局部视野,(形状像金字塔),最后达到全链接的效果. 这样做的好处是节约内存,一般而言,节约空间的同时,消耗时间就会相应的增加,但是近几年的计算机计算速度的提升,如GPU.已经很好的解决了这个时间的限制的问题.
3. 使用RELU激励函数,来确保特征图的值范围在合理范围之内,比如{0,1},{0,255};最后还有一个LRN处理,感觉是对ReLU值域的归一化
4. 降采样处理(pool层也称为池化)
5. 使用LRN,中文翻译为局部区域归一化,对降采样的特征图数据进行如果,其中LRN又存在两种模式:
5.1 源码默认的是ACROSS_CHANNELS ,跨通道归一化(这里我称之为弱化),local_size:5(默认值),表示局部弱化在相邻五个特征图间中求和并且每一个值除去这个和.
官方给的是内核是3*3大小,该过程就是3*3区域的数据进行处理(求均值,最大/小值,就是区域求均值,区域求最大值,区域求最小值),通过降采样处理,我们可以得到
( [55-3] / 2 + 1 ) = 27 ,也就是得到96个27*27的特征图,然后再以这些特征图,为输入数据,进行第二次卷积.
conv2层
conv2和conv1不同,conv2中使用256个5*5大小的过滤器filter对96*27*27个特征图,进行进一步提取特征,但是处理的方式和conv1不同,过滤器是对96个特征图中的某几个特征图中相应的区域乘以相应的权重,然后加上偏置之后所得到区域进行卷积,经过这样卷积之后,然后在在加上宽度高度两边都填充2像素,会的到一个新的256个特征图.特征图的大小为:(【27+2*2 - 5】/1 +1) = 27 ,也就是会有256个27*27大小的特征图. 然后进行ReLU操作. 再进行降采样【pool】处理;得到: 【27-3】/2 +1 = 13 也就是得到256个13*13大小的特征图.
conv3层
得到【13+2*1 -3】/1 +1 = 13 , 384个13*13的新特征图;conv3没有使用降采样层.
conv4层
依旧得到【13+2*1 -3】/1 +1 = 13 , 384个13*13的新特征图;conv4没有使用降采样层.
conv5层
得到256个13*13个特征图.降采样层pool,防止过拟合:得到: 256个 (【13 - 3】/2 +1)=6 6*6大小的特征图.
FC6全链接图:
描述一下: 这里使用4096个神经元,对256个大小为6*6特征图,进行一个全链接,也就是将6*6大小的特征图,进行卷积变为一个特征点,然后对于4096个神经元中的一个点,是由256个特征图中某些个特征图卷积之后得到的特征点乘以相应的权重之后,再加上一个偏置得到;再进行一个dropout随机从4096个节点中丢掉一些节点信息(也就是值清0),然后就得到新的4096个神经元.
fc7全连接层:和fc6类似.
fc8链接层:
采用的是1000个神经元,然后对fc7中4096个神经元进行全链接,然后会通过高斯过滤器,得到1000个float型的值,也就是我们所看到的预测的可能性,
如果是训练模型的话,会通过标签label进行对比误差,然后求解出残差,再通过链式求导法则,将残差通过求解偏导数逐步向上传递,并将权重进行推倒更改,类似与BP网络思虑,然后会逐层逐层的调整权重以及偏置.
模型优化
(1)选择ReLU作为激活函数
作者使用了修正线性单元(ReLUs),用这种方法能够更快的学习,这种方法对于在大型数据集上训练大型模型的表现有重大影响。ReLU三大好处!(解决饱和-梯度消失,计算量小,小于0时稀疏性)
(2)多GPU并行训练
训练集中有120万张训练样本图,这对于一个GPU而言量太大了,所以我们将网络分布在两个GPU上。作者采用了这样的一种并行模式:将各一半的网络内核(或神经元)放在每个GPU上,然后再采用一个小技巧:将GPU通信限制在某些特定的层上。这意味着,比如,第三层的内核从所有的第二层内核映射(kernel map)中获得输入,但是,第四层的内核只从和自己在同一个GPU上的第三层内核中获得输入。选择一种连接模式对于交互验证是个问题,但这允许我们精确调整连接的数量,直到计算量落入一个可接受的范围内。这种结构降低了错误率,并且减少了训练时间。
(3)局部反应归一化(Local Response Normalization)
作者对输入数据进行归一化,这种归一化方法与局部对比度归一化有点类似,但他们的方法更准确的描述应该是亮度归一化。
3.减少过拟合方式
(1)重叠池化
有重叠的池化能稍稍让模型更难过拟合。
(2)数据集放大
数据集放大有两种方式:一是通过从256X256的图片中随机抽取224X224的区块(及其水平镜像)来实现这种方法,并在这些抽取后得到的区块上训练我们的神经网络。第二种放大数据集的方法是对训练图片的RGB频谱密度进行改变。
(3)DROPOUT
这种技术的主要操作就是随机的将神经元置零。这种技术降低了神经元间相互适应的复杂性,因为每个神经元都不可能依赖其他特定某个神经元的表现。因此,模型被迫学习更加健壮的特征,使之能够被许多不同的随机神经元子集使用。这样的话,就减少了过拟合的可能性。改变网络结果防止过拟合。
结合许多不同模型的预测是一种非常成功的减少测试误差的方式,但似乎对于大型神经网络来说太过昂贵,因为他们已经花费了好几天的时间去训练。然而,有一个非常有效的模型组合版本,它在训练中只花费两倍于单模型的时间。最近推出的叫做“dropout”的技术,它做的就是以0.5的概率将每个隐层神经元的输出设置为零。以这种方式“dropped out”的神经元既不参与前向传播,也不参与反向传播。所以每次得到一个输入,该神经网络就尝试采样一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元是否存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,要被迫学习更为鲁棒的特征,这些特征在结合其他神经元的一些不同随机子集时有用。在测试时,我们将所有神经元的输出都仅仅只乘以0.5,对于获取指数级dropout网络产生的预测分布的几何平均值,这是一个合理的近似方法。 我们在图2中前两个全连接层使用dropout。如果没有dropout,我们的网络会表现出大量的过拟合。dropout使收敛所需的迭代次数大致增加了一倍。
4. 学习细节
我们使用随机梯度下降(SGD)来训练我们的网络,样本大小为128张图片,动量为0.9,权重衰减为0.0005。我们发现这么小的权重衰减对于我们的训练是非常重要的,换句话来说,这里的权重衰减不仅仅只是一个正则化器,它减少了模型的训练误差。权重w的更新规则为:
其中i是迭代索引,v是动力变量,是学习率,是目标关于w、对 求值的导数在第i批样例 上的平均值。
我们用一个均值为0、标准差为0.01的高斯分布初始化了每一层的权重。我们用常数1初始化了第二、第四和第五个卷积层以及全连接隐层的神经元偏差。该初始化通过提供带正输入的ReLU来加速学习的早期阶段。我们在其余层用常数0初始化神经元偏差。
我们对于所有层都使用了相等的学习率,这是在整个训练过程中手动调整的。我们遵循的启发式是,当验证误差率在当前学习率下不再提高时,就将学习率除以10。学习率初始化为0.01,在终止前降低三次。我们训练该网络时大致将这120万张图像的训练集循环了90次,在两个NVIDIA GTX 580 3GB GPU上花了五到六天。
Reference:
CNN网络--AlexNet的更多相关文章
- 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet
上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集.在上周的实验表现 ...
- 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络Vgg
上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC 2014中的classification项目的比赛中取得 ...
- [论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks
概述 虽然CNN深度卷积网络在图像识别等领域取得的效果显著,但是目前为止人们对于CNN为什么能取得如此好的效果却无法解释,也无法提出有效的网络提升策略.利用本文的反卷积可视化方法,作者发现了AlexN ...
- 【TensorFlow-windows】(六) CNN之Alex-net的测试
主要内容: 1.CNN之Alex-net的测试 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_64.exe (当时TF还 ...
- Keras如何构造简单的CNN网络
1. 导入各种模块 基本形式为: import 模块名 from 某个文件 import 某个模块 2. 导入数据(以两类分类问题为例,即numClass = 2) 训练集数据data 可以看到,da ...
- MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...
- 基于CNN网络的汉字图像字体识别及其原理
现代办公要将纸质文档转换为电子文档的需求越来越多,目前针对这种应用场景的系统为OCR系统,也就是光学字符识别系统,例如对于古老出版物的数字化.但是目前OCR系统主要针对文字的识别上,对于出版物的版面以 ...
- tensorflow实现一个神经网络简单CNN网络
本例子用到了minst数据库,通过训练CNN网络,实现手写数字的预测. 首先先把数据集读取到程序中(MNIST数据集大约12MB,如果没在文件夹中找到就会自动下载): mnist = input_da ...
- 数据挖掘入门系列教程(十一点五)之CNN网络介绍
在前面的两篇博客中,我们介绍了DNN(深度神经网络)并使用keras实现了一个简单的DNN.在这篇博客中将介绍CNN(卷积神经网络),然后在下一篇博客中将使用keras构建一个简单的CNN,对cifa ...
随机推荐
- 初遇Linux
Ctrl+Alt+(F1-F6):切换虚拟终端 Ctrl+Alt:鼠标切换界面 $:普通用户登录后系统的提示符 #:root用户登录后系统的提示符 Linux命令 exit 用于退出目前的shell ...
- 【php】 php 的注释和结束符号之间的关系
Closing PHP tags are recognised within single-line comments: <?php // Code will end here ?> ...
- python上的数据库sqlite3——插入多行数据
学校课程上的一个知识点,一个简单的课后习题:一劳永逸实现多行数据的插入(应该是这个意思,老师也没讲清楚).直接上代码了没啥好讲的,我感觉这个思路好捞. import sqlite3 con = sql ...
- PAT Basic 1014
1014 福尔摩斯的约会 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm” ...
- Hive 执行sql命令报错
Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxExce ...
- 使用 RMAN 同步数据库
使用 RMAN同步数据库 使用 RMAN 同步数据库 一.概述 二 操作步骤 (一).把生产库置为归档模式 (二).启动rman做数据库0级备份 (三).修改生产库数据库到未归档 (四).拷贝备份集到 ...
- Java-将字符串转为数字
package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...
- 一步一步在ubuntu上安装即时通讯服务器-Openfire
1.首先登录到ubuntu server.在安装openfire 服务器之前,先确保你的系统已经更新到最新.然后输入下面的命令,一行一行执行,最后安装可用的更新 sudo apt-get update ...
- POJ 1056 IMMEDIATE DECODABILITY
IMMEDIATE DECODABILITY Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9630 Accepted: ...
- 【Android】页面迁移时先弹出键盘问题解决
android自动弹出软键盘(输入键盘) 在AndroidMainfest.xml内容无法更改情况下,也就是键盘非要弹出情况下,进入此页面时先关闭软键盘不让其弹出 InputMethodManager ...