小白计算机视觉学习报告

视觉学习报告

第一次写CSDN博客,没想到是自己五周来的视觉学习报告。
和大家分享一下,供大家参考。

总述:
在这篇学习报告中,我将从三个方面来阐述我这段时间以来所学的东西。首先,我将先从知识层面去阐述;然后,再从思想方法方面去阐述这些知识;最后,我想从一些感性的角度去思考这段时间的收获(可能在文中就有所穿插)。

先对所学的视觉知识框架进行描述:
第一点:图像的基础知识
对计算机来说,图像是什么?
像素/通道/坐标系/
第二点:图像预处理/处理(预处理和处理,在这里我觉得还是有一些差异的,但我觉得,预处理和处理是相对的,有的时候应该可以模糊它们的范围)
什么叫做图像的预处理?为什么要预处理?预处理的方法都有哪些?
形态学操作/图像增强/图像恢复/图像分割
第三点:opencv库的使用
完成一些操作/人脸识别/haar特征及其级联分类器
第四点:神经网络/卷积神经网络
概念及数学原理
第五点:使用tensorflow搭建神经网络
Tensorflow API的使用
第六点:把开发环境转移到linux系统上
安装ubuntu20.0.4/简单操作
-----电子信息科学与技术204班韩三岁(匿名)
2020年11月31日

目录

第一章:图像预处理 3
1.1:图像相关概念 3
1.2:图像的处理及数学原理 4
第二章:Opencv库的使用 10
2.1:搭建操作环境 10
2.2:基本操作 11
2.3:基本形态学操作 12
2.4:直方图相关操作 13
2.5:噪声滤波器 14
2.6:感兴趣区域提取(图像分割) 15
2.7:阈值化操作: 15
2.8、haar特征及级联分类器 18
2.9:使用haar分类器完成人脸检测 19
2.10:在anaconda下使用python完成人脸识别项目 20
第三章:神经网络 22
3.1:神经网络的概念 22
3.2:神经网络的“部件”及数学原理 23
3.3:卷积神经网络的“部件”及数学原理 26
3.4:优化器 27
3.5:反向传播算法及误差反向传播算法 28
第四章:Tensorflow搭建神经网络 29
4.1、搭建神经网络的六步及API的使用 29
4.2、Tensorflow2.0中的常用函数 31
4.3、配合matplotlib绘制训练结果 32
第五章:linux系统的安装与使用 32
第六章:相关思想及方法 32
第七章:思考 32

第一章:图像预处理
1.1:图像相关概念

像素:像素,是图像显示的基本单位。一张图片,就是由若干像素所组成的。对于数字图像来说,每个像素都有一个值代表亮度的大小(0~255)。
所以,对计算机来说,一张图片,就是一堆数字。计算机对图片的处理,实际上就是对这些数字进行处理。

通道:为什么会有通道这个概念呢?提出它的意义是什么呢?通道其实是用来表示一张图片的颜色信息的。
RGB三通道,红绿蓝。我们将一张彩色图片分成三个通道,每张单通道的图片都是灰度图,但仔细观察每张灰度图,会发现它们的灰度是不同的。也就是亮度不同。图像某一部分在某一通道的亮度越大,代表这一部分在这一颜色的分量越大。正是通过这三个通道的混合,才得到了各种颜色的图片。
在卷积神经网络训练模型的时候,三通道的图片,也是需要深度为三的卷积核进行操作的。
在这里插入图片描述

坐标系:
以图片的左上角作为原点,向右作为x轴,向下作为y轴建立直角坐标系。这样,图像中的每一个像素点的坐标便可以得到,在进行感兴趣区域提取,图像分割的时候会很有用处。另外,由此也可以将图像的不同方向表示成一个离散的函数。

其实,以上这些,都很好的将一个实际问题转化成了一个数学问题。到后面,我们会发现,所有的对图像进行处理的操作,都是通过数学手段去实现和完成的。越到后面越会觉得,这些东西的本质,都是数学问题。

1.2:图像的处理及数学原理

(这里所涉及到的数学原理并不深入,这是接下来需要补充学习的。)

首先,我想先讲一下我对图像处理的理解:
我觉得图像处理的目的可以归结于一个:“好看”。
“好看”的概念有两个:
第一点,对我们人来说,我想让它的视觉效果更好一点,看起来更舒服一点。
第二点,对计算机来说,当我们想让计算机去处理相应的任务的时候(因为我们的“审美方式”和计算机的“审美方式”是不一样的),需要的是计算机的“审美”,对计算机来说,这种“美”是来源于数据的,它需要从相应的“数据特征”中去发现这些“美”。所以,我们就会有一些“方法”,去处理这些信息来获取“特征”的。

然后,我想再讲一下图像噪声(它也可以理解成一种信息,一种“错误信息”):
图像本质上就是一种信号,在传输过程中,难免会产生噪声。图像噪声是图像在获取或传输过程中收到随机信号干扰,妨碍人们对图像理解及分析处理的信号。
图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到了噪声的污染。
噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。
从这些角度来理解图像对计算机的概念,其实也还是蛮有意思的,它就是一种数字信号。

1.2.1:腐蚀
腐蚀:对腐蚀最简单的描述是:保留局部最小值。
讲的更具体点:我们需要去定义一个结构元素(也可以称之为核,我觉得这些并没有严格的定义)。定义完结构元素后,还需要去定义一个锚点(锚点的作用就是存放求得的最小值。),我们将结构元素放到图片的左上角,然后开始遍历整个图片,每走一步,就要进行一次求局部最小的操作。历经这样一个过程之后,便得到了一张新的图像。
所以,这个操作有什么意义呢?(直观的去理解)
腐蚀操作是一种求局部最小值的操作,由于是求局部最小值,所以图片的高亮部分会变暗,所以整张图片的亮度会变暗。腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。这是一种大体直观的感觉。

1.2.2:膨胀
膨胀:膨胀是求局部最大值的操作,核与图像卷积,即计算核覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素,这样就会使图像中高亮区逐渐增大。
膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。
需要强调的是,腐蚀和膨胀操作,所对应的都是白色部分像素,而不是黑色部分像素。所以,在对图像进行这些操作的时候,注意前景图像的灰度值应该大于背景图像的灰度值。

1.2.3:开运算
开运算:本质上就是先腐蚀后膨胀的过程。开运算能排除小区域物体、消除孤立点、去噪、平滑物体的轮廓:使用同一结构元对图像进行先腐蚀后膨胀的操作,可以用来平滑物体的轮廓,断开物体间较窄的连接,消除物体边沿尖锐的突出部分。
1.2.4:闭运算
闭运算:是一个先膨胀后腐蚀的过程。闭运算能填充目标区域内的离散小空洞和分散部分:使用同一结构元对图像进行先膨胀后腐蚀的操作,可以用来弥合较窄的间断和细长的沟壑,消除物体间小的孔洞,填补轮廓线中的断裂。

分析(开运算与闭运算),为什么能够取到不同的效果。我觉得本质上是因为,腐蚀与膨胀的操作是对于白色部分而言,而不是对于黑色部分的操作。这样就引起了一种差异。

1.2.5:顶帽
顶帽:是原图像与“开运算“的结果图之差。
想象一下,原始图像上有一些噪声,而经过开运算后,这些噪声得到了抑制,那么接下来的顶帽运算,就是拿原始图像减去开运算之后的图像,会得到什么?很显然,得到的将是原始图像上的噪声。当然,这个结果只是在一个理想的状态下。

1.2.6:黑帽

黑帽:闭运算结果图与原图像之差。
同样道理,黑帽运算得到的是前景图像中的小黑点。

对开运算,闭运算,顶帽,黑帽这些的分析(从一种奇怪的角度来看):它们可以被看作是一种算法,为什么这么说呢?因为从opencv的角度去看的话,腐蚀和膨胀能看作是两种基本的操作,或者说是两种模块在这两种模块的基础上,再去写开运算,闭运算,顶帽,黑帽,所以,从这个角度来看,开运算,闭运算,顶帽,黑帽这些是可以看作是一种算法的。所以从这样一个角度去理解算法,其实也还是蛮有意思的。当然,腐蚀和膨胀也是两种算法,只不过,它们的基础,是在更“底层”的模块之上的。

1.2.7:直方图

直方图:直方图统计就是对图像的像素点的值进行一下统计
首先声明一下,下面这张图片是从别人那里借鉴来的。
在这里插入图片描述

这里所描述的是灰度直方图,可以把它看作是灰度级的函数。
很显然直方图反映了图像中的灰度分布规律,它描述了每个灰度级具有的像元的个数。同时,很显然,直方图也有一个不好的点:它丢失了相应的位置信息;任何一个特定的图像都有唯一的直方图与之对应,但不同的图像可以对应多个直方图;如果一幅图像有两个不相连的区域组成,并且每个区域的直方图已知,那么整幅图像的直方图是该两个区域的直方图之和。
直方图可以近似的看成是一条连续的概率分布曲线。
应用:
1、可以用来判断一幅图像是否合理地利用了全部被允许的灰度级范围。一幅图像应利用几乎全部的灰度级。也可以用来判断图像质量的好坏。
2、可以帮助确定阈值的选取。

1.2.8:滤波器

其实,**这一部分,我觉得是可以类比与信号处理领域的知识去理解的。**虽然,对这方面我还不是很熟悉。但就从图像是信号这一角度来看,图像处理和信号处理应该是有交集的。(我大胆的猜测,信号处理,应该是包含图像处理的,就相当于把信号处理的一些东西“特殊化”,运用到图像处理上来的。)(这些可能都是废话,但我觉得这样挺助于理解的。)

首先,先将一个概念。(下面的滤波,都是在这一基础上进行细化的。)
邻域算子与线性邻域滤波:它们之间的关系是包含与被包含的关系。线性邻域滤波是一种常用的邻域算子。
线性领域滤波(或者说成卷积操作):
在这里插入图片描述
在这里插入图片描述

在上面这种操作的基础之上,我们只需要研究不同的核函数,便会得到不同的输出,从而达到相应的目的。

线性滤波操作:方框滤波、均值滤波、高斯滤波

方框滤波
在核覆盖的区域内,赋予每个像素相应的加权系数,进行求和,然后将所得的值赋给中心点。
在这里插入图片描述

上面就是方框滤波的核,当其被其区域归一化之后,很显然,它就变成了均值滤波。

高斯滤波
给核所覆盖区域的每一个像素值赋一个权重,这个权重是不一样的,离中心点越近的像素点所获得的权重就越大。(因此,关于“距离”与权重的函数,像一个“山峰”)
在这里插入图片描述

虽然从数学公式上我对高斯滤膜没有特别深刻的理解,但,直观上还是有一定理解的:
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。从数学的角度,高斯滤波的本质是,图像与正太分布做卷积。所以高斯滤波适合用来处理符合正太分布的噪声。

非线性滤波操作:中值滤波、双边滤波

中值滤波
在核所覆盖的区域内,将所有值进行从小到大的排序,然后将中值取代中心点。

双边滤波
双边滤波可能是一个后来发展出来的产物,这一点可以从它所应用的思想和工作原理上可以很明显的看出来。
双边滤波算法同时考虑到了空间域和值域两个方面。从空间域出发,计算出模板的点与目标点的距离(利用勾股定理),然后计算得出空域权重;从值域出发,计算出模板的点与目标点值的差值(取绝对值),然后计算得到值域权重;同时让模板各个点的像素值乘以该点的权重,并加起来得到像素值的和,最后让它再除以总的权重,就得到了该点的像素值。
具体的数学公式,暂时就不限阐述。(实力不允许)

1.2.9:阈值操作

阈值,神经网络中也有这个名词。在神经网络中,阈值,就相当于是一个开关,当某个值大于一个值时会怎样,小于一个值是会怎样,这个值就被称之为阈值。在这里,阈值化操作中,也蕴含着同样的道理。
最简单的二值化处理:

**// 自适应阈值化:**自适应阈值化是相对于固定阈值化的叫法,在实际的场景中,目标和背景区域通常是依存在图像块中,于是可以通过图像像素领域块的分布特征来自适应确定该区域的二值化阈值,这种阈值“相对可变”,所以被称为自适应阈值。

**OTSU阈值化:**OTSU是经典且常用的阈值化算法,是一种对图像进行二值化的高效算法,是一种自适应的阈值确定的方法,是最小二乘法意义下的最优分割,是一种寻找图像阈值的最大类间方差的算法。

