IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 机器视觉基础知识(2) -> 正文阅读

[人工智能]机器视觉基础知识(2)

1.神经网络
1.1神经网络类型众多,其中最为重要的是多层感知机。多层感知机中的特征神经元模型称为感知机。
1.2
1.梯度消失是指通过隐藏层从后向前看,梯度会变的越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习会卡住,除非梯度变大。
梯度消失的原因受到多种因素影响,例如学习率的大小,网络参数的初始化,激活函数的边缘效应等。在深层神经网络中,每一个神经元计算得到的梯度都会传递给前一层,较浅层的神经元接收到的梯度受到之前所有层梯度的影响。如果计算得到的梯度值非常小,随着层数增多,求出的梯度更新信息将会以指数形式衰减,就会发生梯度消失。
2.梯度爆炸 在深度网络或循环神经网络(Recurrent Neural Network, RNN)等网络结构中,梯度可在网络更新的过程中不断累积,变成非常大的梯度,导致网络权重值的大幅更新,使得网络不稳定;在极端情况下,权重值甚至会溢出,变为 N a N NaN NaN值,再也无法更新。
1.3
机器学习:利用计算机、概率论、统计学等知识,输入数据,让计算机学会新知识。机器学习的过程,就是训练数据去优化目标函数。

? 深度学习:是一种特殊的机器学习,具有强大的能力和灵活性。它通过学习将世界表示为嵌套的层次结构,每个表示都与更简单的特征相关,而抽象的表示则用于计算更抽象的表示。

? 传统的机器学习需要定义一些手工特征,从而有目的的去提取目标信息, 非常依赖任务的特异性以及设计特征的专家经验。而深度学习可以从大数据中先学习简单的特征,并从其逐渐学习到更为复杂抽象的深层特征,不依赖人工的特征工程,这也是深度学习在大数据时代受欢迎的一大原因。

1.4前向传播与反向传播
神经网络的计算主要有两种:前向传播(foward propagation, FP)作用于每一层的输入,通过逐层计算得到输出结果;反向传播(backward propagation, BP)作用于网络的输出,通过计算梯度由深到浅更新网络参数。
假设上一层结点 $ i,j,k,… $ 等一些结点与本层的结点 $ w $ 有连接,那么结点 $ w $ 的值怎么算呢?就是通过上一层的 $ i,j,k,… $ 等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如 R e L u ReLu ReLu s i g m o i d sigmoid sigmoid 等函数,最后得到的结果就是本层结点 $ w $ 的输出。
其中 Layer $ L_1 $ 是输入层,Layer $ L_2 $ 是隐含层,Layer $ L_3 $ 是输出层。

? 假设输入数据集为 $ D={x_1, x_2, …, x_n} $,输出数据集为 $ y_1, y_2, …, y_n $。

? 如果输入和输出是一样,即为自编码模型。如果原始数据经过映射,会得到不同于输入的输出。

假设有如下的网络层:

? 输入层包含神经元 $ i_1, i_2 $,偏置 $ b_1 $;隐含层包含神经元 $ h_1, h_2 $,偏置 $ b_2 $,输出层为 $ o_1, o_2 , , w_i $ 为层与层之间连接的权重,激活函数为 s i g m o i d sigmoid sigmoid 函数。对以上参数取初始值,如下图所示:

其中:

输入数据 $ i1=0.05, i2 = 0.10 $
输出数据 $ o1=0.01, o2=0.99 $;
初始权重 $ w1=0.15, w2=0.20, w3=0.25,w4=0.30, w5=0.40, w6=0.45, w7=0.50, w8=0.55 $
目标:给出输入数据 $ i1,i2 $ ( 0.05 0.05 0.05 0.10 0.10 0.10 ),使输出尽可能与原始输出 $ o1,o2 $,( 0.01 0.01 0.01 0.99 0.99 0.99)接近。
前向传播

输入层 --> 输出层
计算神经元 $ h1 $ 的输入加权和:

$$ net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1\

net_{h1} = 0.15 * 0.05 + 0.2 * 0.1 + 0.35 * 1 = 0.3775 $$

神经元 $ h1 $ 的输出 $ o1 $ :(此处用到激活函数为 sigmoid 函数):

o u t h 1 = 1 1 + e ? n e t h 1 = 1 1 + e ? 0.3775 = 0.593269992 out_{h1} = \frac{1}{1 + e^{-net_{h1}}} = \frac{1}{1 + e^{-0.3775}} = 0.593269992 outh1?=1+e?neth1?1?=1+e?0.37751?=0.593269992

