| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习之Alexnet搭建(原理部分) -> 正文阅读 |
|
[人工智能]深度学习之Alexnet搭建(原理部分) |
1、摘要 2、Alexnet理论讲解 1)历史背景: 2)理论讲解: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图1 alexnet网络结构图 ????????图1所示是当年作者论文中的截图,刚开始愣是没看懂,有些小白可能和我一样也不太看得明白,我就按自己的理解给大家讲讲,有什么问题再一起讨论交流哇。 ????????当年由于计算能力比较拉跨,所以作者采用的是两块儿GPU进行训练,图1就是上下两个GPU训练的过程,(该图省略了池化层),第一个长方体是我们224*224*3的一个RGB图片,将这个图片作为第一个卷积层的输入: conv1: ????????经过第一次卷积? ? [kernel_size=11*11,stride=4,channel=3,num=96:卷积核(滤波器)大小为11*11,卷积核通道数为3==上一层输入的通道数,卷积核数目:96]? ? 后得到55*55*96的特征图片, 96==特征图的通道数==上面卷积核的个数 55是通过公式:? output=(input-kernel_size+2*padding)/stride+1? ((224-11+2*0)/4+1≈55(向上取整))?计算而来的。 ????????卷积完之后紧接着一个激活函数relu函数f(x)=max(0,x)进行激活,提高模型的非线性。因为卷积是一个线性的过程,无论进行多少次,都是线性的结果,只有加入非线性激活函数才能提高它的非线性。它比sigmoid函数(f(x)=1/1+e^(-2))用得更广泛一些,有很多的优点,有兴趣的乖乖们可以自己查一下,资料也很多,我就写一些最明显的好处吧。 百度文库对于激活函数的解释是:所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。不是很好理解,反正知道它的目的是增加神经网络模型的非线性就行了。 ?图2 relu函数 图3 sigmoid函数? 图4 sigmoid函数与relu函数的导数图 ????????Relu ?VS ?Sigmoid: https://blog.csdn.net/bl128ve900/article/details/95259413 1. 防止梯度弥散: sigmoid的导数只有在0附近的时候有比较好的激活性,在正负饱和区的梯度都接近于0,所以这会造成梯度弥散;而relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象。
relu函数在负半区的导数为0,所以一旦神经元激活值进入负半区,那么梯度就会为0,也就是说这个神经元不会经历训练,即所谓的稀疏性。 根据它们的计算公式可以看出sigmoid函数是一个指数函数,比relu函数计算更加复杂。 ? ? ? ? 激活函数斌不会改变模型的参数,所以激活完给到池化层的输入还是55*55*96的特征图(当时作者分两个GPU训练,所以图1展示的是96通道分成两半,一个GPU跑48个通道)。池化层(kernel_size=3*3,stride=2,根据上面卷积层的公式可以推出:经过池化层后的特征图为:(55-3)/2+1=27)27*27*96(96是因为池化层不改变深度) ? ? ? ? ?池化层的官方解释是:在卷积神经网络中通常会在相邻的卷积层之间加入一个池化层,池化层可以有效的缩小参数矩阵的尺寸,从而减少最后全连接层的中的参数数量。 ? ? ? ? 通俗来说池化层的作用就是?:改变图片的长和宽,不改变其通道数。因为池化层没有参数,不需要用反向传播来改变它的值,减轻了网络的计算量。池化的方法主要有平均池化和最大池化。alexnet采用的是最大池化的方法。 Max Pooling:选取最大的,我们定义一个空间邻域(比如,2*2的窗口),并从窗口内的修正特征图中取出最大的元素,最大池化被证明效果更好一些。 Average Pooling:平均的,我们定义一个空间邻域(比如,2*2的窗口),并从窗口内的修正特征图中算出平均值。 图5 最大池化示意图 ? ? ? ? 池化完了之后还有一个局部归一化(LRN层)的操作:归一化有助于快速收敛;对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。?
图6 Alexnet 网络结构图 ?具体的参数计算如下:(忘了从哪儿看到的了,就先不附上链接了) Alexnet网络参数的数目: 卷积层: weights=K^2xCxN--------------------k:卷积核的大小 ,C:前一层输入图片的通道数,N:卷积核的个? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?数 biases=N---------------------------------N:卷积核的个数 Parameters=biases+weight 全连接层: weights= K^2xNxNF------------------K:前一层的输出图片尺寸,N:前一层卷积核数量,NF:全连接? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 神经元数量 biases=NF-------------------------------NF:全连接层神经元数量 eg:conv1: 卷积层: weights=11x11x3x96=34848 biases=96 parameters=34848+96=34944 全连接层: weights=6x6x256x4096=37748736 biases=4096 parameters=37748736+4096=37752832 自己画了一个网络的流程框图,美丽的翠绿色(本来是用的黄色的,被师兄质疑了我的审美,哎。。。可能是个假女生,最后换成绿色啦,好像还是怪怪的,哈哈哈),🤭🤭。 Alexnet相较于Lenet优点: 1、数据增强: 使用数据增强的方法缓解过拟合现象。 常用的数据增强的算法有:水平翻转图像、随机裁剪、平移变换、颜色变换、光照变换等。 2、使用了GPU加速计算: 使用了gpu加速神经网络的训练。 3、重叠的最大池化层: 在以前的CNN中普遍使用平均池化层,AlexNet全部使用最大池化层,避免了平均池化层的模糊化的效果,并且步长比池化的核的尺寸小,这样池化层的输出之间有重叠,提升了特征的丰富性. 4、Dropout随机失活: 随机忽略一些神经元,以避免过拟合。 ? 5、AlexNet使用ReLU代替了Sigmoid: 其能更快的训练,同时解决sigmoid在训练较深的网络中出现的梯度消失,或者说梯度弥散的问题。 sigmoid的导数只有在0附近的时候有比较好的激活性,在正负饱和区的梯度都接近于0,所以这会造成梯度弥散;而relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象。 relu函数在负半区的导数为0,所以一旦神经元激活值进入负半区,那么梯度就会为0,也就是说这个神经元不会经历训练,即所谓的稀疏性。 ?下面的几个问题大家可以思考一下,反正是我在学习过程中当时没太明白的地方,不清楚的可以和我交流哦。 1、输入数据的大小可以改变吗? 2、为什么卷积核大小一般都是奇数*奇数呢? 3、卷积层的卷积到底是怎么进行的呢? 4、是不是小卷积核一定比大卷积核更好呢? 5、为什么卷积层的参数会比全连接层少很多呢? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 20:32:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |