机器学习与数据挖掘知识点总结(一)

news2025/1/21 0:55:49

简介:随着人工智能(AI)蓬勃发展,也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域,机器学习包含深度学习以及强化学习,在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归(二分类以及多分类问题),以及深度学习的一些神经网络变型,包括有CNN经典模型残差神经网络(ResNet),RNN经典模型长短时期记忆网络(LSTM)。

在人工智能上花一年时间,这足以让人相信上帝的存在。--艾伦\cdot佩利

目录

1、激活函数

(1)什么是激活函数:

(2)常见激活函数:

2、线性回归与逻辑回归任务

3、梯度优化算法

(1)梯度下降(Gradient descent,简称GD)

(2)梯度消失以及梯度爆炸

(3)学习率(learning rate,简称lr)

4、拟合问题

(1)训练集和测试集

(2)过拟合与欠拟合

(3)如何解决过拟合和欠拟合问题

(4)提前stop training

5、数据预处理部分

归一化(Normalization)与标准化(Standardization)

数据缺失

 图像处理(计算机视觉)

6、RNN循环神经网络

LSTM算法

7、CNN卷积神经网络 

8、使用Tensorflow1.0/2.0框架创建神经网络


1、激活函数

(1)什么是激活函数:

神经网络有单一的神经元接收上一层神经元的输出作为本神经元的输入,即一种在神经元上运行的函数,把神经元的输入映射到输出端。

单神经元
图1 单神经元

 如图1(单输入单输出神经元)所示,p为输入,w为权重,b为偏置,若引入激活函数f,则相应的输出为a=f(wp+b),但若无激活函数,相应的输出a'=wp+b。其实也就是说,