同理,可计算出神经元 $ h2 $ 的输出 $ o1 $:

o u t h 2 = 0.596884378 out_{h2} = 0.596884378 outh2?=0.596884378

隐含层–>输出层:   
计算输出层神经元 $ o1 $ 和 $ o2 $ 的值:

n e t o 1 = w 5 ? o u t h 1 + w 6 ? o u t h 2 + b 2 ? 1 net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1 neto1?=w5??outh1?+w6??outh2?+b2??1

n e t o 1 = 0.4 ? 0.593269992 + 0.45 ? 0.596884378 + 0.6 ? 1 = 1.105905967 net_{o1} = 0.4 * 0.593269992 + 0.45 * 0.596884378 + 0.6 * 1 = 1.105905967 neto1?=0.4?0.593269992+0.45?0.596884378+0.6?1=1.105905967

o u t o 1 = 1 1 + e ? n e t o 1 = 1 1 + e 1.105905967 = 0.75136079 out_{o1} = \frac{1}{1 + e^{-net_{o1}}} = \frac{1}{1 + e^{1.105905967}} = 0.75136079 outo1?=1+e?neto1?1?=1+e1.1059059671?=0.75136079

这样前向传播的过程就结束了,我们得到输出值为 $ [0.75136079 , 0.772928465] $,与实际值 $ [0.01 , 0.99] $ 相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。

**反向传播 **

? 1.计算总误差

总误差:(这里使用Square Error)

E t o t a l = ∑ 1 2 ( t a r g e t ? o u t p u t ) 2 E_{total} = \sum \frac{1}{2}(target - output)^2 Etotal?=21?(target?output)2

但是有两个输出,所以分别计算 $ o1 $ 和 $ o2 $ 的误差,总误差为两者之和:

E o 1 = 1 2 ( t a r g e t o 1 ? o u t o 1 ) 2 = 1 2 ( 0.01 ? 0.75136507 ) 2 = 0.274811083 E_{o1} = \frac{1}{2}(target_{o1} - out_{o1})^2 = \frac{1}{2}(0.01 - 0.75136507)^2 = 0.274811083 Eo1?=21?(targeto1??outo1?)2=21?(0.01?0.75136507)2=0.274811083.

E o 2 = 0.023560026 E_{o2} = 0.023560026 Eo2?=0.023560026.

E t o t a l = E o 1 + E o 2 = 0.274811083 + 0.023560026 = 0.298371109 E_{total} = E_{o1} + E_{o2} = 0.274811083 + 0.023560026 = 0.298371109 Etotal?=Eo1?+Eo2?=0.274811083+0.023560026=0.298371109.

? 2.隐含层 --> 输出层的权值更新:

以权重参数 $ w5 $ 为例,如果我们想知道 $ w5 $ 对整体误差产生了多少影响,可以用整体误差对 $ w5 $ 求偏导求出:(链式法则)

? E t o t a l ? w 5 = ? E t o t a l ? o u t o 1 ? ? o u t o 1 ? n e t o 1 ? ? n e t o 1 ? w 5 \frac{\partial E_{total}}{\partial w5} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w5} ?w5?Etotal??=?outo1??Etotal????neto1??outo1????w5?neto1??

1.5超参数
在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
超参数搜索一般过程:

将数据集划分成训练集、验证集及测试集。
在训练集上根据模型的性能指标对模型参数进行优化。
在验证集上根据模型的性能指标对模型的超参数进行搜索。
步骤 2 和步骤 3 交替迭代,最终确定模型的参数和超参数,在测试集中验证评价模型的优劣。
其中,搜索过程需要搜索算法,一般有:网格搜索、随机搜过、启发式智能搜索、贝叶斯搜索。
1.6激活函数
1.激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
2.激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
3.激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。

sigmoid 激活函数

函数的定义为: f ( x ) = 1 1 + e ? x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e?x1?,其值域为 ( 0 , 1 ) (0,1) (0,1)
在这里插入图片描述
tanh激活函数
函数的定义为: f ( x ) = t a n h ( x ) = e x ? e ? x e x + e ? x f(x) = tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=tanh(x)=ex+e?xex?e?x?,值域为 ( ? 1 , 1 ) (-1,1) (?1,1)
在这里插入图片描述
Relu激活函数
函数的定义为: f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x) ,值域为 [ 0 , + ∞ ) [0,+∞) [0,+)

