深度神经网络的理解与应用

每想你一次,天上飘落一粒沙,从此形成了撒哈拉。——三毛

如果可以,想成为一个拾荒者,捡拾着诗情画意,捡拾着远方,捡拾着自由。

活着就是为了在一片沙漠中寻找海市蜃楼般的快乐,然后,让荒芜的土地上,开满希望之花。

神经网络

模型介绍

人工神经网络(Artificial Neural Network,ANN),简称神经网络或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似,下图为一个简单的神经元数学模型:
在这里插入图片描述
其中+1代表偏置项(Bias Units),X1,X2,X2代表输入的特征,w0,w1,w2,w3代表权重参数(Weight),是输入特征的缩放倍数,特征经过缩放和偏置项累加,再经过一次激活运算后输出。使用神经网络进行曲线拟合,需要采用非线性的激活函数,最常见的激活函数是Sigmoid函数,简称logsig。

在这里插入图片描述

也可以采用双曲正切函数,可称作tansig。
在这里插入图片描述
激活函数图
在这里插入图片描述
因为融入了e的螺旋线,在不断循环缩放的过程中,可以完全保持它原有的弯曲度不变,它可以使数据在经历了多重的Sigmoid变换后仍维持原先的比例关系。

前向传播

一个基本的三层神经网络体现为下图(图中隐藏了各权值的显示),当然输出层的节点也可以是多个(用于分类问题)。
神经网络结构图
在这里插入图片描述
输入层数据经过网络进行加权运算后传播到隐藏层,再经过运算后传播到输出层,将输出值与样本值进行比较,计算出误差。
在这里插入图片描述

反向传播

为了使得计算出的误差最小,提出了BP算法。用上述的前向传播算出的输出值计算的误差进行偏导数的运算,将其与前面隐藏层的参数进行加权求和并一直延续到输入层(输入层不在内),最后通过每个节点求出的偏导数进行参数权重的更新。
此处的误差用残差一词来代替,若使用Sigmoid函数作激活函数(Sigmoid导数 = Sigmoid * (1-Sigmoid))
输出层到隐藏层:-(Sigmoid输出值-样本值) * Sigmoid * (1-Sigmoid) = -(输出值-样本值)输出值(1-输出值)
隐藏层到隐藏层:(右层每个节点的残差加权求和) * 当前节点的Sigmoid * (1-当前节点的Sigmoid)
残差运算结束后进行下一步的参数权重调
输入层:权重增加 = 当前节点的Sigmoid * 右层对应节点的残差 * 学习率;
隐藏层:权重增加 = 输入值 * 右层对应节点的残差 * 学习率;
偏移值的权重增加 = 右层对应节点的残差 * 学习率。

反向传播的推导
在这里插入图片描述
在这里插入图片描述

三层神经网络的简单BP详细过程

下图为训练集的数据,其中X1、X2分别为两个不同的特征,y为样本值,首先对第一行数据进行操作。
训练集数据表

X1X2y
0.4-0.70.1
0.3-0.50.05
0.60.10.3
0.20.40.25
0.1-0.20.12
  • 随机生成每个节点之间的初始权重

在这里插入图片描述

  • 对输入节点进行加权求和计算
    在这里插入图片描述
  • Sigmoid函数激活
    在这里插入图片描述
  • 计算出输出层的值

在这里插入图片描述

  • 计算误差,误差接近0时收敛

在这里插入图片描述

  • 准备误差反向传播
    在这里插入图片描述
  • 计算输出层的残差
    在这里插入图片描述
  • 输出层的残差加权求和

在这里插入图片描述

  • 计算隐藏层的各项残差
    在这里插入图片描述
  • 更新第一层的权重值,设学习率为0.6

在这里插入图片描述

  • 更新第一层权重

在这里插入图片描述

  • 计算出后两层的权重
    在这里插入图片描述
  • 利用更新完的权重,对训练集中的数据反复进行前面1-12布,直到最后收敛
    当然可以采取批量操作,上述是每训练一条数据就进行权重的更新,批量梯度下降就是在不更新权重的情况下,把训练集的每条数据都算一次,把要更新的增值全部累加起来求平均值,然后利用这个平均值来更新一次权重,然后利用更新后的权重进行下一轮的计算。

BP算法的特点与局限

需要一定量的历史数据(特征),通过历史数据的训练来学习从而进行分类、聚类、预测等。但其计算较复杂,速度比较慢,容易陷入局部最优解的局面。

三层神经网络Python实现

效果如下图所示,其中样本所对应的横轴纵轴数值为样本的两个不同特征值,红色和蓝色表示需要样本被划分的两类,详细代码见测试代码部分。

隐藏神经元为3个

在这里插入图片描述

隐藏神经元不同的效果

在这里插入图片描述
我们可以从图中看出,当隐藏层神经元个数为3的时候已经可以很好地进行分类了,当神经元个数过多时会出现过拟合状态。

卷积神经网络

卷积神经网络介绍

卷积神经网络一般包括输入层、卷积层、池化层、全连接层。其中有三个关键的操作:局部感受视野、权值共享、池化层,有效的减少了网络的参数个数,缓解了模型的过拟合问题,使得网络具有一定程度的位移、尺度、缩放、非线性形变稳定性。

