深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CSDN博客 

一 CNN参数初始化及参数学习方法

和机器学习很多算法一样, CNN在进行训练之前也要进行参数的初始化操作. 我们知道, 在机器学习中的参数值一般都是随机给定的. 但是, 这CNN的参数初始化又和机器学习中有所不同. 

1.1 W的初始化

由于CNN 中的参数更新的过程一般是通过BP算法实现的,再由前面我们在深度学习之BP算法一文中得到的BP算法参数更新公式可以发现, 参数更新过程中卷积核(权重值W)参与了连乘运算,因此一定不能初始化W = 0, 否则参数W无法更新.

另外考虑到太大(小)的W值可能导致梯度下降太快(慢), 一般选择很小的随机数, 且要求w为服从均值为0, 方差未知(建议选择2/n, n为权重的个数)的正态分布的随机序列.

1.2 b的初始化

一般直接设置为0,在存在ReLU激活函数的网络中,也可以考虑设置为一个很小的数字.

1.3 CNN模型参数学习方法

CNN中的参数学习方法主要是BP算法.

前面我们知道, BP算法的关键在于反向传播时的链式求导求得误差值 . 然后使用梯度下降的方法进行参数W和b的更新.

二 CNN过拟合

神经网络的学习能力受神经元数目以及神经网络层次的影响,神经元数目越大,神经网络层次越高,那么神经网络的学习能力越强,那么就有可能出现过拟合的问题;(通俗来讲:神经网络的空间表达能力变得更紧丰富了)

CNN是通过卷积核对样本进行特征提取的, 当特征提取过多(即学习到了不重要的特征)就回造成过拟合现象的发生, 这里主要介绍两种解决过拟合的方法, 分别为正则化和Dropout.

2.1 正则化

和机器学习一样, 通过在损失函数加上L1,L2正则项可以有效地防止过拟合的问题.

 2.2 Dropout

一般情况下,对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一半左右的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其它的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其它神经元之间的更加健壮robust(鲁棒性)的特征。另外Dropout不仅减少overfitting,还能提高准确率。 

Dropout通过随机删除神经网络中的神经元来解决overfitting问题,在每次迭代的时候,只使用部分神经元训练模型获取W和d的值. 具体的可以参见PDF文档http://nooverfit.com/wp/wp-content/uploads/2016/07/Dropout-A-Simple-Way-to-Prevent-Neural-Networks-from-Overfitting.pdf

p=0.5 # dropout保留一个神经元存活的概率def train_out(X):# H1 = np.maximum(0,np.dot(ω1,X)+b1) # 第一次dropout,注意做了一次除以P。U1 = (np.random.rand(*H1.shape)<p)/p  # [0. 2. 2. 2. 0. 0. 2. 2. 0. 0.]# drop转换为0或者原始值H1 *= U1H2 = np.maximum(0,np.dot(ω2,H1)+b2)# 第二次dropout,其中除以P。U2 =(np.random.rand(*H2.shape)<p)/p# 类似上方H2 *= U2out = np.dot(ω3,H2)+b3 # BP操作:计算梯度,参数更新def predict(X):#直接前向计算,不乘以PH1=np.maximum(0,np.dot(ω1,X)+b1)H2=np.maximum(0,np.dot(ω2,H1)+b2)out=np.dot(ω3,H2)+b3

2.3 方案选择

  • 一般都可以使用Dropout解决过拟合问题
  • 回归算法中使用L2范数相比于Softmax分类器,更加难以优化。对于回归问题,首先考虑是否可以转化为分类问题,比如:用户对于商品的评分,可以考虑将得分结果分成1~5分,这样就变成了一个分类问题。如果实在没法转化为分类问题的,那么使用L2范数的时候要非常小心,比如在L2范数之前不要使用Dropout。
  • 一般建议使用L2范数或者Dropout来减少神经网络的过拟合
     

三、卷积神经网络训练算法

和一般的机器学习算法一样,需要先定义Loss Function,衡量预测值和实际值之间的误差,一般使用平方和误差公式找到最小损失函数的W和b的值,CNN中常使用的是SGD其实就是一般深度学习中的BP算法;SGD需要计算W和b的偏导,BP算法就是计算偏导用的,BP算法的核心是求导链式法则。

在神经网络中一般采用Mini-batch SGD,主要包括以下四个步骤的循环:

  • 采样一个batch的数据
  • 前向计算损失loss
  • 反向传播计算梯度(一个batch上所有样本的梯度和)
  • 利用梯度更新权重参数

使用BP算法逐级求解△ω和△b的值。

根据SGD随机梯度下降迭代更新ω和b。

  • w_i^+=w_i-\eta \Delta w_i
  • d_i^+=d_i-\eta \Delta d_i

四、池化层误差反向传播

Maxpool最大池化层反向传播:除最大值处继承上层梯度外,其他位置置零。

平均池化:将残差均分为2×2=4份,传递到前面小区域的4个单元中。

def max_pool_backward_naive(dout,cache):x,pool_param=cacheHH,WW=pool_param['pool_height'],pool_param['pool_width']s=pool_param['stride']N,C,H,W=x.shapeH_new=1+(H-HH)/sW_new=1+(W-WW)/sdx=np.zeros_like(x)for i in range(N):for j in range(C):for k in range(H_new):for l in range(W_new):windows=x[i,j,k*s:HH+k*s,l*s:WW+l*s]m=np.max(windows)dx[i,j,k*s:HH+k*s,l*s:WW+l*s]=(windows==m)*dout[i,j,k,l]return dx

梯度下降

梯度下降是常用的卷积神经网络模型参数求解方法,根据每次参数更新使用样本数量的多少,可以分为以下三类:

  • 批量梯度下降(batch gradient descent,BGD);
  • 小批量梯度下降(mini-batch gradient descent,MBGD);
  • 随机梯度下降(stochastic gradient descent,SGD)。

详细请参考:机器学习之梯度下降法(GD)和坐标轴下降法(CD)

深度学习超参数

学习率(Learning Rate )

学习率被定义为每次迭代中成本函数中最小化的量。也即下降到成本函数的最小值的速率是学习率,它是可变的。从梯度下降算法的角度来说,通过选择合适的学习率,可以使梯度下降法得到更好的性能。

一般常用的学习率有0.00001,0.0001,0.001,0.003,0.01,0.03,0.1,0.3,1,3,10

学习率调整策略

  • fixed固定策略,学习率始终是一个固定值。
  • step 均匀分步策略,如果设置为step,则还需要设置一个stepsize, 返回base_lr * gamma (floor(iter / stepsize)) 其中iter表示当前的迭代次数。floor(9.9)=9, 其功能是“下取整”。
  • base_lr * gamma  iter , iter为当前迭代次数。
  • multistep 多分步或不均匀分步。刚开始训练网络时学习率一般设置较高,这样loss和accuracy下降很快,一般前200000次两者下降较快,后面可能就需要我们使用较小的学习率了。step策略由于过于平均,而loss和accuracy的下降率在整个训练过程中又是一个不平均的过程,因此有时不是很合适。fixed手工调节起来又很麻烦,这时multistep可能就会派上用场了。multistep还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据 stepvalue值变化
    • multistep设置示例(caffe)
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "multistep"
gamma: 0.9
stepvalue: 5000
stepvalue: 7000
stepvalue: 8000
stepvalue: 9000
stepvalue: 9500
  • poly: 学习率进行多项式误差, 返回 base_lr *(1 - iter/max_iter)  power

深度学习训练过程

过拟合

过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。

欠拟合

欠拟合模型没有很好地捕捉到数据特征,不能够很好地拟合数据。

误差的变化

根据特征的层来调整参数

左图很粗糙,显示不出底层特征,可能是因为网络不收敛或者学习速率设置不好或者是因为惩罚因子设置的太小。 右图合理,特征多样,比较干净、平滑

https://www.microsoft.com/zh-cn/download/details.aspx?id=48145&751be11f-ede8-5a0c-058c-2ee190a24fa6=True

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

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

相关文章

Hadoop1.x版本升级Hadoop2.x

引言 随着企业数据化和Hadoop的应用越加广泛&#xff0c;hadoop1.x的框架设计越来越无法满足人们对需求&#xff0c;Apache一直在对Hadoop1.x进行修改&#xff0c;最后推出了新一代的Hadoop2.x。从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看&#xff0c;MapRed…

本页由试用版打印控件lodop6.2.6输出_Visual Basic 6.0 Sirk 迷你版

Visual Basic 6.0 Sirk 迷你版 VB6 Sirk Mini 2019更新1、支持主流操作系统&#xff0c;避免原版安装失败的问题&#xff1a;支持Windows XP、Vista、Win7、Win8、Win10(32位、64位)。2、保留大部分常用功能&#xff0c;避免精简版过度精简&#xff1a;包含原版完整控件&#x…

深度学习之卷积神经网络 LeNet

卷积神经网络典型CNN LeNet&#xff1a;最早用于数字识别的CNNLeNet5&#xff1a;现在常说的一般就是LeNet5AlexNet&#xff1a;2012ILSVRC冠军&#xff0c;远超第二名的CNN&#xff0c;比LeNet更深&#xff0c;用多层小卷积叠加来替换单个的大卷积ZF Net&#xff1a;2013ILSV…

dom4j的读写xml文件,读写xml字符串

百度了一些博客&#xff0c;大同小异&#xff0c;在选取jar包工具的时候大概看了下&#xff0c;大抵是jdom原始&#xff0c;dom4j优秀。于是做了些练习。 参考&#xff1a;http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html 1 package com.test.xml;2 3 import j…

深度学习之数据增强方案和TensorFlow操作

一、数据增强的方法介绍 增加训练数据&#xff0c; 则能够提升算法的准确率&#xff0c; 因为这样可以避免过拟合&#xff0c; 而避免了过拟合你就可以增大你的网络结构了。 当训练数据有限的时候&#xff0c; 可以通过一些变换来从已有的训练数据集中生成一些新的数据&#x…

使用OpenSSL实现CA证书的搭建过程

