| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习计算机视觉理论基础(PyTorch) -> 正文阅读 |
|
[人工智能]深度学习计算机视觉理论基础(PyTorch) |
深度学习计算机视觉理论基础(PyTorch)学习唐进民的《深度学习之PyTorch实战计算机视觉》的理论部分(前四章)的笔记。 学习完此部分理论内容之后就可以开始学习 Python(建议 Python初学小知识 专栏)和 PyTorch(建议 深度学习专栏里面的前面几篇深度学习PyTorch笔记)知识,写代码了! 如果已经掌握了基础的 Python 和 PyTorch 知识就可以开始进行实例操作( 深度学习专栏和 人工智能实例专栏有一些例子,持续更新)了! 1 神经网络与cv在使用深度学习方法解决计算机视觉问题的过程中,用得最多的网络架构是一种叫作卷积神经网络(Convolutional Neural Network)的模型。卷积神经网络是人工神经网络的变化和升级,是科学家通过模拟人类大脑的工作原理而发明的。 1.1 经典的人工神经元模型:M-P 模型y j = f ( ∑ i = 1 n w i j x i ? θ j ) y_{j}=f\left(\sum_{i=1}^{n} w_{i j} x_{i}-\theta_{j}\right) yj?=f(i=1∑n?wij?xi??θj?)
1.2 感知机(Perceptron)的诞生
如果处于二维空间中,那么 w ? x + b = 0 w \cdot x+b= 0 w?x+b=0 对应的就是对输入数据进行二分类的那条直线,在感知机中我们也把这条直线叫作分割超平面(Separating Hyperplane)。 不过感知机也存在极为明显的优缺点,优点是很容易处理线性可分问题,缺点是不能处理异或问题,也就是说不能处理非线性问题。 所以,之后出现了能够处理非线性问题的多层感知机模型: 不能只对网络层次进行机械性累加,否则在进行后向传播的过程中会出现梯度消失的问题。对于深层次神经网络模型,我们必须有特别的优化和控制手段。 有一种一种有效的解决方案,是通过无监督预训练对权值进行初始化和有监督训练微调模型(利用现有的样本数据,通过科学的方法不断微调模型参数,使模型的预测结果和真实结果之间的误差值不断减小)。 1.3 计算机视觉传统的计算机视觉大致分为信息的收集、信息的分析和信息的处理三部分内容。 图像的目标识别 Object Recognition:对识别出的类别对象用长方形进行框选并在框上打上标签名)和语义分割(Semantic Segmentation:对识别出的类别使用同一种像素进行标识并打上标签)可以说是图片分类的升级版本。 2 深度神经网络基础2.1 监督学习和无监督学习2.1.1 监督学习(Supervised Learning)监督学习是有训练的,过程是:
(1)回归问题 2.1.2 无监督学习(Unsupervised Learning)无监督学习是没有训练,靠直觉的,过程如下:
在无监督训练的整个过程中,我们需要做的仅仅是将训练数据提供给我们的无监督模型,让它自己挖掘数据中的特征和关系。 2.1.3 小结
2.2 欠拟合和过拟合可以将搭建的模型是否发生欠拟合或者过拟合作为评价模型的拟合程度好坏的指标。 2.2.1 欠拟合
解决问题的方式:
2.2.2 过拟合
2.3 损失和优化深度神经网络中的损失 = 预测值 - 真实值,是衡量我们训练出来的模型泛化能力(机器学习算法对新鲜样本的适应能力)好坏的重要指标。预测值和真实值的差距越小,则说明我们训练的模型预测越准确,具有更好的泛化能力。 对模型进行优化的最终目的是尽可能地在不过拟合的情况下降低损失值。 2.3.1 损失函数(1)均方误差(Mean Square Error,简称 MSE) 2.3.2 优化函数在实践操作中最常用到的是一阶优化函数,一阶优化函数在优化过程中求解的是参数的一阶导数,这些一阶导数的值就是模型中参数的微调值。典型的一阶优化函数包括 GD、SGD、Momentum、Adagrad、Adam,等等。 (1)全局梯度下降 梯度下降(Gradient Descent,简称 GD)是参数优化的基础方法。虽然梯度下降已被广泛应用,但是其自身纯在许多不足,所以在其基础上改进的优化函数也非常多。 全局梯度下降的参数更新公式如下: 因为模型的训练依赖于整个数据集,所以增加了计算损失值的时间成本和模型训练过程中的复杂度。 (2)批量梯度下降(Batch Gradient Descent,简称 BGD) 每次用一个批量的数据来对模型进行训练,并以这个批量计算得到的损失值为基准来对模型中的全部参数进行梯度更新,默认这个批量只使用一次。 (3)随机梯度下降(Stochastic Gradient Descent,简称 SGD) 通过随机的方式从整个参与训练的数据集中选取一部分来参与模型的训练。只要随机选取的数据集大小合适,就不用担心计算损失函数的时间成本和模型训练的复杂度,而且与整个参与训练的数据集的大小没有关系。 θ j = θ j ? η × ? J s t o c h a s t i c ( θ j ) ? θ j \theta_{j}=\theta_{j}-\eta \times \frac{\partial J_{stochastic}\left(\theta_{j}\right)}{\partial \theta_{j}} θj?=θj??η×?θj??Jstochastic?(θj?)? 模型会受到随机训练数据集中噪声数据的影响,又因为有随机的因素,所以也容易导致模型最终得到局部最优解。 (4)自适应时刻估计方法(Adaptive Moment Estimation,简称 Adam) Adam 在模型训练优化的过程中通过让每个参数获得自适应的学习率,来达到优化质量和速度的双重提升。 Adam 收敛速度快、学习效果好的优点脱不了干系,而且对于在优化过程中出现的学习速率消失、收敛过慢、高方差的参数更新等导致损失值波动等问题,Adam 都有很好的解决方案。 2.4 激活函数没有激活函数的单层神经网络模型: 加入偏置的单层神经网络模型: 加入激活函数的二层神经网络: 三层神经网络模型,并且每层的神经输出都使用同样的激活函数: 如果没有激活函数,而我们只是一味地加深模型层次,则搭建出来的神经网络数学表示如下: 可以看出,上面的模型仍然是一个线性模型,如果不引入激活函数,则无论我们加深多少层,其结果都一样,线性模型在应对非线性问题时会存在很大的局限性。激活函数的引入给我们搭建的模型带来了非线性因素。 2.4.1 Sigmoid
f
(
x
)
=
1
1
+
e
?
x
f(x)=\frac{1}{1+e^{-x}}
f(x)=1+e?x1?
2.4.2 tanh
f
(
x
)
=
e
x
?
e
?
x
e
x
+
e
?
x
f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
f(x)=ex+e?xex?e?x? 2.4.3 ReLU(Rectified Linear Unit,修正线性单元)是目前在深度神经网络模型中使用率最高的激活函数: 缺点是ReLU 的输出并不是零中心数据,这可能会导致某些神经元永远不会被激活,并且这些神经元相对应的参数不能被更新。这一般是由于模型参数在初始化时使用了全正或者全负的值,或者在后向传播过程中设置的学习速率太快导致的。 3 卷积神经网络(Convolutional Neural Networks,简称 CNN)一个标准的卷积神经网络架构主要由卷积层、池化层和全连接层等核心层次构成。 3.1 基础知识3.1.1 卷积层(Convolution Layer)主要作用是对输入的数据进行特征提取,而完成该功能的是卷积层中的卷积核(Filter)。我们可以将卷积核看作一个指定窗口大小的扫描器,扫描器通过一次又一次地扫描输入的数据,来提取数据中的特征。如果我们输入的是图像数据,那么在通过卷积核的处理后,就可以识别出图像中的重要特征了。 在卷积层中是如何定义这个卷积核? 下面,根据我们定义的卷积核步长对卷积核窗口进行滑动。卷积核的步长其实就是卷积核窗口每次滑动经过的图像上的像素点数量。 卷积通用公式:用于计算输入图像经过一轮卷积操作后的输出图像的宽度和高度的参数
举例:三个色彩通道的输入图像的卷积过程 3.1.2 池化层一种提取输入数据的核心特征的方式,不仅实现了对原始数据的压缩,还大量减少了参与模型计算的参数,从某种意义上提升了计算效率。其中,最常被用到的池化层方法是平均池化层和最大池化层,池化层处理的输入数据在一般情况下是经过卷积操作之后生成的特征图。 池化层也需要定义一个类似卷积层中卷积核的滑动窗口,但是这个滑动窗口仅用来提取特征图中的重要特征,本身并没有参数。下面是平均池化层和最大池化层。
池化通用公式:计算输入的特征图经过一轮池化操作后输出的特征图的宽度和高度 3.1.3 全连接层全连接层的主要作用是将输入图像在经过卷积和池化操作后提取的特征进行压缩,并且根据压缩的特征完成模型的分类功能。
3.2 模型实例3.2.1 LeNet 模型
3.2.2 AlexNet 模型
3.2.3 VGGNet 模型相对 AlexNet 而言,在 VGGNet 模型中统一了卷积中使用的参数,比如卷积核滑动窗口的高度和宽度统一为 3×3,卷积核步长统一为 1,Padding 统一为 1,等等;而且增加了卷积神经网络模型架构的深度,分别定义了 16 层的 VGG16 模型和 19 层的 VGG19 模型,与 AlexNet 的 8 层结构相比,深度更深。 这两个重要的改变对于人们重新定义卷积神经网络模型架构也有不小的帮助,至少证明使用更小的卷积核并且增加卷积神经网络的深度,可以更有效地提升模型的性能。 3.2.4 GoogleNet与 VGGNet 模型相比较,GoogleNet 模型的网络深度已经达到了 22 层,而且在网络架构中引入了 Inception 单元。这两个重要的改变证明,通过使用 Inception 单元构造的深层次卷积神经网络模型,能进一步提升模型整体的性能。 【实例:】
之后通过计算,分别得到这 4 部分输出的特征图为 32×32×128、32×32×192、32×32×96 和 32×32×256,最后在合并层进行合并(相加),得到32×32×672 的特征图。 缺点:
(2)GoogleNet 模型中的 Inception 单元结构 NIN(Network in Network)中 1×1 卷积层的作用:能够完成特征图通道的聚合或发散。 通过 1×1 卷积层来控制特征图最后输出的深度,从而间接影响了与其相关联的层的卷积参数数量。 总结:使用 1×1 的卷积层使卷积参数几乎减少了一半,极大提升了模型的性能。 GoogleNet 在 Naive Inception 单元的基础上对单元结构进行了改进: (3)GoogleNet 的网络架构 起始部分: 分类输出部分: 小结:在 GoogLeNet 模型中使用 Inception 单元,使卷积神经网络模型的搭建实 更详细的讲解可以参考这里。 3.2.5 ResNetResNet 模型中引入了一种残差网络(Residual Network)结构,通过使用残差网络结构,深层次的卷积神经网络模型不仅避免了出现模型性能退化的问题,反而取得了更好的性能。下面是一个具有 34 层网络结构的 ResNet 模型: 在 ResNet 模型中大量使用了一些相同的模块来搭建深度更深的网络,却没有出现梯度消失、极易过拟合等模型性能退化的问题,其中一个非常关键的因素就是模型累加的模块并非简单的单输入单输出的结构,而是一种设置了附加关系(恒等映射:Identity Mapping)的新结构(残差网络结构)。 【没有设置附加关系的单输入单输出模块:】 【让网络结构更深的残差模块:】 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 4:27:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |