深度学习入门(一) 计算机视觉到底是怎么回事?

前言

在这里我不会涉及过多的数学理论,我主要是回答两个问题:1、计算机视觉的流程是什么样的?2、为什么我们选择使用TensorFlow进行人工智能的训练?
在这里插入图片描述

深度学习与神经网络

很多人不理解神经网络和深度学习到底是什么意思,这里我先做一点解释:

深度学习

深度学习的定义是:多层的非线性变换的一个算法合集。我们需要分多个层次,对多个数据进行非线性的数据处理,输出运算结果,而这一层的输出将作为下一层的输入,进行下一层的计算。

神经网络

那么,我们应该如何实现多层次的非线性变换呢?就简单直接的方式就是采用神经网络。换句话说,神经网络是实现深度学习的方法。
动物神经模型
顾名思义,神经网络的结构和人类的神经非常相似。接收到多个输入信号,然后经过一系列的处理,得到一个输出结果,传递给下一级的神经,而下一级的神经同样获取多个输入信号,输出一个结果,以此类推。

神经网络模型
在人工神经网络结构中也是通过这样的一种多层结构来实现神经元的连接。如上图所示,每一个圆圈都代表一个神经元,多个输入,一个输出,上一层的输出作为下一层的输入。

当我们平时接收到某种刺激的时候,身体每部会将这种刺激进行一系列的处理,最终产生一个结果。在深度学习中,我们也可以凑想出三个层次:
输入层——>隐含层——>输出层
各种各样的数据处理就包含在“隐含层”中。

那么,数据是怎么传播的呢?
数据的传播有两种方式,第一种是前向传播,这种传播方式相对较为简单,在这里我也将通过前向传播进行讲解;而反向传播在数学上相对较为复杂,可是如果使用TensorFlow也能较为方便地实现。

以数字识别为例

数字识别
我们以最经典的数字识别为例,概括地讲一下。首先,我们一定要明白,图像在计算机里,其实是一个个的像素矩阵。神经网络中干的工作就是去判断输入的图像究竟和0~9这是个数字中哪一个更像一点,这就像是一个概率问题,究竟是哪一个数字的概率更大,计算机将最大的可能性作为输出。

在每个神经元中,我们需要对数据做出相应的处理,我们会设定各种各样的评判指标,有些指标非常重要,于是我们会为这个指标设定更高的权重,有些相对不重要的指标的权重就会相对比较低。

在这里插入图片描述
我们可以把数据处理方式抽象成上图的计算公式,其中W代表权重,而b代表偏移量,我们通过调整权重,再通过一个激活函数,就能得到和我们预计中最为相似的结果,就是我们在深度学习中的重要工作。

在我们训练计算机的数字识别时,将这些训练数据输入模型,通过结果对比不断调节隐藏层的权重参数,最终达到一定的正确率之后,也就是完成了模型训练。

当我们把这个数字的信息输入输入端后,机器就能判断出这个数字。这样的数据传递过程就叫做正向传播;反向传播相当于我们手上有这个数字的信息,也知道它究竟是几,再去根据这个目标做一个反向的回馈。

激活函数

负责将神经元的输入映射到输出端。

所有的激活函数都一定是非线性函数,如果没有非线性函数的叠加,叠加出来的一定还是线性函数,不包含非线性因素,也就不会具有任何实际意义。

常见的激活函数有:

Sigmoid函数:
在这里插入图片描述

Tanh函数:
在这里插入图片描述

ReLU函数
在这里插入图片描述

这些内容大家不需要过多地纠结,但是有两个函数我们需要特别注意一下:

在这里插入图片描述

这里要特别强调一下,我们要得到的是一个概率问题,如果是多个选一个,我们会用到的事Softmax函数,如果是二选一,用到的是Sigmoid函数,这两个函数得出的都是一个[0,1]的值,我们就可以了解到究竟哪一种情况的可能性更大。

深度学习的两种方式

深度学习大体上可以分为监督式学习和非监督式学习。

非监督式学习

非监督式学习相当于是在一堆的数据中寻找规律。这种学习方法比较复杂,在此不做过多介绍。

监督式学习

监督式学习就相当于我们在刷题,我们做完题目之后,就去对答案,如果这道题错了,我们就反复练习,直到作对为止。

这种学习方式的适用比较广,而且比较容易有成效,这也是我们需要重点掌握的学习方法。

神经网络的核心思想

假设在监督学习的情况下,我们已经训练出了一个结果,那么我们应该如何判断这个结果的好坏呢?这就需要用到损失函数。

损失函数

损失函数表示的是我们在每一次修改参数之后,计算机输出值和真实值之间的差距,我们把这个差叫做“梯度”。

在理想状态下,我们可以把损失函数抽象成一个一元二次方程。

在这里插入图片描述
我们需要调整参数,使得梯度达到最小值,从而得到最优解。但是在实际情况下,损失函数往往是波动的,我们在调节某一模块的参数时,可以使得这个模块的梯度达到最小,但是从全局来看,这个局部的最小值并不是全局的最小值。

神经网络

神经网络的核心思想就是不断地计算它的梯度,然后通过调节参数使得损失函数的值尽可能地减小。

我们还有可能会听到“反向传播算法”这类的词语,这其实就是为了更快地计算每一个参数的梯度,使得计算时间复杂度减小。

为什么要使用TensorFlow

通俗来说,我们可以理解为,TensorFlow将很多的高级算法给封装了,你不需要很深入地理解各种数学上的问题,只要对这些高等数学有一个基本的了解,就可以实现神经网络的训练。

依照Google官方的说法,他们希望将TensorFlow打造成一个工具,用来实现深入学习。也就相当于AI工程师使用的计算器。

我们只需要设置好每一层的算法,TensorFlow就会帮助我们一层一层地计算下去。

TensorFlow把做AI的高度降低了,就像用Python写代码,把很多用C写的复杂的过程给封装了起来。

卷积神经网络

假设我们按照上述的AI训练方法,可能会出现一个问题——训练不出结果。

因为这里面的参数是在太多。

我举一个例子,假设我们今天需要求一个n元一次方程,那么至少需要提供n个式子,在理论上才能求解。同样的,这里参数太多,而数据量不够大,很可能无法出结果,而且就算出结果,这个计算量也会大得离谱。

卷积池化

为了解决上诉问题,我们采用了卷积神经网络进行处理。

池化的英文名为pooling,是对信息进行抽象的过程。

在这里插入图片描述

参照上图,用了一个1010的卷积核,对2020的图像分块不重叠的进行了池化,池化之后featuremap为2*2的大小。那么,池化后的小方块具有以下特征:
1、感受野增大
感受野表示一个像素对应回原图的区域大小,通过这样的方式,我们可以增大每一个像素所包含的信息量。
2、降低优化难度
卷积池化的一大特点就是,不需要参数,从而为简化提供了便利,这将会极大降低模型的参数量和优化工作量。
3、平移不变性
池化的工作是不断地抽象区域特征,而不关心具体的位置。

池化的种类

比较常见的池化有两种。

1、平均池化
在这里插入图片描述
平均池化往往能保留整体数据的特征,较好的突出背景信息。

2、最大池化
在这里插入图片描述
最大池化能更好保留纹理特征。

图像的识别

卷积神经网络就相当于我们现在有一个小矩阵,然后我们在这个大矩阵中移动,不断地进行数据处理。一个图像上相邻区域的信息往往是一样,或者非常相似的,我们就可以通过这种卷积的方式,把这些图像信息给提取出来。第一层提取时只能提取出一个大概,但是随着提取的层数越来越多,提取到的图像特征也会越来越具体。

在这里插入图片描述

我们把这些提取出来的特征进行分类,再进行整合,就能对图像进行识别。

在这里插入图片描述
上图中的模型就是将图像由输入层输入,不断池化然后连接,最后到输出层的过程。

而TensorFlow就可以帮助我们完成这些卷积层的工作。通过TensorFlow来训练AI基本上就是通过修改输入得到相应的输出,这为我们的操作提供了极大的便利。

发布了53 篇原创文章 · 获赞 18 · 访问量 7208

猜你喜欢

转载自blog.csdn.net/Nire_Yeyu/article/details/103698601