双阈值化

半阈值化

边缘算子:

Canny边缘算子检测算法

索贝尔算子

拉普拉斯算子
//

上面的这一小部分,我没有具体的再去阐述,因为我还没有深入的去了解它们背后的数学原理,理解的不够深刻,没有办法将这些知识紧密的联系起来,所以我就不再阐述。

第二章:Opencv库的使用
2.1:搭建操作环境

首先将opencv build下最后的lib包含到环境变量中去。然后在vs中搭建一个新的C++控制台,在属性中VC++目录下的包含目录和引用目录分别包含相应路径,最后在链接器,输入选项下添加依赖项。如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2:基本操作
Opencv的一些基本操作,读入图片,显示图片,保存图片,转化成灰度图,图片通道的分离,图片通道的混合,waitKey(),destroyAllwindows()等。
使用imread函数进行图片的读入。在opencv 中,图片或者矩阵的数据类型为Mat。Imread()函数有两个参数:第一个参数是函数路径(要使用绝对路径),最后还需要在图片名字的后面加上图片的格式(.jpg或者.png等),第二个参数为读入图片的打开参数,它用来指导图片读入的,读入原图或者读入灰度图等。
Imshow函数用来展示图片,两个参数:窗口名和变量名。
Imwrite函数用来将图片进行保存。
cvtcolor函数,split函数,等,在这里就不一一列举了,这些还是需要多敲的,只靠看没有太大的用处。
在这里插入图片描述
在这里插入图片描述

2.3:基本形态学操作
腐蚀与膨胀

在这里插入图片描述

开运算与闭运算
腐蚀与膨胀,需要注意的一点是,要先定义一个核。
这个核需要是一个奇数大小的核。
在这里插入图片描述

2.4:直方图相关操作
将不同像素值的大小进行统计,做成一张直方图。
在这里插入图片描述
在这里插入图片描述

2.5:噪声滤波器
方框滤波与均值滤波:
在这里插入图片描述

高斯滤波:
在这里插入图片描述

2.6:感兴趣区域提取(图像分割)

2.7:阈值化操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后,我觉得有必要在这里讲一下回调函数

【回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
其实回调就是一种利用函数指针进行函数调用的过程.】摘自某博客。

这一块我理解的也不是特别的清除,下面说说我的理解。
当我们去使用某些库中函数的时候,我们想要去实现某功能,但这个功能在这个函数里面是没有的,所以我们就需要自己去写一个函数来实现我们想实现的功能,但由于这个功能是和这个函数存在关系的,所以我们就以指针的形式将我们写的函数传给这个函数(API),这就是回调函数。

在这里插入图片描述
在这里插入图片描述

2.8、haar特征及级联分类器
2.8.1:haar特征
特征模板:

在这里插入图片描述

在特征模板中有白色和黑色两种矩形。定义该模板的特征值为白色矩形像素的和减去黑色矩形像素的和。
特征原型A,B,D是白色矩形像素的和减去黑色矩形像素的和;而矩形C应该是白色矩形像素和减去二倍的黑色矩形像素的和。
为什么要定义一种特征值呢?
我们希望,当我们把矩形放在人脸区域计算出来的特征值和放到非人脸区域计算出来的特征值有很大的差别,这样才能有区分度,以此来告诉计算机哪个是人脸,哪个不是人脸。
因此,通过计算特征值,可以将其推广到不同物体的检测…
特征原型通过平移伸缩得到矩阵特征,矩阵特征的值被称为特征值。(矩形特征是矩形模板类别、矩形位置和矩阵大小这三个因素的函数) (使很小的检测窗口含有非常多的矩形特征)
使用特征比单纯的使用像素具有很大的优越性,为什么呢?
从不同角度(计算速度/维度等)来看待这个问题:
haar特征值可以有效的将矩阵映射为一维的特征值。实现二维到一维,这样一个降维的目的。因此,通过降维,我们可以提高计算的速度。

当提出haar特征之后,想要通过haar特征来完成人脸检测,就要去计算出haar特征,但是,即使是在一个很小的区域内,这样的特征也是有很多很多的,所以,应该怎样去快速的去计算这一特征呢?在这一问题下,积分图这一计算特征的方法,便被提了出来。

2.8.3:积分图
积分图就是只遍历一次图像可以找出图像中所有区域像素和的快速算法。
积分图的核心思想:从起点开始,到各个点所形成的区域像素之和作为一个数组元素储存在内存中。因此,当需要计算某个区域的像素值的和的时候,可以直接索引数组元素,不用重新计算。(动态规划算法)。因此积分图是一种能够描述全局矩阵的表示方法。
构造方式:
位置(i,j)处的值ii(i,j)左上角方向所有像素f(k,l)的和:
ii(i,j) = 求和 f(k,l) 其中k<=i;l<=j

在这里插入图片描述

上图是计算一个特征值的过程。

2.8.2:haar级联分类器
2.9:使用haar分类器完成人脸检测

被称为haar级联分类器,是因为,这个分类器训练的是haar特征值,所以以这一特征值的名字进行命名。
训练分类器的原理:
Adaboost级联分类器,adaboost是一种迭代算法,通过这种算法得到的分类器被称为adaboost级联分类器。级联分类器下:是强分类器和弱分类器。每一个强分类器下的每一个弱分类器也是树状结构;只有通过所有的强分类器,才能最后输出。有一个未通过,则不能通过。Adaboost级联分类器的训练:首先训练出每一个弱分类器,然后把每一个弱分类器按照一定的组合策略得到一个强分类器。以此,训练出多个强分类器,然后按级联的方式组合到一起,得到haar分类器。
筛选优秀的特征值(最优弱分类器):
假设一个20*20的图像,就会有78450个特征;对其中的任意一个特征fi,计算该特征在2000个正样本和4000个负样本上计算得到的6000个特征值。将这些特征值进行排序,然后选取一个最佳的特征值。
最佳??怎样的算最佳,评判标准??
最佳的特征值当然是在区分正负样本中表现最好的了。相当于“损失函数”。
在确定训练子窗口中的矩形特征数量和特征值后,需要对每一个特征值f进行训练,训练出一个弱分类器。取值(0或1)。训练的过程就是获得一个阈值的过程,一个使样本训练分类误差最小的阈值。

过程:
扫描一遍排好序的特征值,对排好序表中的每一个元素(特征值fi):计算全部正例的权重和 T+、负例和 T-;该元素之前的正例的权重和 S+、 负例和 S-;
选取当前元素的特征值Fkj和它前面的一个特征值Fkj-1作为阈值,所得的弱分类器就在这个元素处把样本分开。
//当弱分类器对样本分类正确时,样本的权重会减小;二分类错误时,样本的权重会增加,这样,后面的分类器就会对错误样本加强关注(训练);从而达到“节约资源”的目的。

(Adaboost级联分类器数学原理:)(待深入学习)

在这里插入图片描述
在这里插入图片描述

2.10:在anaconda下使用python完成人脸识别项目
在使用这些工具的过程中,如果仔细去思考这些工具之间的关系,其实是可以受到一些启发的。虽然这些启发是非技术层面的,但细细想来其实也是蛮有意义的。这些我将放到文章的最后去讲。
完成人脸识别的过程:

#明确目的:创建一个人脸分类器。
#如何实现人脸分类器的创建?将所要完成的任务结构化,分步骤去完成:
#第一步检测人脸,只有检测到了人脸,才能进行之后的训练。
#1、写一个人脸检测的函数封装:将目录下的图片一个个的进行人脸检测,然后给它贴上标签。
#第二步用opencv内置的函数创建识别器。
#建立标签和人名的映射关系。
#使用识别器进行预测。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三章:神经网络
3.1:神经网络的概念

神经网络的产生是受到生物学中生物神经网络的影响启发而来的。这也说明了,事物之间是相互联系的这一观点。
在这里的神经网络,所指的是一个数学模型。一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。

下面是神经元中“数据”的表示方法,它们的表示并不是唯一的。
在这里插入图片描述

下面是神经元内的“计算”:
在这里插入图片描述

3.2:神经网络的“部件”及数学原理
输入层,隐藏层,输出层,这些就不再过多的介绍。

