全连接神经网络

级联多个变换

例如两层全连接
f=w2max(0,w1x+b1)+b2f=w_{2}max(0,w_{1}x+b_{1})+b_{2} f=w2​max(0,w1​x+b1​)+b2​

其中非线性操作是必须的
与线性分类器的区别在于可以处理线性不可分的情况

结构

  • 输入
  • 隐藏层
  • 输出
  • 权值

除了输入有多少层就是几层神经网络

激活函数

去掉非线性操作(激活函数)神经网络退化为线性分类器
常用

  • sigmoid
    1(1+e−x)\frac{1}{(1+e^{-x})}(1+e−x)1​
    将值压缩到0~1
  • ReLU
    max(0,x)max(0,x)max(0,x)
  • tanh
    ex−e−xex+e−x\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}ex+e−xex−e−x​
    将值压缩到-1~1
  • Leaky ReLU
    max(0.1x,x)max(0.1x,x)max(0.1x,x)

结构设计

  • 宽度
  • 深度
    神经元个数越多,非线性能力越强,分界面更复杂

但不是越多越好,越复杂越好
应该根据任务的难度选择

softmax

先指数化再归一化
可以将输出转化为概率分布

交叉熵

需要度量预测分布和真实分布

其中真实分布一般是one-hot形式的

H(p,q)=−∑xp(x)log(q(x))H(p,q)=-\sum_{x}p(x)log(q(x)) H(p,q)=−x∑​p(x)log(q(x))

H(p,q)=KL(p||q)+H(p)
但由于真值一般为one-hot,H(p)通常为0
有时也会使用KL散度

计算图

有向图,表达输入,输出,中间变量间的计算关系,每个节点对应一种运算

可以使计算机使用链式法则计算任意复杂函数的每个位置的梯度

计算图有颗粒度的问题

梯度消失、梯度爆炸

sigmoid的导数在较大范围内导数很小,再加上链式法则的乘法导致,导致导数回传为0,称为梯度消失

同样也能导致梯度爆炸,可以通过梯度裁剪解决

(Leakly)ReLU函数的导数在大于0时永远为一,不会导致梯度消失/爆炸,梯度流动更流畅,收敛更快

改进梯度算法

  • 梯度下降——一次需要计算全样本,太费时
  • 随机梯度下降——有时会有噪声,效率低
  • 小批量梯度下降——折中

仍存在的问题

遇到山谷,一个方向震荡,另一个方向上下降缓慢
在震荡方向做太多无用功
仅调节步长无法解决

解决方案

动量法

利用历史累计
震荡方向相互抵消,平坦下降方向加速

还能突破局部最小值和鞍点

伪码

初始化速度v=0
循环:
----计算梯度g
----速度更新v=μv+gv=\mu v+gv=μv+g
----更新权值w=w−εvw=w-\varepsilon vw=w−εv

μ\muμ取值[0,1),一般0.9

自适应梯度法

减小震荡方向步长,增大平坦方向步长
其中梯度幅度平方较大为震荡方向,较小为平坦方向
伪码

初始化累计变量r=0
循环:
----计算梯度g
----累计平方梯度r=r+g*g
----更新权值w=w−εr+δgw=w-\frac{\varepsilon}{\sqrt{r}+\delta}gw=w−r​+δε​g

δ\deltaδ防止除零,通常为10−510^{-5}10−5

缺陷是累加时间过长平坦方向的速度也会被抑制

RMSProp

解决方法是混合历史信息
改进的地方是将累计平方梯度换为r=ρr+(1−ρ)g∗gr=\rho r+(1-\rho )g*gr=ρr+(1−ρ)g∗g
ρ\rhoρ取[0,1)一般为0.999

ADAM

同时使用动量和自适应
伪码

初始化累计变量r=0,v=0
循环:
----计算梯度g
----累计梯度v=μv+(1−μ)gv=\mu v+(1-\mu)gv=μv+(1−μ)g
----累计平方梯度r=ρr+(1−ρ)g∗gr=\rho r+(1-\rho)g*gr=ρr+(1−ρ)g∗g
----修正偏差v^=v1−μt,r^=r1−ρt\hat{v}=\frac{v}{1-\mu^{t}},\hat{r}=\frac{r}{1-\rho^{t}}v^=1−μtv​,r^=1−ρtr​
----更新权值w=w−εr+δv^w=w-\frac{\varepsilon}{\sqrt{r}+\delta}\hat{v}w=w−r​+δε​v^

衰减速率ρ\rhoρ动量系数μ\muμ建议为0.999和0.9
修正偏差可以缓解算法初期冷启动问题

用ADAM有点是不用手动调参

权值初始化

全零初始化
所有神经元输出相同,参数更新相同,无法训练

随机权值初始化
权值采用高斯分布

但输出在传播过程中会饱和或趋近于零,也无法训练

Xavier初始化
目标是使得网络各层激活值和局部梯度方差在传播过程中尽量保持一致,即寻找w的分布使得输入与输出方差一致
当var(w)=1/N时,输入输出方差一致
HE初始化
适用于ReLU,权值采样于N(0,2/N)\mathcal{N}(0,2/N)N(0,2/N)

批归一化

直接对神经元输出进行批归一化
通常在全连接之后,在非线性操作之前
可以防止输出落在小梯度区域,能解决梯度消失问题
均值和方差可以由网络学习

欠拟合

模型描述能力太弱,模型过于简单

过拟合

在训练集上性能好但在真实场景性能不好
只记住训练样本而没有提取到特征

机器学习的根本问题

  • 优化 在训练集上获得最佳性能
  • 泛化 在未知数据上获得好性能