y(x) = \left\{\begin{matrix} f(x)& & ,ifactivation function is f\\ x& & ,else \end{matrix}\right.

它的作用是引入非线性性质,使得神经网络能够学习和逼近更复杂的函数。在实际生活中,无论如何搭建神经网络,输出都是对于输入的线性模型叠加。因此引入非线性因素后使得神经网络可以逼近任意非线性函数,使得神经网络可以应用到大量的非线性模型中。

(2)常见激活函数:

tanh、relu、sigmoid、relkyrelu激活函数,各个激活函数的图像在Tesorflow多层感知器实现广告的预测-CSDN博客

中有详细介绍,其中softmax是一个特殊的整流函数。下面要与线性回归与逻辑回归联合在一起。

图2 softmax激活函数

 由分类问题可以引出二分类以及多分类问题,对于大多的二分类问题,仅需要在预测结果回复True or False,但对于多分类问题,需要使用softmax激活函数为每一个类别分别设置一个概率,这样便可以计算出每一个类别占总体的百分比。但仅这样是考虑不全面的,当输入存在有负数时,单靠上面那种方法显然是不可行的,故有引入指数函数e^{x_{i}},以保证最后每个单元输出的概率在范围(0,1),输出之和为1。

Softmax函数的特点包括:
(1)将输入映射到0和1之间:Softmax函数确保每个类别的概率在0和1之间,因此可以用来表示每个类别的相对权重。
(2)归一化:Softmax函数对原始分数进行归一化,使所有类别的概率之和为1,这使得它适用于多类别互斥的分类问题。
(3)放大差异:Softmax函数会放大具有更高原始分数的类别的概率,因此可以更好地区分不同类别的可能性。

2、线性回归与逻辑回归任务

回归分析是处理多变量间相关关系的一种数学方法,当自变量为非随机变量而因变量为随机变量时,它们的关系分析成为 回归分析。回归分析又可分为线性回归与逻辑回归。

什么是分类任务,什么是回归任务?

线性回归主要功能是拟合数据,就是将输入项分别乘以一些常量(constant),将他们的结果求和即为输出,线性回归可以分为一元线性回归与多元线性回归。

线性回归易理解且快,但对于一些相对复杂的模型(比如非线性关系或样本属性的维度过大时),预测结果不好。

  • 一元线性回归:Y=ax+b,其中,x为自变量,a为相关系数,b为截距,Y则为因变量。
  • 多元线性回归(多自变量单因变量):Y=a_{1}X_{1}+a_{2}X_{2}+...+a_{n}X_{n}+b,其中,a_{1},a_{2},...,a_{n}为回归系数,b为截距。

本人线性回归案例:Tensorflow练手机器学习原理--线性回归-CSDN博客

逻辑回归主要功能是区分数据,找到决策边界。

逻辑回归实际上是一种分类方法。

本人逻辑回归案例:Tensorflow之逻辑回归与交叉熵-CSDN博客

图2

3、梯度优化算法

损失函数(Loss function):☞单个样本预测结果和正确结果的误差值。

代价函数(Cost function):☞所有样本损失函数的总和,用来衡量评估模型的好坏,一般情况下它的值越小则模型越好。

(1)梯度下降(Gradient descent,简称GD)

对于线性关系y = w*x + b,而言,需要找到最优的w^{*}b^{*},使得训练的误差(损失Loss)最小,对于计算机而言,可以借助强大的计算能力去多次搜索和试错,使得误差逐渐减小,最简单的优化方法就是暴力搜索和随机试验,但当面对大规模和高维度数据时效率极低,下面介绍一下梯度下降算法。

将梯度下降算法配合强大的图形处理芯片GPU的并行加速能力非常适合优化海量数据的神经网络模型。

函数的梯度指的是函数对各个自变量的偏导数组成的向量(多元微分),梯度的方向是函数值变化最快的方向。

在建立好模型后,会有相关的损失函数,比如均方差损失函数或交叉熵损失函数等。分别对于每一个参数\theta,求出损失函数关于其的梯度,然后朝着梯度相反的方向使得函数值下降的最快,反复求解梯度,最后就能到达局部最小值。

  • 在单变量函数中,梯度其实就是函数的微分,代表函数在给定的某一个点的切线的斜率。
  • 在多变量函数中,梯度为多元微分组成的向量,代表一个方向,梯度的方向就指明了函数在给定点上升最快的方向。

梯度下降更新公式:\theta =\theta -\alpha \frac{\partial J(\theta )}{\partial x},这里的\theta包含网络参数w和b(weight,bias)。

梯度上升更新公式:\theta =\theta +\alpha \frac{\partial J(\theta )}{\partial x},需要找最大时用梯度上升。

在下面举一个多变量函数的梯度下降过程,目标函数为J(\theta )={\theta _{1}}^{2}+{\theta _{2}}^{2},最小值对应为(0,0),假设初始起点为(1,2),(初始起点就相当于网络参数初始化部分,有很多种方法:random初始化,Xavier初始化,He初始化等,选择合理的初始化方法有利于更好的处理网络梯度问题,提高网络性能),初始学习率\alpha=0.1,则函数的梯度为\bigtriangledown J(\theta )=(2\theta _{1}+2\theta _{2}),多次Iterate,

\theta ^{0}=(1,2)

 \theta ^{1}=\theta ^{0}-\alpha \bigtriangledown J(\theta )=(1,2)-0.1*(2,4)=(0.8,1.6)

 \theta ^{2}=\theta ^{1}-\alpha \bigtriangledown J(\theta )=(0.8,1.6)-0.1*(1.6,3.2)=(0.64,1.28) 

...... 

就这样不断减小,向最小值(0,0)不断逼近,结束。

(2)梯度消失以及梯度爆炸

梯度消失:神经⽹络靠输⼊端的⽹络层的系数逐渐不再随着训练⽽变化,或者变化⾮常缓慢。随着⽹络层数增加,这个现象越发明显。

解决方案:

  • 使用更稳定的激活函数:ReLU、Leaky ReLU 或 ELU 激活函数通常比 Sigmoid 和 Tanh 更不容易出现梯度消失问题;
  • 使用 Batch Normalization:Batch Normalization 可以加速神经网络的收敛,并且减少梯度消失问题。
  • 使用残差连接(Residual Connections):ResNet 中的残差连接可以帮助信息在网络中更快地传播,减轻梯度消失问题。

梯度爆炸:梯度爆炸是深度神经网络训练过程中的一种现象,指的是在反向传播过程中,梯度值因为多次相乘而急剧增大,导致梯度变得非常巨大甚至溢出。这会造成参数更新过大,导致模型无法收敛或产生不稳定的训练结果。

解决方案:

  • 梯度截断(Gradient Clipping):限制梯度的大小,防止梯度爆炸。
  • 初始化权重:使用适当的权重初始化方法,如Xavier初始化,可以帮助减少梯度爆炸的发生。
  • 调整学习率:适当调整学习率的大小,可能有助于避免梯度爆炸。
(3)学习率(learning rate,简称lr)

学习率代表在一次迭代过程中梯度向损失函数的最优解移动的步长,通常用\alpha表示,它的大小决定网络学习的快慢。

  • 当学习率过大时,网络参数学习会很快,进而加快收敛速度,但有可能会在最优解附近来回震荡导致最后难以收敛,如图3中的红色箭头所示。
  • 当学习率过小时,网络参数学习会很慢,这样虽然不会错过最优解,但也容易陷入局部最优。

因此,选择一个合适的学习率,对于网络参数的学习至关重要,合适的学习率可以使网络参数以适当的速度逼近全局最优解(如图3黄色箭头)。但学习率一般是需要观察训练过程的各个参数的性能,(不能仅靠损失函数来判定,需要多方面评估)。学习率一般为0.1,0.001,0.0001这样找到一个区间,然后在区间内可以采用二分法逐步判断找到适合的学习率。但如果最后损失收敛在一个较大的范围,可以考虑使用便学习率,这样让损失最后收敛在一个较小的范围。

图3

4、拟合问题

模型的容量是指模型拟合复杂函数的能力。

(1)训练集和测试集

训练集(Train set):是用于模型拟合的数据样本。

验证集(Development set):是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。一般地,通过验证集寻找最优的网络深度(隐藏层个数)以及网络的宽度(每层的神经元个数)。由原本的训练集数据划分而来,用于调参和选择模型。

在这里,超参数可以有很多,主要包括一些在训练过程中不会发生变化的参数,比如学习率(采用定学习率时),经验回放缓存大小,小批量训练大小等。

测试集(Test set):用来评估模型最终的泛化能力。

图3 模型表现
(2)过拟合与欠拟合
  • 过拟合是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。在这种情况下,模型会在训练集上表现良好,在测试集(未见的数据集)上表现不太好。
  • 欠拟合是指模型描述能力太弱,以至于不能很好地学习到数据中的规律。产生欠拟合的原因通常是模型过于简单。在这种情况下,模型在训练集和测试集表现都不会太好。
(3)如何解决过拟合和欠拟合问题

以及什么是droupout,如何解决过拟合问题?

解决过拟合问题(通过降低网络容量):

  • 重新设计网络容量:降低网络深度或减小网络宽度。
  • 增加训练数据样本,或者是说为数据集扩增,比如在强化学习中网络参数引入随机噪声(加入Noisy Net,名义上称为噪声,实际可以对action产生与\epsilon -greedy差不多的效果)再训练,或者是对原始图像做部分截取或旋转角度等。
  • Dropout:Dropout是通过改动神经网络本身实现的,在训练时随机断开神经网络的连接,减少每次模型在训练时实际参与计算的参数量,但在测试时,为保证模型获得较好的性能Dropout会恢复所有的连接部分,如图4所示。
图4
  • 添加正则化手段(L0,L1,L2)
  • 提前停止训练。

解决欠拟合问题:可以通过增加网络容量(增加网络深度以及网络宽度),尝试更加复杂的网络结构。

(4)提前stop training

一般地,把对训练集中的一个Batch运算称作为一个step,对训练集的所有样本循环迭代一次称为一个Epoch。

当模型正常拟合的情况下,模型的各个参数会趋向收敛的状态,损失不再降低,这时如果不及时停止训练模型,就会导致模型过度学习训练的数据集,不仅学习到了数据集的特征,还把额外的观测误差也学习到,极大的降低泛化能力。

# 带有Early stopping的网络训练算法
Output:the performence of the network parameter seta and test
Random initialize the parameter seta
Initialize the size of mini-banch and experience replay buffer |D|
repeat
    for step=1,2,...,N do
        Random sample Batch{(x,y)}~D
        Update seta with gradient descent algorithm
    end
    if every the n-th Epoch do
        Test the performence of all {(x,y)}~D
        if Multiple failures to improve performance during validation do
            Save the state of the network,early stopping
        end if
    end if
until Training to the maximum number of Epoch

5、数据预处理部分

特征选择、特征提取、特征工程

特征选择:从原始数据中选择最相关和最有价值的特征,从而提高模型的性能和准确性,同时减少模型的复杂度和计算资源消耗。就是为了消除一些冗余和目标无关的特征,保留对预测目标有用的特征,进而提高模型的泛化能力和效率。

使用的方法:

特征提取:将原始数据转换为具有更高维度或更有意义的特征表示的过程,旨在提高模型的学习效果。

特征工程:通过对数据进行处理和转换,提取出更有用的特征以供机器学习模型使用,从而改善模型的性能和效果,有利于减少数据噪声,提高模型的泛化能力。

为什么要建立特征工程?

  • 归一化(Normalization)与标准化(Standardization)

归一化与标准化都是对数据做变换的方式,对数据特征缩放到某一个范围,把原始数据的某一列数据转换到某一个范围或者某种形态。

归一化:将某一列中的数据缩放到某一个区间范围内,通常这个区间可以为[0,1],[-1,1]等,可以根据实际需要设定,归一化可以有很多种形式,如:

min-max normalization:f(x)=\frac{x-min(x)}{max(x)-min(x)},[0,1]区间

mean normalization:f(x)=\frac{x-mean(x)}{max(x)-min(x)},[-1,1]区间

标准化:将数据变换为均值为0且标准差为1的分布,此分布会追随原本数据的分布状态,因此,经标准化后数据的分布不一定是正态分布的。

standardization:\frac{X_{i}-\mu }{\sigma }

中心化:零均值处理,就是用原始数据减去这些数据的均值后的值。

批归一化(Batch Normalization):可以对每一批(batch)数据进行归一化,传统的归一化操作一般都是在输入网络之前对特征进行归一化,但是BN可以在网络的任意一层进行归一化处理。

  • 数据缺失

数据缺失可由机械错误(机械原因导致的数据集中缺失数据)和人为错误(由人的主观因素:漏录,无效数据等)导致。若有数据缺失,则要么删除有缺失项的数据整体,要么是对数据缺失的数据项做一些处理,再就是对其置之不理。

缺失值从缺失的分布来讲可以分为完全随机缺失(数据的缺失是随机的,数据的缺失不依赖任何不完全变量或完全变量),随机缺失(数据缺失不是完全随机的,依赖于其他完全变量)和非完全随机缺失(数据缺失依赖于不完全变量本身)。

缺失值从缺失属性来讲,若所有缺失值都为同一属性(同一列)则为单值缺失,若为不同的属性,则为任意缺失

1、删除包含缺失项的数据整体,主要包含简单删除发和权重法。

  • 简单删除:将存在缺失值的个案删除,当缺失值为非完全随机时,可通过对完整数据加权来减小偏差
  • 用可能值插补缺失值:

  •  图像处理(计算机视觉)

图像透视变化☞改变图像的透视效果,使得原本在三维空间中呈现的透视关系在二维图像中得到修正或变换。透视变换通常用于校正图像中的透视畸变,例如将斜视角拍摄的图像调整为正视角,或者将图像中的某些区域拉伸或压缩以改变其形状。

图像去噪/降噪☞在数字图像中减少或去除由于图像采集、传输或处理过程中引入的噪声的过程。噪声可以是由传感器、电路、环境等因素引起的随机干扰,降噪技术旨在提高图像的质量和清晰度,以便更好地进行后续的图像分析、处理或展示。

图像配准☞将多幅图像中的对应特征点或区域进行匹配和对齐的过程,以使它们在同一坐标系下对齐或校准。这个过程通常涉及到图像中的旋转、平移、缩放和畸变等变换,旨在消除图像间的空间差异,以便进行后续的分析或处理。

图像分割☞将数字图像划分为多个具有独特特征或语义的区域或像素的过程。这些区域通常代表了图像中的不同对象、结构或区域。

数据清洗☞对数据进行检查、修复、删除或补充,以确保数据质量符合特定标准或要求的过程。这包括识别和纠正数据中的错误、缺失、重复或不一致的部分,以便在进行数据分析、建模或应用程序开发时能够得到准确、可靠的结果。

目标检测☞在图像或视频中自动识别和定位特定对象的过程,目标检测不仅要确定图像中是否存在目标,还要准确地标出目标的位置。

6、RNN循环神经网络

RNN中包含的模型目前主要有LSTM和GRU,下面简单介绍一下LSTM算法。

RNN与传统全连接网络不同,引入新的名词隐状态h_{t}(hidden state),隐状态可以对序列行的数据提取特征,再转换为输出。 

h_{t}=f_{\theta }(h_{t-1},x_{t})=f(Ux_{t}+Wh_{t-1}+b)

其中,h_{t-1}和 x_{t}经过上述变换后,得到当前时间戳的新的状态向量h_{t}并写入内存状态中,然后对应在每个时间戳上均有输出y_{t}产生,y_{t}=g_{\phi }(h_{t})。上述网路结构在时间戳上重叠,网络循环接受序列的每个特征向量x_{t},并刷新内部状态向量ht,同时形成输出yt。f一般为非线性激活函数,且尤为重点的就是在RNN中计算时,每一个时间戳计算时所用到的参数U,W,b都是一样的,即经典RNN的参数是共享的(RNN的权值是在同一个向量中,只是时间戳t不同而已)

h_{1}=f(Ux_{1}+Wh_{0}+b) 

h_{2}=f(Ux_{2}+Wh_{0}+b) 

... 

其中,在任意时间戳t,x_{t}对应为当前时间戳的输入,h_{t-1}对应为上一个时间戳的网络状态向量,

图4 不带有输出

 对于输出y_{t}=g_{\phi }(h_{t}),可以通过自己设定,可以让当前时刻t的状态向量直接作为输出(什么处理也不做),即y_{t}=h_{t};可以对h_{t}做一个线性变换,即输出y_{t}=W_{t}h_{t};也可以对h_{t}做一个非线性处理,比如在其外面再加入激活函数,sigmoid,relu,softmax等变换,即输出y_{t}=f(h_{t})。这里要注意,对状态向量h_{t}做处理时,也要遵守权值共享原则。

图5 带有输出

RNN的堆叠形式如图6左边所示,展开则由图6中的右边所示,RNN可以看成是一个神经网络的多次复制,每一个神经网络模块A会把消息依次传递给下一个模块。

图6 

解释一下RNN的短期和长期依赖问题:

以自然语言处理为例,当RNN在处理较简单的句子预测时,前面的信息和预测的词间距很小时,那么,RNN会学会使用先前的信息,较好的表现。但是当在一些复杂的场景时,在预测“I grow up in China ... and I like China”这段文本的最后一个词China时,可能会知道当前需要填写一个语言类型,但是需要离当前位置较远的先前提到的“China”的前后文的。经研究人员发现,RNN仅能理解有线长度范围内的信息,对于较长范围内的有用信息往往不能很好地利用起来,即会丧失学习连接到如此远的信息的能力,称为短时记忆

故经研究人员研究,发现记忆能力更强,一种更擅长处理较长的序列信号的数据,LSTM(Long Short-Term Memory),下面将介绍LSTM算法。 

  • LSTM算法

下面讲述一下LSTM算法,相对于基础的RNN网络只有一个状态向量h_{t},LSTM新增了一个状态向量C_{t},同时引入门控(Gate)机制,通过门控单元来控制信息的遗忘和刷新。

所有的RNN网络,都是一种具有重复神经网络的链式的结构,在标准的RNN网络中,这个重复的模块(神经网络)只有一个简单的结构,例如一个tanh或sigmoid层,tanh使得数据范围控制在[-1,1]之间,有利于帮助调节流经神经网络的之值。但对于LSTM网络,重复的模块有一个不同的结构,LSTM中重复的模块一般包含有四个交互的层,3个sigmoid和一个tanh层,使用sigmoid的原因主要是因为其取值范围在[0,1],有利于较好的选取数据记忆(更新或遗忘,x*0=0,x*1=x)。

图7 LSTM

 在这里,如图8,讲一下各个符号代表的含义,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。圆圈代表pointwise的操作,诸如向量的和或向量的乘(看圈中是什么符号),而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

图8 symbol

在这里,由于LSTM由遗忘门、输入门和输出门组成,下面简单叙述一下各部分的用处,就能看懂各个部分的过程,如图 9,

遗忘门:通过读取h_{t-1}x_{t}做一个sigmoid(等同于图9中的\sigma)的非线性映射,输出一个向量f_{t},向量中的不同维度上的值有不同的意义(1完全保留,0忘记/丢失)。

输入门:会决定什么样的信息被存放在细胞状态中,sigmoid决定什么值将要被更新,tanh层创建了一个新的候选值向量Ct,被加入到状态中。

输出门:

图9 process

7、CNN卷积神经网络 

首先,阐述一下为什么要有卷积神经网络CNN,CNN相比于全连接神经网络的好处有哪些?

  • 局部相关性:以图片类型数据为输入的场景为例,对于二维图片数据在传入全连接层之前(fully-connected layer),需将矩阵打平成为一维向量,然后每个像素点与每个输出节点两两相连,其输出与输入的关系为(nodes(I)表示第I层的节点集合):

o_{j}=\sigma (\sum_{i\epsilon nodes(I)}^{}w_{ij}x_{i}+b_{j})

 下面,找一种近似的简化模型,可以分析输入节点对输出节点的重要性分布,仅考虑较重要的一部分输入节点,这样输出节点只需要与部分输入节点相连接,表达为:

o_{j}=\sigma (\sum_{i\epsilon top(I,j,k)}^{}w_{ij}x_{i}+b_{j})

其中top(I,j,k)表示第I层中对于J层中的j号节点重要性最高的前n个节点集合,通过这种方式,可以把权值个数由|| I ||*|| J || 减少到k*|| J ||,其中 || I ||和|| J ||分别表示I、J层的节点数量。

接着问题转化为探索第I层中对于第J层中的j号输出节点重要分布,然后认为图片每个像素点和周边像素点的关联度更大(位置相关)。以二维图片数据为例,简单认为像素的欧氏距离小于等于x的像素点重要性较高,大于x的像素点重要性较低,这种仅关注和自己距离较近的部分节点而忽略距离较远的节点称为局部相关性

  • 权值共享:每个输出节点仅与感受野区域内k*k个输入节点相连接,输出节点数为|| J ||,则当前层参数量为k*k*|| J ||,通过权值共享的思路,对于每个输出节点o_{j},均使用相同的权值矩阵W,那么无论输出节点数量|| J ||为多少,网络参数量总是k*k。准确的说,在但单入通道、单卷积核的条件下,参数量由|| I ||*|| J ||成功减低到k*k。

CNN由输入层、卷积层、池化层、全连接层以及输出层组成。

  • 输入层:输入图像等信息。
  • 卷积层:用来提取图像的底层特征。
  • 池化层/降采样:防止过拟合,将数据维度减小。
  • 全连接层:汇总卷积层和池化层得到的图像的底层特征和信息。
  • 输出层:根据全连接层的信息得到概率最大的结果。
图10

输入层:就是把相对应的图像转换为与其对应的由像素构成的二维矩阵,并将次二维矩阵存储起来等待后面操作。

卷积层:可以包含有多个可学习的滤波器(也称为卷积核),在输入数据上滑动,进行卷积操作进而生成特征图(图像领域中通常为新生成的二维矩阵),且每个卷积核只能完成某种逻辑的特征提取,当需要有多种逻辑特征提取时,可以选择增加多个卷积核得到多种特征。

图11

以图片的二维矩阵为例,想要提取其中特征,那么卷积操作就会为存在特征的区域确定一个高值,否则确定一个低值。

卷积核也是一个二维矩阵,当然这个二维矩阵要比输入图像的二维矩阵要小或相等,卷积核通过在输入图像的二维矩阵上不停的移动,每一次移动(按照从左到右,移动到右边边界后回到行首,接着从上到下的顺序移动,一直移动到原始图片数据的右下方)都进行一次乘积的求和,作为此位置的值。

图12

 中间的核函数就是卷积核,左边红色方框内的四个元素称为感受野,与卷积核的大小相同,那么是如何得到特征图的呢?卷积核与感受野之间的运算就是把两个矩阵对应的元素相乘得到的矩阵各元素求和填到特征图的对应位置上。卷积核为2*2,感受野也为2*2(每次移动的步长为2),故在计算特征图的时候s1 = a*k1+b*k2+e*k3+f*k4,s2=c*k1+d*k2+g*k3+h*k4,s3=i*k1+j*k2+m*k3+n*k4,s4=k*k1+l*k2+o*k3+p*k4,且s2填写在s1的右边,最后特征图为[[s1,s2],[s3,s4]]。

下面讲解一下为什么要填充(Padding):

由于卷积核在计算特征图时,需要与原本的图像数据中截取感受野大小的窗口进行计算,随着每次移动一定的步长,会发现靠近中间的图片像素数据会被计算多次,但靠近边框的图片像素点数据被计算的次数会少很多,因此选择在原始数据的外围扩展一些空格,这样原本边框的数据也会被计算多次。

图13

池化层:减小特征图的空间维度,从而减少模型的参数量和计算复杂度,并且可以增强模型的鲁棒性.

有几个卷积核就有多少个特征图,现实中情况肯定更为复杂,也就会有更多的卷积核,那么就会有更多的特征图。池化层又称为下采样/降采样,也就是说,当我们进行卷积操作后,再将得到的特征图进行特征提取,将其中最具有代表性的特征提取出来(保持主要特征并减少冗余信息来提取出更加重要的特征),可以起到减小过拟合和降低维度的作用,这个过程如下所示:

图14

另外,池化可以分为最大池化和平均池化。 

最大池化就是每次取正方形中所有值的最大值,这个最大值也就相当于当前位置最具有代表性的特征,如图13所示,最大池化用的稍微多点。

平均池化就是取此正方形区域中所有值的平均值,考虑到每个位置的值对于此处特征的影响。

全连接层: 对运算得到的特征图展平,将其维度变为1*x,然后进行计算,得到输出值。

全连接层将卷积层和池化层提取到的特征连接起来,并输出最终的分类或回归结果。它采用传统神经网络中常见的全连接结构,每个神经元都与上一层的所有神经元相连。全连接层的作用是对特征进行组合和整合,以便进行最终的预测。

图15

输出层:输出最后的预测结果,如图14所示,二分类用sigmoid,多分类用softmax。

import tensorflow as tf
from tensorflow.keras import layers

# 构建CNN模型
model = tf.keras.Sequential()

# 添加卷积层
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(layers.MaxPooling2D((2, 2)))

# 添加更多卷积层和池化层
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

# 将特征图展平为一维向量
model.add(layers.Flatten())

# 添加全连接层
model.add(layers.Dense(64, activation='relu'))

# 输出层
model.add(layers.Dense(10, activation='softmax'))

# 编译模型
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

# 加载数据并训练模型
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))

