经典神经网络模型的介绍及应用

经典神经网络模型的介绍及应用

摘要:人工智能、深度学习、机器视觉等概念如今充斥我们生活的整个社会,小到小区内的车牌自动识别系统,大到火星探测车的实现都离不开深度学习的应用。读研究生之后一直在学习障碍物的目标识别算法,也走了很多弯路,从传统的基于图像特征的检测算法到现在最新的基于深度学习的目标检测算法,学习过程中也遇到了很多困难,所以也想写一篇学习笔记,涵盖从传统的BP神经网络模型到卷积神经网络分类模型再到现在state-of-art的Faster-RCNN,SSD, YOLO v3等目标检测算法的介绍,也算是自己最近时间的一个学习总结。

一、神经网络简介

首先,我们要明确图像分割、目标检测以及图像分类是计算机视觉领域的三大主要任务。传统的神经网络算法以及卷积神经网络算法都是针对图像分类而提出的解决方案,目标检测算法我们后面会提到,本篇主要针对神经网络模型进行介绍。

1.1 BP神经网络原理

动物学家通过对化石的研究发现,早在5亿4千万年前,经历了一次物种大爆炸----在短短一千万年间有成千上万种新物种产生。而也正是5亿4千万年前,生物首次进化出了视觉系统,是否这是一种巧合呢?也许这是生物学家的事情,但是,视觉在人类的生活当中扮演了不可或缺的角色,有研究表明人类的交谈中有将近70%的信息是通过视觉来获取的。神经网络模型正是计算机视觉的基础,通过神经网络模型,我们赋予计算一种通过图像识别物体信息的能力。许多先进的视觉检测算法本质上都是由BP神经网络模型演化而来的,其都具有BP神经网络模型的一些特征,如激活函数、损失函数以及各种不同的优化方法等。因此,为了入门深度学习和计算机视觉,让我们先从BP神经网络讲起。

1.1.1 BP神经网络结构

BP(back
propagation)神经网络又称后向传播神经网络,是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,在数学上其本质就是一种用来寻找一组最优参数来拟合测试集中的输入输出数据方法,并且使其拥有一定的泛化能力。举个例子:我有如下的一组数据集

x 0.1 0.2 0.3 0.4
y 0.2 0.4 0.6 0.8

显然可以看出输出y=2x,对于一个不在数据集中的输入x=0.5,我们根据上面的数据集所得到的式子来进行预测的话,得到的输出就是y=1.0。当然,这是一个最简单的线性回归的例子,神经网络要做的事也一样。

了解了神经网络的目标,那们我们来看一下神经网络到底是怎么实现这一目标的。先从神经网络的结构说起。

如下图左所示,这是一个典型的神经网络结构。每个小圆圈代表一个神经元节点,每个神经元节点所做的就是将一组权值和输入数据相乘再加上其对应的偏置值,同时节点输出之前要经过一个激活函数,激活函数的作用之后会详细提到。图示结构包括一个输入层,两个隐藏层以及一个输出层。输入元素的个数为3个向量,第一个和第二个隐藏层的节点数都为4个,最后一个为输出层,输出数为1。

在这里插入图片描述

神经网络整体结构 神经元节点

在这里插入图片描述

图1 神经网络结构

之前提到神经网络的作用是用来拟合一组训练集的输入输出数据,现在我们已经知道了神经网络的结构,那么它到底是如何进行拟合的呢。由于神经网络中权值的个数实在是太多了(这也是为什么BP神经网络应用跟不上的原因),所以我们先对公式符号给出如下说明: ω j k [ l ] \omega_{jk}^{[l]} ωjk[l]表示从网络第( l − 1 l -1 l1)层中第k个神经元指向第 l l l层中第j个神经元的连接权重; b j [ l ] b_{j}^{\left\lbrack l\right\rbrack} bj[l]表示第 l l l层中第j个神经元的偏置值; a j [ l ] a_{j}^{\left\lbrack l\right\rbrack} aj[l]表示第 l l l层中第j个神经元的输出结果,注意这个输出结果是经过激活函数的输出结果,而不是简单的线性输出 ∑ ω i x i + b \sum_{}^{}{\omega_{i}x_{i}+ b} ωixi+b,对单个神经元而言,设激活函数为 f ( x ) f(x) f(x),则输出 a = f ( ∑ ω i x i + b ) a =f(\sum_{}^{}{\omega_{i}x_{i} + b}) a=f(ωixi+b)。构造一个如下图所示的神经网络结构:

在这里插入图片描述

图2 神经网络正向传播流程

需要明确的是输入x是一组向量,它具有一定的维度,我们知道向量相乘需要满足一定的条件,及x的行数应该等于 ω \omega ω的列数。对从Layer0到Layer1层而言,用矩阵来表示计算过程:

a [ 1 ] = f ( W [ 1 ] X + b [ 1 ] ) (1) \mathbf{a}^{\left\lbrack \mathbf{1} \right\rbrack} = f(\mathbf{W}^{\left\lbrack \mathbf{1} \right\rbrack}\mathbf{X +}\mathbf{b}^{\left\lbrack \mathbf{1} \right\rbrack}) \tag{1} a[1]=f(W[1]X+b[1])(1)