训练初期:优化泛化同步进行
训练后期:泛化降低,出现过拟合

解决方法

  • 最优方案——获取足够多数据
  • 次优方案——调节模型允许存储信息大小
    • 调节模型大小
    • 约束模型权值,使用正则项

随机失活

让隐层神经元有一定几率不被激活,在训练时使用Dropout,随机使某些神经元输出为0

  • 减少了模型容量
  • 鼓励权值分散,有正则化作用
  • 可以视为集成模型

存在问题
测试阶段不使用随机失活导致输出范围于训练时不同
解决方案
在训练时对激活的神经元输出乘以系数

超参数

学习率

  • 过大 无法收敛
  • 偏大 震荡,无法达到最优
  • 太小 收敛时间过长
  • 适中 收敛快,结果好

超参数搜索法

  • 网格搜索
  • 随机搜索——超参数组合更多,一般选择
    先粗搜索再细搜索
    一般在log空间搜索

CV-全连接神经网络相关推荐

  1. 全连接神经网络_【模型解读】从“局部连接”回到“全连接”的Non-Local神经网络...

    文章首发于<有三AI> [模型解读]从"局部连接"回到"全连接"的神经网络​mp.weixin.qq.com 这是深度学习模型解读第9篇,本篇我们简 ...

  2. 深蓝学院第二章:基于全连接神经网络(FCNN)的手写数字识别

    如何用全连接神经网络去做手写识别??? 使用的是jupyter notebook这个插件进行代码演示.(首先先装一个Anaconda的虚拟环境,然后自己构建一个自己的虚拟环境,然后在虚拟环境中安装ju ...

  3. PyTorch基础入门五:PyTorch搭建多层全连接神经网络实现MNIST手写数字识别分类

    )全连接神经网络(FC) 全连接神经网络是一种最基本的神经网络结构,英文为Full Connection,所以一般简称FC. FC的准则很简单:神经网络中除输入层之外的每个节点都和上一层的所有节点有连 ...

  4. 使用tensorflow实现全连接神经网络的简单示例,含源码

    看别人的代码和自己写代码,两种的难度和境界真是不一样.昨天和今天尝试着写一个简单的全连接神经网络,用来学习一个基本的模型,在实现的过程中遇到了不少的坑,虽然我已经明白了其中的原理. 我想了一个教材上面 ...

  5. Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化

    文章目录 1 可视化 神经网络的二元分类效果 2 全连接神经网络 3 TensorFlow搭建一个全连接神经网络 3.1 读取MNIST数据 3.2 建立占位符 3.3 建立模型 3.4 正确率 3. ...

  6. 图像识别python cnn_MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(一)...

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 全连接神经网络是深度学习的基础,理解它就可以掌握深度学习的核心概念:前向传播.反向误差传递.权重.学习 ...

  7. 简单的全连接神经网络(tensorflow实现)

    简单的全连接神经网络,网络结构为2-2-1 代码如下: #encoding='utf-8' """ created on 2018-08-10 @author wt &q ...

  8. TF之DNN:TF利用简单7个神经元的三层全连接神经网络【2-3-2】实现降低损失到0.000以下

    TF之DNN:TF利用简单7个神经元的三层全连接神经网络实现降低损失到0.000以下(输入.隐藏.输出层分别为 2.3 . 2 个神经元) 目录 输出结果 实现代码 输出结果 实现代码 # -*- c ...

  9. 基于PyTorch框架的多层全连接神经网络实现MNIST手写数字分类

    多层全连接神经网络实现MNIST手写数字分类 1 简单的三层全连接神经网络 2 添加激活函数 3 添加批标准化 4 训练网络 5 结论 参考资料 先用PyTorch实现最简单的三层全连接神经网络,然后 ...

  10. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)...

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...

最新文章

  1. HP 服务器 iLO 远程控制软件 介绍
  2. R语言PCA主成分分析(Principle Component Analysis)实战2
  3. PHP URL处理关键函数parse_url、parse_str与http_build_query
  4. C++_typedef名字
  5. UA MATH575B 数值分析下II 牛顿算法
  6. concurrenthashmap是什么锁_多线程为什么要用ConcurrentHashMap
  7. C语言基础知识----注意事项
  8. 7,复习,多对多表的三种创建,form组件,cookie,session
  9. kafka及可视化工具offset explorer
  10. github使用Personal access tokens的方法
  11. 全国计算机考试照片传不上去,成人高考报名照片传不上去怎么办
  12. 多目标优化算法:多目标非洲秃鹫优化算法MOAVOA(提供Matlab代码)
  13. ios 穿山甲广告联盟集成_GitHub - ducaiwei/Pangolin: Flutter 广告SDK-字节跳动-穿山甲 集成...
  14. 关于黑马视频String 与int之间相互转化
  15. 【Vulnhub靶场】Earth
  16. 树莓派控制超声波传感器
  17. 4.实操(Credit Card Fraud Detection)
  18. Python+tkinter库实现简单图书管理系统
  19. 内网穿透+sshpass
  20. ElasticSearch基于snapshot和华为云OBS的备份

热门文章

  1. PR CC 2018添加素材时出现绿色/紫色横线
  2. unity3d获取子孙节点
  3. hackthebox的网站使用教程
  4. 【组队学习】Task06:FOR、IF、以及while
  5. 基于Python的银行信贷风险可视化与预警建模
  6. Perl实现逆波兰式与递归计算
  7. 腾讯研究院夹缝中生存 35万元年薪难求才
  8. Spark2.10中使用累加器、注意点以及实现自定义累加器
  9. Python爬虫入门学习实战项目(一)
  10. 未来的全能保姆机器人作文_保姆机器人作文300字共5篇