在这里插入图片描述
Leak Relu 激活函数
函数定义为: $f(x) = \left{ \begin{aligned} ax, \quad x<0 \ x, \quad x>0 \end{aligned} \right. $,值域为 $ (-∞,+∞) $。

SoftPlus 激活函数
函数的定义为: f ( x ) = l n ( 1 + e x ) f(x) = ln( 1 + e^x) f(x)=ln(1+ex),值域为 ( 0 , + ∞ ) (0,+∞) (0,+)
在这里插入图片描述
softmax 函数

函数定义为: σ ( z ) j = e z j ∑ k = 1 K e z k \sigma(z)j = \frac{e^{z_j}}{\sum{k=1}^K e^{z_k}} σ(z)j=k=1Kezk?ezj??

Softmax 多用于多分类神经网络输出

1.如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
2.如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当是负值的时候,导数等于 0。
3.sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
4.tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
5.ReLu 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLu 或者 Leaky ReLu,再去尝试其他的激活函数。
6.如果遇到了一些死的神经元,我们可以使用 Leaky ReLU 函数。
7.使用relu函数的优点
在区间变动很大的情况下,ReLu 激活函数的导数或者激活函数的斜率都会远大于 0,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。
sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散,而 Relu 和Leaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。
需注意,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会产生这个问题。
单侧抑制;

相对宽阔的兴奋边界;

稀疏激活性;

ReLU 函数从图像上看,是一个分段线性函数,把所有的负值都变为 0,而正值不变,这样就成为单侧抑制。

因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。

稀疏激活性:从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。当 $ x<0 $ 时,ReLU 硬饱和,而当 $ x>0 $ 时,则不存在饱和问题。ReLU 能够在 $ x>0 $ 时保持梯度不衰减,从而缓解梯度消失问题。

8.Softmax 函数
softmax 函数加入了 $ e $ 的幂函数正是为了两极化:正样本的结果将趋近于 1,而负样本的结果趋近于 0。

1.7.Batch_Size
Batch的选择,首先决定的是下降的方向。

如果数据集比较小,可采用全数据集的形式,好处是:

由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。

1.Batch_Size 太小,模型表现效果极其糟糕(error飙升)。
2.随着 Batch_Size 增大,处理相同数据量的速度越快。
3.随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
4.由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
5.由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到6.最终收敛精度上的最优。

1.8归一化
1.8.1为什么要归一化?
为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
为了程序运行时收敛加快。
同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
避免神经元饱和。啥意思?就是当神经元的激活在接近 0 或者 1 时会饱和,在这些区域,梯度几乎为 0,这样,在反向传播过程中,局部梯度就会接近 0,这会有效地“杀死”梯度。
保证输出数据中数值小的不被吞食。
在这里插入图片描述
在CNN中,BN应作用在非线性映射前。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。

? BN比较适用的场景是:每个mini-batch比较大,数据分布比较接近。在进行训练之前,要做好充分的shuffle,否则效果会差很多。另外,由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。
1.9学习率
在梯度下降法中,都是给定的统一的学习率,整个优化过程中都以确定的步长进行更新, 在迭代优化的前期中,学习率较大,则前进的步长就会较长,这时便能以较快的速度进行梯度下降,而在迭代优化的后期,逐步减小学习率的值,减小步长,这样将有助于算法的收敛,更容易接近最优解。故而如何对学习率的更新成为了研究者的关注点。? 在模型优化中,常用到的几种学习率衰减方法有:分段常数衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减、噪声线性余弦衰减
在这里插入图片描述
1.10Dropout
深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。
如果你怀疑神经网络过度拟合了数据,即存在高方差问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据,这也是非常可靠的办法,但你可能无法时时准备足够多的训练数据,或者,获取更多数据的成本很高,但正则化有助于避免过度拟合,或者减少网络误差。
? dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降,因为我们所优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。我通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。我觉得你也可以尝试其它方法,虽然我们并没有关于这些方法性能的数据统计,但你可以把它们与dropout方法一起使用。
1.11数据增强
Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);

PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering;

Random Scale:尺度变换;

Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;

Horizontal/Vertical Flip:水平/垂直翻转;

Shift:平移变换;

Rotation/Reflection:旋转/仿射变换;

Noise:高斯噪声、模糊处理;

Label Shuffle:类别不平衡数据的增广;

引用https://github.com/scutan90/DeepLearning-500-questions/blob/master/ch03_%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80.md

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:48:33  更:2022-07-03 10:51:59 
 
开发: 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/26 0:38:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码