激活函数:
类似于生物的神经元的激活,人工神经网络的神经元的激活也是一样的道理,只有当这一刺激达到一定程度,我们的神经元才会做出一定的反应,不然,它是不会做出任何反应的。为了模拟这一生物过程,相应的,我们需要一定的方法,引入一定的概念,才能对这一过程进行模拟。于是激活函数这一概念便被引入进来,用相应的数学方法来完成对这一过程的模拟。另外,如果不使用激活函数,就相当于激活函数是fx = x,也就是说上一层与下一层之间是线性关系,那么再多层的这种线性关系就相当于是一层的线性关系。那么这样,网络的逼近能力也就非常的有限了。

常用的激活函数:sigmoid函数,双曲正切函数,softmax函数,relu函数,leaky-relu函数,ELU函数。
在这里插入图片描述

Sigmoid函数是一个常用的非线性激活函数,但,现在很多时候可能都不会去用它。因为它存在固有的缺陷。
从它的公式,函数图像,导数图像上,我们来分析sigmoid函数:
很明显的可以看到它可以将输入进行压缩,压缩到0-1之间。在-5到5的范围内,原始数据通过压缩,它们的相对关系可以说是保持不变的。而对于-5以外和5以外的数据,它们的相对关系就发生了变化,所以这一点是很不好的。从它的导数来看,会有梯度消失的现象,这一点是很不利于反向传播更新梯度的。
另外,其函数表达式中是含有幂运算的,这样是不利于计算的。

在这里插入图片描述

双曲正弦函数,从形式上看,和sigmoid函数是有点类似的。
双曲正弦函数可以看作是在sigmoid函数上进行改进的。它虽然解决了sigmoid函数的零均值化问题,但,它仍然没有解决梯度消失的问题。另外,在计算上,它的复杂度完全不亚于sigmoid函数。
在这里插入图片描述

Softmax函数,它可以使神经元的输出符合概率分布。也就是说,它的输出的总和唯一,应用于分类问题,是很好的。
从函数公式出发,我们可以很明显的看到,它输出的结果的和为1.这个函数的定义可以说是很直观的了,那为什么要这样去定义它呢?在这里,我只简单说一下它的设计初衷:希望特征对概率的影响是乘性的。至于,从交叉熵损失函数,误差反向传播的角度的思考,我暂时不提,因为,我还没有对交叉熵函数进行深入的了解。
在这里插入图片描述

Relu函数看起来虽然很简单,但效果却很好。
从导数上看,很显然它解决了在正区间梯度消失的问题。由于它函数比较简单,所以计算速度相对是比较快的。它能够使模型快速收敛。
不过它依然存在缺点:当输入数据小于0的时候,会造成神经元的死亡,是一种永久性的死亡,它不会再被激活了。
在这里插入图片描述

对于leaky relu函数,它是在relu函数的基础上进行改进的。相对于relu函数,它解决了神经元死亡的问题。

在这里插入图片描述

ELU函数其实也是在relu函数的基础上进行改进的,它输入小于零部分的函数改成了非线性函数。很显然从理论上讲,它具有relu函数的所有有点,它的效果应该好于relu函数。但在实际的运用中,可能是由于计算量上的问题(可能性很小,我臆想的),它并没有被证明使用效果优于relu函数。

损失函数:
损失函数是用来评价整个模型最终的拟合效果的。对于整个模型来讲,它是有指导意义的。
损失函数有很多,从某种意义上讲,我觉得损失函数和激活函数是存在某种微妙的关系的。但可能由于神经网络本身就是一个黑箱问题,这种关系并不是特别的明显,所以损失函数与激活函数的关系也被隐藏了(这只是我觉得)。
在这里我就不再去列举其它的损失函数了。就先讲一个最简单的损失函数
在这里插入图片描述

这个损失函数可能是最简单的一个函数了。不过需要说明的是,二分之一在这里其实是没什么实际的意义的,它对最终模型参数的确定其实是没什么 影响的,之所以选择二分之一,很大程度上是为了使得求偏导的计算更加简单。

3.3:卷积神经网络的“部件”及数学原理

卷积层:学完图像处理之后,再看卷积层,难免会有一些想法。以下是我的理解:
卷积神经网络是在神经网络的基础上,增加了一种卷积操作。也正是这样的一种操作,使得卷积神经网络在图像识别,图像分类方面受到一个很好的效果。为什么呢?
首先先介绍三种卷积核(或者称之为滤波器):边缘滤波器,横向滤波器,纵向滤波器。
从下面的图中可以很明显的看到这三种不同滤波器所能提取到的特征。

在这里插入图片描述

卷积核的作用就是提高了特征提取能力。它能够将图片的特征进行提取,这是一种向“高层语义”转化的过程。这样以来,由于卷积层的加入,使得卷积神经网络具有了“高层语义”表达的能力,然后将这些特征送入神经网络训练,由于送入的是“特征”,所以相对来说,这样的训练效果会更好一点。

3.4:优化器

参数优化器是更新神经网络参数的工具。
通过这样几个值:待优化参数w,损失函数loss,学习速率lr,总迭代次数t,一阶动量mt,二阶动量vt。
那么参数优化器是如何工作的呢?
第一步:计算当前参数上t时间损失函数的梯度:
在这里插入图片描述

第二步:计算t时刻的一阶和二阶动量:
在这里插入图片描述

第三步:t时间梯度的计算:
在这里插入图片描述

第四步:计算t1时间参数:
在这里插入图片描述

事实上,参数优化器有好多种。 所有这些优化器工作方式相同,都是通过这几个步骤,唯一的区别是不同的优化器定义不同的一阶动量或不同的二阶动量,使得不同的优化器对参数的优化效果不同。(一阶动量和二阶动量,都是与梯度相关的函数)
还有一些优化器(SGDM优化器(在SGD优化器的基础上增加了一阶动量),Adagrad优化器(SGD基础上,增加二阶动量),RMSProp优化器(SGD基础上增加二阶动量))
SGD优化器的实现(使用tensorflow):
在这里插入图片描述

3.5:反向传播算法及误差反向传播算法
反向传播和误差反向传播有着相同的思想,只是通过不同的关系表达的而已。
反向传播的过程:
在这里插入图片描述

反向传播和误差反向传播的主要思想是将“关系”从末端传递到头部。 最后,我们可以得到关于损失函数和输入的偏导。 然后根据数学原理,可以改变权重,使损失函数取得最小值。从图中我们可以看到,我们希望损失函数达到最低的地方。 它是一个关于最后一层的输出和我们已经知道的真实值之间的函数。 而它们是从最后一层输出的。 因此,根据链式法则,我们可以得到损失函数与每层输出之间的关系。 这样,我们接着做同样的事情,最后,我们将得到损失函数与输入之间的偏导。 根据这种关系,利用数学原理,我们最终可以得到神经网络的最佳权值。 然后,我们将其保存为一个模型,并在一定条件下使用该模型来解决问题。
梯度下降法是求解多变量函数最小值问题的有效方法。 然而,在神经网络中直接使用梯度下降法是非常困难的。 为了解决这样一个问题,便出现了误差反向传播。
首先是对误差的定义:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样,我们就能够将求解梯度的问题成功转化为求解神经元误差的问题。使得整个过程的计算量变得相对较小。

将公式推广:

在这里插入图片描述

从这个公式,我们可以得到:第l层的第i个神经元误差可由第i+1层的所有神经元误差和第l到第l+1层的所有权重得到。

第四章:Tensorflow搭建神经网络
4.1、搭建神经网络的六步及API的使用

使用tf.keras搭建网络:
第一步:import导入相关库

第二步:train,test数据集
在这里,可以使用官方提供的数据集,直接通过一个接口去下载,也可以自制数据集。大对数情况下可能会自制数据集,来解决相关领域的问题。
对于图像识别等相关图像领域的问题,在这一步骤中,图像预处理部分就显得相当重要了,因此,从这里得到启发,图像处理部分还是很有必要进行深入学习和了解的,不能仅仅只是停留在OPENCV函数的调用上,而应该尝试去深入挖掘它们背后的数学原理。

第三步:model=tf.keras.models.Sequential()这是一个网络结构,可以认为是一个容器,通过在里面描述各层的结构,在里面封装神经网络模型。
在这里插入图片描述

第四步:model.compile 在这一API中可以定义optimizer优化器、loss损失函数、metrics准确率。
在这里插入图片描述

第五步:model.fit ,这个是相当于是神经网络的输入。
在这里插入图片描述

第六步:model.summary, 打印出网络的结构,统计参数,神经元数量等。

4.2、Tensorflow2.0中的常用函数

下面函数中的张量名,统一用aa表示
1、tf.cast(aa, dtype= ) 强制类型转换。
2、tf.reduce.min(aa) 查找张量中的最小值。
3、tf.reduce.max(aa) 查找张量中的最大值。
4、axis,在二维数组中,axis = 0表示横向操作,axis = 1 表示纵向操作。
5、tf.reduce.mean(aa, axis = ) 求平均值。 tf.reduce.sum(aa, axis= )求和
需要说明的是,axis在这里是可选参数,如果标明axis,则会在相应的方向上进行操作,如果未对axis进行标注,则整个操作是在全局上进行的。
6、tf.variable(),将变量标记为可训练,在神经网络训练中,常使用其标记待训练参数。梯度下降时,被标记的变量会在反向传播中记录梯度信息。
例如:
7、tf.ones([m,n])生成一个m * n的全为1的张量。tf.zeros([,])
tf.fill( [,] , num) tf.constant([ ])
8、tf.matmul( , )矩阵乘法 tf.add() 、 tf.swbstrct() 、 tf.multiply () 、tf.divide() 四则运算
9、tf.data.Dataset.from_tensor_slices(( features , labels )) 将输入特征和标签进行匹配,构建数据集
例如:
Features = tf.constant([1.0,2.0,3.0,4.0])
Labels = tf.constant([0.1,0.2,0.3,0.4])
Dataset = tf.data.Dataset.from_tensor_slices((Features,Labels))
10、tf.GradientTape() 配合with结构,使用gradient来求张量的梯度。
11、tf.one_hot(待转换数据,depth=几分类) 独热编码,在分类问题中,常常使用独热编码做标签,“0”表示非,“1”表示是。对于分类问题,神经网络完成前向传播,计算出每种类型的可能性大小之后,它们是不符合概率分布的,不能与独热码的标签做比较。所以它常常配合softmax函数使用,通过sotfmax使得输出符合概率分布。
12、tf.nn.softmax()使用softmax函数。
13、assign_sub使参数自更新的操作。在调用assigb_sub前,先用tf.variable()进行标注。
例如:
W = tf.Variable(4)
W.assign_sub(1)
print(W) 这就是一种自减操作,使4(每次)(有循环的时候才能讲每次)减 1.

当然还有一些其它的函数,在这里就不一一列举了。

4.3、配合matplotlib绘制训练结果

这里就是一些matplotlib库中的一些函数的使用。

在这里插入图片描述

第五章:linux系统的安装与使用

linux系统我从高中开始玩树莓派的时候就已经接触到了。当时用的树莓派的镜像,现在是ubuntu20.0.04的系统。
安装过程比较简单,常用的一些命令可以参考官网,也比较简单。

略过。

第六章:相关思想及方法
第七章:思考

相关的思想及方法,以及一些思考,在文中已有阐述,这里就不再总结。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机视觉是指计算机利用图像或视频数据来理解和解释视觉信息的技术。计算机视觉处理是计算机对图像或视频数据进行分析和处理,以实现对图像中物体、场景和特征的识别、分类、检测等任务。计算机视觉处理应用广泛,包括人脸识别、目标检测、图像分割等。 计算机视觉的基础是将图像或视频数据转换为计算机可以理解的二进制数据。计算机只认识0和1,因此在查看图像文件时,计算机会先将其转换成二进制数据。这样,计算机就可以通过对二进制数据的处理来理解和处理图像信息了。 对于零基础的朋友来说,了解计算机视觉的基本原理是很重要的。可以将计算机视觉看作是人工智能时代的眼睛,它让计算机能够通过图像或视频数据来理解这个世界。虽然计算机视觉涉及的技能很多,但并不需要一开始就掌握所有的技能。你可以从了解基本的概念和原理开始,逐步深入学习和应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [计算机视觉处理零基础入门](https://blog.csdn.net/m0_59236127/article/details/128283439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [零基础小白,如何入门计算机视觉?](https://blog.csdn.net/electech6/article/details/79545911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值