局部感受视野

由于图像的空间联系是局部的,每个神经元不需要对全部的图像做感受,只需要感受局部特征即可,然后在更高层将这些感受得到的不同的局部神经元综合起来就可以得到全局的信息了,这样可以减少连接的数目。

权值共享

不同神经元之间的参数共享可以减少需要求解的参数,使用多种滤波器去卷积图像就会得到多种特征映射。权值共享其实就是对图像用同样的卷积核进行卷积操作,也就意味着第一个隐藏层的所有神经元所能检测到处于图像不同位置的完全相同的特征。其主要的能力就能检测到不同位置的同一类型特征,也就是卷积网络能很好的适应图像的小范围的平移性,即有较好的平移不变性。

卷积层

卷积层的功能是进行特征提取,卷积核深度应该跟输入的深度相同。
卷积过程图
在这里插入图片描述
需要加入zero pad项,即为图像加上一个边界,边界元素均为0。作用是为了使输入图像和卷积后的特征图具有相同的维度,同时图中还需要加入一个偏置项bias。
特征图大小计算如下:
输入大小为W1 x H1 x D1;
指定的参数:Filter个数K,Filter大小F,步长S,边界填充P;
则输出特征图的大小为:
在这里插入图片描述
卷积层中的每个Filter都可以把原始输入图像卷积得到一个Feature Map,几个Filter就可以得到几个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数是一个超参数。可以把Feature Map看做是通过卷积变换提取到的图像特征,几个Filter就对原始图像提取出几组不同的特征,也就是得到了几个Feature Map,也称做三个通道(channel)。
可以通过多层卷积,将简单模式组合成复杂模式,保证其具有足够的表达能力和泛化能力。

激活函数

使用sigmoid函数作为激活函数的,要对 input 进行归一化,否则激活后的值会进入平坦区,使隐藏层的输出全部趋同,但是 ReLU 并不需要输入归一化来防止它们达到饱和。
Sigmoid函数具有饱和时梯度值非常小的缺点。由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。且输出值不是以0为中心值。因此通常采用ReLu函数:
在这里插入图片描述
当x>0的时候,函数梯度值恒为1,收敛快,没有梯度耗散问题;
当x<0的时候,该层输出为0,训练后值为0的神经元个数越多,网络的稀疏性越大,可以更好地 去除数据中的冗余,最大可能地保留数据的特征,泛化能力越强,即得到同样的效果,真正起作用的神经元越少。但若后层的某一梯度很大,导致w更新以后很大,导致该层的输入<0,输出为0,这时该层就会die,不更新。当学习率比较大时可能会有40%的神经元都会在训练开始就die,因此需要对学习率进行一个好的设置。

池化层

对输入的特征图进行压缩,不易出现过拟合。不仅简化网络计算复杂度,而且进行特征压缩,提取主要特征。池化操作一般有两种,一种是mean Pooling,一种是max Pooling。
当然还有重叠池化还有空间金字塔池化,空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。

全连接层

连接所有的特征,将输出值送给分类器(如Softmax分类器),其实现类似于神经网络中的全连接网络。

卷积神经网络的训练

在这里插入图片描述

卷积层训练

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体推导如下:
在这里插入图片描述

Pooling层训练

Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。
对于 max pooling ,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0。
在这里插入图片描述
对于 mean pooling ,下一层的误差项的值会平均分配到上一层对应区块中的所有神经元。
在这里插入图片描述

Tensorflow实现MNIST_data手写数字的识别

  • 实现步骤
    1:导入测试集和验证集;
    2:引入Tensorflow相关需要使用的包;
    3:定义两个初始化w和b的函数;
    4:定义卷积和池化,采用padding =‘SAME’模式;
    5:分配x_和y_;
    6:修改x的shape;
    7:定义第一层卷积的w和b;
    8:把x_image和w进行卷积再加上b,然后使用ReLU激活函数,最后进行max_pooling;
    9:定义第二层卷积的w和b;
    10:定义全连接层
    11:为了减少过拟合,可以在输出层之前加入dropout函数;
    12:由一个softmax层来得到输出;
    13:定义代价函数,训练步骤,用Adam进行优化 14:使用测试集样本进行测试。
  • 训练数据和测试数据的迭代准确率
    在这里插入图片描述
  • 从训练集中抽取一张图片,分别显示其经过卷积层和池化层的效果图
    随机抽取的一张手写数字图片:
    在这里插入图片描述
    经过第一层卷积层之后的feature map映射图:
    在这里插入图片描述
    经过第一层池化层之后的feature map映射图:
    在这里插入图片描述

参考文献

[1] Implementing a Neural Network from Scratch in Python——An Introduction
[2] http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/.
[3] https://www.zybuluo.com/hanbingtao/note/485480.
[4] Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, MIT Press, 2016.
[5] https://www.cnblogs.com/lizheng114/p/7439556.html.

测试代码

神经网络实现代码

具体见Neural Network.ipynb

卷积神经网络实现代码

具体见cnn.py

MNIST_data手写数字Tensorflow代码

具体见CNN_MNIST_data.ipynb

PS

上面是对神经网络的一个基本了解,并进行了一些应用操作,只代表个人见解,若有不足之处还请指出~
因为具体的代码太长了,这里就不上传了~

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值