其中 X = [ x 1 x 2 x 3 ] \mathbf{X} = \begin{bmatrix} \mathbf{x}_{\mathbf{1}} \\ \mathbf{x}_{\mathbf{2}} \\ \mathbf{x}_{\mathbf{3}} \\ \end{bmatrix} X=x1x2x3 W [ 1 ] = [ W 11 [ 1 ] W 12 [ 1 ] W 13 [ 1 ] W 21 [ 1 ] W 22 [ 1 ] W 23 [ 1 ] ] \mathbf{W}^{\left\lbrack \mathbf{1} \right\rbrack} = \begin{bmatrix} \mathbf{W}_{\mathbf{11}}^{\left\lbrack \mathbf{1} \right\rbrack} & \mathbf{W}_{\mathbf{12}}^{\left\lbrack \mathbf{1} \right\rbrack} & \mathbf{W}_{\mathbf{13}}^{\left\lbrack \mathbf{1} \right\rbrack} \\ \mathbf{W}_{\mathbf{21}}^{\left\lbrack \mathbf{1} \right\rbrack} & \mathbf{W}_{\mathbf{22}}^{\left\lbrack \mathbf{1} \right\rbrack} & \mathbf{W}_{\mathbf{23}}^{\left\lbrack \mathbf{1} \right\rbrack} \\ \end{bmatrix} W[1]=[W11[1]W21[1]W12[1]W22[1]W13[1]W23[1]] a [ 1 ] = [ a 1 [ 1 ] a 2 [ 1 ] ] \mathbf{a}^{\left\lbrack \mathbf{1} \right\rbrack}\mathbf{=}\begin{bmatrix} a_{1}^{\left\lbrack 1 \right\rbrack} \\ a_{2}^{\left\lbrack 1 \right\rbrack} \\ \end{bmatrix} a[1]=[a1[1]a2[1]] b [ 1 ] = [ b 1 [ 1 ] b 2 [ 1 ] ] \mathbf{b}^{\left\lbrack \mathbf{1} \right\rbrack}\mathbf{=}\begin{bmatrix} b_{1}^{\left\lbrack 1 \right\rbrack} \\ b_{2}^{\left\lbrack 1 \right\rbrack} \\ \end{bmatrix} b[1]=[b1[1]b2[1]]。通常我们会对输入数据进行扁平化处理,使输入 x 1 \mathbf{x}_{\mathbf{1}} x1 n × 1 n \times 1 n×1的向量,那么 W 11 [ 1 ] \mathbf{W}_{\mathbf{11}}^{\left\lbrack \mathbf{1} \right\rbrack} W11[1]就应该是 1 × n 1 \times n 1×n的向量,这样才能保证向量能够相乘。 b i [ 1 ] b_{i}^{\left\lbrack 1 \right\rbrack} bi[1]是一个标量,其个数等于本层神经元的个数。同样地,我们可以按照这样的方法一直计算到输出层,其实也就是简单的矩阵乘法,只不过在神经层输出之前加了个激活函数而已。这就是神经网络的前向传播过程。

1.1.2 损失函数及优化器

我们已经弄明白了神经网络的前向传播过程,就是给定一组权值,偏置值矩阵然后按照一定的路径计算得到最后的输出值。但是这一组权值和偏置值要怎么选择才能得到最优的解呢?也就是说怎样才能得到一组权值和偏置值,使其能够很好的拟合训练集数据,并且使其具有一定的泛化能力呢?这就是本节损失函数和优化器要做的事了。

1.1.2.1 损失函数

首先,我们要评价一个神经网络结构的好坏,就必须要设定一个评价准则,这个评价准则应该能较好地评价神经网络能不能很好地拟合训练集的数据。常见的损失函数有MSE均方误差损失函数、hinge损失函数以及交叉熵损失函数等。

1.hinge损失函数

损失函数是评价当前分类器好坏的标准,一般而言,若当前分类器的损失很大时我们认为分类效果不好。举个例子:

在这里插入图片描述

图3 神经网络的输出

假设这是通过一个神经网络输出的结果,我们选择得分最高的那一类作为网络输出的预测值。给定一个数据集 { ( x i , y i ) } i = 1 N \left\{\left( x_{i},y_{i} \right) \right\}_{i =1}^{N} { (xi,yi)}i=1N,其中 x i x_{i} xi表示图像, y i y_{i} yi表示图像标签(人工标定的真实分类)。那么整个数据集的损失是各个图像的损失的平均值:

L = 1 N ∑ i L i ( f ( x i , W ) , y i ) (2) L = \frac{1}{N} \sum_{i}^{}{L_{i}(f\left( x_{i},W \right),y_{i})} \tag{2} L=N1iLi(f(xi,W),yi)(2)

其中 L i ( a , b ) L_{i}(a,b) Li(a,b)表示损失函数,则SVM(Hinge)损失函数有如下的表现形式:

L i = ∑ j ≠ y i m a x ( 0 , s j − s y i + 1 ) L_{i} = \sum_{j \neq y_{i}}^{}{max(0,s_{j} - s_{y_{i}} + 1)} Li=j=yimax(0,sjsyi+1)

其中 s = f ( x i , W ) s = f\left( x_{i},W\right) s=f(xi,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值