8、使用Tensorflow1.0/2.0框架创建神经网络

  • Tensorflow1.0代码:注意,1.0版本的对应x,y只是占位符,张量形状此时已经有,值是在下面对话session中传入的。
import tensorflow as tf

# 定义神经网络的输入
x = tf.placeholder(tf.float32, [None, 784])

# 定义神经网络的参数
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# 定义神经网络的输出
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 定义损失函数
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

# 定义优化方法
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

# 创建会话并进行训练
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})


  • Tensorflow2.0代码
import tensorflow as tf

# 加载数据,数据预处理部分
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# 定义神经网络的模型
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])


# 训练模型
model.fit(x_train, y_train, epochs=5)

# 评估模型
model.evaluate(x_test,  y_test, verbose=2)

Reference

 [1]《Tensorflow深度学习》书籍

 [2] 《Netural Network Design》书籍

 [3]激活函数(Activation Function)小结_有一个机器学习常用的激活函数activation function,当输入<0-CSDN博客

 [4]学习率设置-CSDN博客

 [5]回归分析(线性回归、逻辑回归)详解与 Python 实现_多变量逻辑回归分析-CSDN博客

 [6]梯度下降算法原理讲解——机器学习-CSDN博客

 [7]标准化和归一化,请勿混为一谈,透彻理解数据变换-CSDN博客

 [8]如何从RNN起步,一步一步通俗理解LSTM_rnn lstm-CSDN博客

 [9]卷积神经网络CNN的由来,为什么要用卷积?_卷积神经网络为什么叫卷积-CSDN博客

 [10]卷积神经网络(CNN)详细介绍及其原理详解-CSDN博客

 [11]卷积神经网络 Convolutional Neural Network | CNN-CSDN博客

 [12]卷积神经网络(Convolutional Neural Network,CNN)

 [13]https://zhuanlan.zhihu.com/p/589762877

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1801513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript函数详解】Day04

JavaScript函数详解 JavaScript 基础 - 第4天笔记函数声明和调用声明&#xff08;定义&#xff09;调用 参数形参和实参参数默认值 返回值函数补充细节作用域全局作用域局部作用域变量的访问原则 匿名函数函数表达式立即执行函数 逻辑中断小知识&#xff08;转换为Boolean型&am…

WPF视频学习-基础知识篇

1.简介WPF&#xff1a; C# 一套关于windows界面应用开发框架 2.WPF和winform的差别 &#xff0c;(WPF比较新) 创建新项目使用模板&#xff1a; WPF使用.xaml后缀&#xff0c;双击可查看操作界面和设置代码&#xff0c;其文件展开之后中有MainWindow.xaml.cs为程序交互逻辑。…

Vitis HLS 学习笔记--初始化与复位

目录 1. 简介 2. 控制初始化与复位 2.1 初始化 2.2 复位 2.3 全局复位选项 2.4 复位排除 3. 阵列初始化和复位 3.1 不使用 static 限定符 3.2 使用 static 限定符 3.3 BRAM 和 URAM 4. 总结 1. 简介 本文对比分析两个方面的初始化和复位&#xff1a;阵列和控制&…

如何检测UV胶的均匀性?

如何检测UV胶的均匀性&#xff1f; 检测UV胶的均匀性可以通过以下几种方法来实现&#xff1a; 肉眼目视检查&#xff1a; 这是最简单直接的方法。将UV胶涂在表面上&#xff0c;使用裸眼观察胶层的表面。特别注意是否存在气泡、颜色不均匀、裂纹或其他明显的不均匀性。如凹凸不…

选择排序(直接选择排序与堆排序)----数据结构-排序②

1、选择排序 1.1 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完就停止 。 1.2 直接选择排序 排序思想&#xff1a; ①在元素集合array[i]--array[n-1]中选择…

FM148A,FM146B运行备件

FM148A,FM146B运行备件。电源保险丝仓主控底座的保险丝仓示意图底座上共有两个保险丝&#xff08;800mA&#xff09;&#xff0c;FM148A,FM146B运行备件。&#xff08;10&#xff5e;73&#xff09;30/195主控单元2.K-CUT014槽底座地址接口主控站地址拨开关从上到下为二进制数的…

Day46 代码随想录打卡|二叉树篇---从中序与后序遍历序列构造二叉树

题目&#xff08;leecode T106&#xff09;&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 方法&#xff1a;本题要通过中序遍历和后…

Windows无法安装到这个硬盘空间。选定的分区上启用了BitLocker驱动器加密。请在控制面板中暂停(也称为禁用)BitLocker,然后重新开始安装。

我们安装操作系统的时候&#xff0c;到了选择安装分区的地方&#xff0c;我们选中的分区提示“无法在驱动器的分区上安装Windows”&#xff0c;然后我们点击显示详细信息&#xff0c;提示如图下所示 分析原因&#xff0c;可能是之前的分区未进行格式化。但是这个时候我们无法格…

基于51单片机水塔水位控制系统

基于51单片机水塔水位控制 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用滑动变阻器模拟水位&#xff0c;ADC0809将模拟信号转换为数字信号&#xff1b; 2.LCD1602显示当前水位和水位阈值&#xff1b; 3.当水位超过设定阈值&#xff…

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件&#xff0c;pc13设置为输出模式 然后按照这样配置&#xff0c;user label 设置成这个IO口代…

Go微服务: 关于消息队列的选择和分类以及使用场景

消息队列概述 在分布式系统和微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是一个核心组件&#xff0c;用于在不同的应用程序或服务之间异步传递消息在 Go 语言中&#xff0c;有多种实现消息队列的方式&#xff0c;包括使用开源的消息队列服务&…

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具&#xff0c;您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

附录二-nmap基本用法

参考 黑客工具—Nmap的使用_哔哩哔哩_bilibili nmap是扫描IP和端口的&#xff0c;相当于攻击前的索敌步骤。不止网络安全方面会用到&#xff0c;平时运维的时候也会用到nmap 1 下载nmap nmap官网 https://nmap.org/ 点击下载&#xff0c;然后点你用的平台就行了 往下滚可以…

[职场] 硬件研发是什么职业 #职场发展#其他

硬件研发是什么职业 硬件研发工程师需要具备丰富的电子电路知识、熟练掌握各种电子元器件的性能及应用、具备一定的机械结构设计能力&#xff0c;同时还要具备良好的团队协作和沟通能力。本文会进行详细介绍。 一、硬件研发是什么 硬件研发&#xff0c;全称硬件研发工程师&am…

一文搞懂Python的异常

人生之事,不如意者十之有九。 在编程中亦是如此。异常(Exception),遍布于程序各个角落,开发工作的大部分coding,都是为了应对和解决它。 概念 异常,简而言之,是程序在执行期间发生的非预期的、非正常的事件或情况。 举个实际生活的例子: 你周末出门买大龙虾,但当你…

Vue-App桌面程序列表

Vue-App桌面程序列表 文章说明讲解视频核心代码效果展示项目链接 文章说明 采用Vue实现PC端的桌面程序列表&#xff0c;采用HBuilderX将程序转化为5App&#xff0c;实现移动端的适配&#xff1b;支持桌面打开新应用&#xff0c;底部导航展示当前应用列表&#xff0c;可切换或关…

用你熟悉的语言就能开发智能合约,Vara Network 以 WASM 解锁未来应用创新

Vara Network 自推出以来&#xff0c;凭借其基于 Gear Protocol 的独特架构和强大的开发工具&#xff0c;为开发者提供了一个高效、安全的智能合约构建平台。Vara Network 通过采用先进的 Actor 模型、持久内存概念和 WebAssembly 技术&#xff0c;实现了异步消息处理、并行计算…

在线OJ项目测试(selenium+Junit5)

目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一&#xff1a;检查未登录时的页面访问以及一些未登录时的非法操作 测试二&#xff1a;测试注册界面 测试三&#xff1a;测试登录界面 测试四&#xff1a;测试题目列表界面 测试五&#xff1a;测试题目详情界面…

Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。 挂起函数是 Kotlin 中的一个特性&#xff0c;用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数&#xff0c;避免了回调地狱问题&#xff0…

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码&#xff0c;直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…