个人博客地址&#xff1a;http://www.pojun.tech/ 欢迎访问 什么是CA CA,Catificate Authority,通俗的理解就是一种认证机制。它的作用就是提供证书&#xff08;也就是服务端证书&#xff0c;由域名&#xff0c;公司信息&#xff0c;序列号&#xff0c;签名信息等等组成&#…

gdb使用实例

第一篇 概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统。Gdb可以调试各种程序&#xff0c;包括C、C、JAVA、PASCAL、FORAN和一些其它的语言。包括GNU所支持的所有微处理器的汇编语言。在gdb的所有可圈可点的特性中&#xff0c;有一点值得注意&#xff0c;…

Linux 监控命令之 netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 语法 netstat [-acC…

solr 配置

创建 SolrHome(solrCore) 1.解压 solr-4.10.4.tgz 到 /usr/local/solr 2.将 solr-4.10.4/example/solr 下所有文件拷贝到 /usr/local/solrhome (此 solrhome 为自己创建的) solrhome 是 solr 运行主目录&#xff0c;可包含多个 SolrCore 目录SolrCore 目录中包含运行 Solr 实例…

mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......

为什么学编程2008年&#xff0c;高中毕业的我问一个已经工作两年的亲戚&#xff1a;什么专业工资高&#xff1f;他告诉我&#xff1a;程序员。2008年成都最低工资好像是800元&#xff0c;我的生活费也是800元&#xff0c;据他所说程序员出来的工资是2000&#xff0c;于是开始了…

day 7 引用

1.ba在c语言和python中的区别 c语言&#xff1a;a100 a变量里面放的100 b a b变量里面也放的100 python &#xff1a; a100 内存中有个100 a放的100的内存地址 b a b也放的100的内存地址 相当于给100那一块内存&#xff0c;贴个便利签 2.type查看数据类型&…

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

Dapper的牛逼就不扯蛋了&#xff0c;答应群友做个入门Demo的&#xff0c;现有园友需要&#xff0c;那么公开分享一下&#xff1a; 完整Demo&#xff1a;http://pan.baidu.com/s/1i3TcEzj 注 意 事 项&#xff1a;http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人…

ride上点击用例不能显示edit信息_接口测试平台代码实现61: 多接口用例1

终于又序更上了&#xff0c;原谅最近作者几天事情不断。按照我们之前的计划&#xff0c;需要迅速开启很重要的核心多用例接口。首先&#xff0c;我们要确定&#xff0c;这个功能的大体设计。就放在在我们的页面 用例库 中&#xff1a;所以也就是我们很久之前就创建好的P_cases.…

MUI - 预加载

打开详情页回到顶部:document.body.scrollTop document.documentElement.scrollTop 0;方式一&#xff1a;preload一次仅能预加载一个页面&#xff08;除非循环&#xff09; var subWebview mui.preload({url: examples/accordion.html,id: template_sub,top: styles: {48 …

Bash : 索引数组

Bash 提供了两种类型的数组&#xff0c;分别是索引数组(indexed array)和关联数组(associative array)。本文主要介绍索引数组的基本用法。 索引数组的基本特点 Bash 提供的数组都是一维数组。任何变量都可以用作索引数组。通过 declare 关键字可以显式的声明一个索引数组。数组…

Python 第三方模块之 smtplib

1 python对SMTP的支持 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是简单传输协议&#xff0c;它是一组用于用于由源地址到目的地址的邮件传输规则。 python中对SMTP进行了简单的封装&#xff0c;可以发送纯文本邮件、HTML邮件以及带附件的邮件。两个核心模块…

Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例

server.js代码&#xff1a; // 内置http模块&#xff0c;提供了http服务器和客户端功能&#xff08;path模块也是内置模块&#xff0c;而mime是附加模块&#xff09; var httprequire("http");// 创建服务器,创建HTTP服务器要调用http.createServer()函数&#xff0c…

svg 动画_根据AI导出的SVG path制作SVG线条动画

点击右上方红色按钮关注“web秀”&#xff0c;让你真正秀起来前言首先祝大家2019新年快乐&#xff0c;万事大吉&#xff0c;猪事顺利&#xff0c;阖家欢乐。前面文章SVG 线条动画基础入门知识学习到了基础知识&#xff0c;现在来给大家讲讲如何制作SVG 制作复杂图形线条动画。假…

读书笔记2013第3本:《无价》

《无价》这本书是过年前买的&#xff0c;网络书店上写着“老罗推荐”&#xff0c;想着好像是在老罗哪一年的演讲里听过这本书&#xff0c;在豆瓣上评分7.9。读书是为了产生行动&#xff0c;读书时要提的4个问题&#xff0c;1&#xff09;这本书主要在谈些什么&#xff1f;2&…

Linux下的程序调试——GDB

无论是多么优秀的程序员&#xff0c;都难以保证自己在编写代码时不会出现任何错误&#xff0c;因此调试是软件开发过程中的一个必不可少的 组成部分。当程序完成编译之后&#xff0c;它很可能无法正常运行&#xff0c;或者会彻底崩溃&#xff0c;或者不能实现预期的功能。此时如…