深度学习修炼(二)全连接神经网络 | Softmax,交叉熵损失函数 优化AdaGrad,RMSProp等 对抗过拟合 全攻略

文章目录

  • 1 多层感知机(全连接神经网络)
    • 1.1 表示
    • 1.2 基本概念
    • 1.3 必要组成—激活函数
    • 1.4 网络结构设计
  • 2 损失函数
    • 2.1 SOFTMAX操作
    • 2.2 交叉熵损失函数
  • 3 优化
    • 3.1 求导计算过于复杂?
    • 3.2 链式法则导致的问题?
    • 3.3 梯度下降算法的改进
      • 3.3.1 动量法
      • 3.3.2 自适应梯度方法
        • 1 AdaGrad
        • 2 RMSProp
      • 3.3.1 Adam
  • 4.网络信息流通畅,提高训练效率
    • 4.1 权值初始化
      • Xavier初始化方法
      • He 初始化方法
    • 4.2 批归一化 Batch
  • 5 .对抗过拟合方法
    • 5.1 随机失活 Dropout
    • 5.2 数据增强
    • 5.3 正则化
    • 5.4 批归一化
  • 6 超参数优化方法
    • 6.1 网格搜索法
    • 6.2 随机搜索法

之前我们学习了线性分类器

深度学习修炼(一)线性分类器 | 权值理解、支撑向量机损失、梯度下降算法通俗理解_Qodi的博客-CSDN博客

全连接神经网络(又叫多层感知机)和我们的线性分类器区别

(1)线性分类器就只有一个线性变化

而全连接神经网络利用激活函数(非线性操作),级联多个变换

(2)线性分类器只能解决线性可分问题,而我们的全连接神经网络由于加入了非线性操作激活函数,可以解决线性不可分问题。

激活函数是神经网络中非常重要的组成部分,与此类似,人脑中的神经元也具有类似的激活功能。深度学习受启发于脑科学,他们有如下相似点相似点:

  1. 非线性:激活函数和人脑神经元都是非线性的。这是因为如果神经元都是线性的,则整个神经网络只能表示线性函数,无法应对复杂的非线性问题。
  2. 阈值:激活函数和人脑神经元都具有阈值。当输入值超过一定阈值时,神经元才会被激活,并产生输出。这种阈值的设置可以使神经网络更加适应不同类型的数据分布。

下面我们来详细看一下内容

1 多层感知机(全连接神经网络)

1.1 表示

多层感知器又叫做全连接神经网络

比如 两层全连接神经网络图像表示:

在这里插入图片描述

两层全连接网络 数学表达式:

f = W 2 m a x ( 0 , W 1 x + b 1 ) + b 2 f=W_2max(0,W_1x+b_1)+b_2 f=W2max(0,W1x+b1)+b2

1.2 基本概念

全连接神经网路的概念

输入层

​ 输入层是神经网络的第一层,它接收外部输入并将其转换为神经网络能够理解的形式。例如,对于图像识别的任务,输入层通常将图像像素作为输入。

隐层

​ 隐层是输入层和输出层之间的中间层,它的作用是将输入层传递来的信息进行加工处理,并将处理后的信息传递给输出层。隐层可以有一个或多个,每个隐层包含多个神经元。

输出层

​ 输出层是神经网络的最后一层,它接收隐层传递过来的信息,并将处理后的结果输出为最终的预测结果。例如,在图像识别任务中,输出层可以输出对应的物体类别。

全连接

某一层的每一个神经元要和前层的所有神经元相连,所以叫做全连接

f = W 2 m a x ( 0 , W 1 x + b 1 ) + b 2 f=W_2max(0,W_1x+b_1)+b_2 f=W2max(0,W1x+b1)+b2

层数

除了输入层以外 有几层就叫几层神经网络(包括所有隐层和输出层)

如上面图就是两层的神经网络

全连接神经网路由线性部分和非线性部分多层级联而成

1.3 必要组成—激活函数

我们说激活函数的作用就是非线性操作,那么常见的激活函数有哪些呢?

1 Sigmoid函数

1 1 + e − x \frac{1}{1+e^{-x}} 1+ex1

特点

  • 它的输出值在0和1之间
  • 不是中心对称的

2 tanh函数

e x − e − x e x + e − x \frac{e^x-e^{-x}}{e^x+e^{-x}} ex+exexex

双曲正切函数

  • 让数值变到-1和+1之间
  • 是中心对称的

以上两种函数都容易导致梯度消失问题(稍后讲到)

当代网络深度较深,梯度消失问题容易发生,所以更多采用如下函数

3 ReLU 函数

m a x ( 0 , x ) max(0,x) max(0,x)

ReLU函数在输入大于0时返回输入值,否则返回0。它的优势是计算速度快,不会有梯度消失问题;缺点是在输入小于0时,梯度为0,导致神经元无法更新。

4 leaky ReLU 函数

m a x ( a x , x ) max(ax,x) max(ax,x)

Leaky ReLU函数在输入小于0时返回一个非零值,可以解决ReLU函数的问题。

这些激活函数都有各自的优缺点

1.4 网络结构设计

综上我们学到的知识,我们实际的网络设计实际就是要自行解决如下两个问题

1、用不用隐藏,用一个或者几个隐层 (深度设计)

2、每个隐层设置多少个神经元比较合适 (宽度设计)

​ 神经元个数越多,分界面就越复杂,分类能力越强,但容易出现过拟合

2 损失函数

在线性分类器那一节里讲到模型会给不同类别分数,但是直接的分数不能代表分类概率,而且有时候会出现打负分的情况

分类概率总和必须为1

所以我们进行Softmax操作

2.1 SOFTMAX操作

而Softmax函数可以将每个神经元的输出值映射到0和1之间,并且所有输出的和等于1,可以表示每个分类的概率。

操作过程

得到一组分数f1,f2…fn

1 取指数

t i = e f i t_i=e^{f_i} ti=efi

2 归一化

p i = t i ∑ t p_i=\frac{t_i}{\sum{t}} pi=tti

假设我们有一个三分类问题,我们需要将神经网络的输出值转换成对应的分类概率。输出层有三个神经元,分别对应三个类别,输出值为:

[ 0.5 , 1.2 , − 0.3 ] [0.5, 1.2, -0.3] [0.5,1.2,0.3]

我们可以使用Softmax函数将每个神经元的输出值转换为对应的概率。首先,计算每个神经元的指数函数值:

[ e 0.5 , e 1.2 , e − 0.3 ] [e^{0.5}, e^{1.2}, e^{-0.3}] [e0.5,e1.2,e0.3]

然后,将指数函数值除以所有函数值的和,得到每个神经元对应的概率:

[ 0.244 , 0.665 , 0.091 ] [0.244, 0.665, 0.091] [0.244,0.665,0.091]

这意味着第一个类别的概率为0.244,第二个类别的概率为0.665,第三个类别的概率为0.091。可以看出,Softmax函数对每个神经元的输出值进行了归一化,并将它们转换为对应的概率,从而方便我们进行多分类问题的预测和训练。

在线性分类器那一节的损失函数——支撑向量能力比较的有限,今天介绍的交叉熵损失函数应用更广

交叉熵损失函数的基本思想是,用模型的输出概率分布与实际标签的分布之间的差异来衡量模型的损失程度,从而调整模型的参数。

2.2 交叉熵损失函数

在介绍交叉熵之前,需要先了解几个概念,其中p和q是两个不同的分布

假设存在两个概率分布 P,Q 注意下面的log是以e为底

H ( p ) = − ∑ x p ( x ) l o g p ( x ) H(p)=-\sum_xp(x)logp(x) H(p)=xp(x)logp(x)

熵是信息论中用于衡量随机变量不确定性的指标,它表示一个随机变量的平均信息量。熵越大,表示随机变量的不确定性越大,即信息量越大。例如 [ 0 , 0 , 1 ] [0 , 0 ,1] [0,0,1]这个分布没啥信息量,代入公式计算为0 因为他的不确定度很小

而对于分布[0.3,0.3.0.4]这个分布不确定性比较大,熵值就很大了

相对熵: K L ( p ∣ ∣ q ) = − ∑ x p ( x ) l o g q ( x ) p ( x ) KL(p||q)=-\sum_xp(x)log\frac{q(x)}{p(x)} KL(p∣∣q)=xp(x)logp(x)q(x)

相对熵,也叫KL散度用来度量两个分布的不相似性(这里不叫做距离,是因为距离的话P到q和q到p的距离应该是一样的)而这里的话有可能不一样

如果两个分布一样,则相对熵为0,如果两个分布差异越大,相对熵越大

比如分布P[0,0,1]为和分布Q为 [0.3,0.3,0.4] 的相对熵为0.39,说明他俩相差比较大

而分布P为[0,0,1]和分布Q为 [0,0.1,0.9]相对熵0.04.说明他俩相差较小

实际中用到更多的是交叉熵

交叉熵: H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q)=-\sum_xp(x)logq(x) H(p,q)=xp(x)logq(x)

因为三者存在这样一个关系

H ( p , q ) = H ( p ) + K L ( p ∣ ∣ q ) H(p,q)=H(p)+KL(p||q) H(p,q)=H(p)+KL(p∣∣q)

而如果P分布是标答,分布是独热码的形式,那么它的H§ 就等于0 ,这样的话

H ( p , q ) = K L ( p ∣ ∣ q ) H(p,q)=KL(p||q) H(p,q)=KL(p∣∣q)

我们就可以用交叉熵来代表相对熵了,计算更简单

计算交叉熵如下

1 ∗ l o g ( 0.21 ) + 0 ∗ l o g ( 0.01 ) + 0 ∗ l o g ( 0.78 ) = l o g ( 0.21 ) 1*log(0.21)+0*log(0.01)+0*log(0.78)=log(0.21) 1log(0.21)+0log(0.01)+0log(0.78)=log(0.21)

最后记得取负数 也就是 − l o g ( 0.21 ) -log(0.21) log(0.21)

我们发现为零的项完全不用计算

所以实际上 L i = − l o g ( q j ) L_i=-log(q_j) Li=log(qj) j为真实值类别

实际输出就是真实标签概率的负对数。

关于一些损失函数的比较,和交叉熵损失pytorch的代码具体实现,可以查看我之前的这篇博客

从原理到代码实践 | pytorch损失函数_Qodi的博客-CSDN博客

3 优化

3.1 求导计算过于复杂?

我们实际计算中,会发现原本的损失函数会十分复杂,因而我们该怎么办求导?方法就是采取计算图

利用计算图避免直接计算庞大的导数,将庞大的求导数化解为一个一个小的部分

计算图本质就是利用链式法则

计算图我也专门写了一篇博客,有代码的相关实现

pytorch的自动微分、计算图 | 代码解析_Qodi的博客-CSDN博客

3.2 链式法则导致的问题?

上述我们发现用计算图通过链式法则的方法可以很好得解决计算复杂的问题,但是我们发们发现这其中会有很多连乘,这样的情况下就可能会出现如下两个问题

梯度消失

本质是由于链式法则的乘法特性导致的

对于Sigmoid函数,tanh函数,由于导数很小,所以会导致反传的时候梯度消失,所以现在对于这种情况就是运用比较少了

Relu函数 ,对于大于0 的时候,梯度永远不会消失,而且计算很简单,所以应用比较多。但是对于小于零的情况不太好,

梯度爆炸

也是由链式法则导致的,某一点的梯度特别大

​ 解决方案 梯度裁剪

​ 梯度裁剪的基本思想是,设置一个梯度阈值clip_value,如果梯度的绝对值大于这个阈值,就将梯度进行缩放,使其绝对数等于阈值。

普通梯度下降算法可能会存在的问题

一个方向上变化迅速 而在另一个方向上变化缓慢!同时

  1. 依赖于学习率: 梯度下降算法的效果受到学习率的影响,如果学习率过大,会导致算法不收敛或者震荡;如果学习率过小,会导致算法收敛速度过慢。
  2. 可能会陷入局部最优解: 梯度下降算法的搜索方向只依赖于当前位置的梯度信息,因此可能会陷入局部最优解,无法找到全局最优解。

3.3 梯度下降算法的改进

3.3.1 动量法

动量法可以加快梯度下降的速度,同时也可以避免梯度下降过程中出现的震荡现象。

w w w代表参数 ϵ \epsilon ϵ学习率,反向回传计算梯度后得到梯度g

则传统梯度下降的参数更新表达式为:

传统梯度下降参数更新 $w=w-\epsilon g $

现在这个g变为动量v(t )

动量法参数更新$w=w-v(t) $

v(t)就是我们说的动量

(1)第一步要计算动量,需要用到前一时刻的动量

v ( t ) = u ∗ v ( t − 1 ) + g v(t)=u*v(t-1)+g v(t)=uv(t1)+g

u是一个超参数 动量系数 ,一般设为0.9

​ 如果设置为0 则退化为标准小批量梯度下降算法

​ 如果设置为1 ,即使g到了平坦区域依然停不下来

​ 而如果u小于1的话,在g到了接近0 的情况下,v由于u的存在就会不断减小,让他到达一个较低平坦点

​ 就好像摩擦系数一样,让他一点一点停下来。

v(t-1)是前一时刻的动量

具体来说,动量法在更新参数的过程中,不仅考虑当前的梯度,还考虑之前的梯度,从而使得更新方向更加稳定。

(2)然后v(t)代入梯度下降参数更新式

动量法还有什么效果?

避免到达局部最小点,鞍点停下来

举例:

假设我们要使用动量法来优化以下函数:

f ( x , y ) = x 2 + 2 y 2 f(x,y) = x^2 + 2y^2 f(x,y)=x2+2y2

我们希望求出使得函数f(x,y)最小的点。首先,我们通过梯度计算出当前点的梯度,然后根据动量法的公式来更新参数。假设学习率为0.1,动量系数为0.9,我们可以按照以下步骤进行迭代:

  1. 初始化参数x=1,y=1,初始动量 v x ( t − 1 ) = 0 , v y ( t − 1 ) = 0 v_x(t-1)=0,v_y(t-1)=0 vx(t1)=0vy(t1)=0
  2. 计算当前点的梯度g(x)=2x,g(y)=4y
  3. 根据动量法的公式来更新动量 v x ( t ) = 0.9 v x ( t − 1 ) + 2 x , v y ( t ) = 0.9 v y ( t − 1 ) + 4 y v_x(t)=0.9v_x(t-1)+ 2x,v_y(t)=0.9v_y(t-1)+ 4y vx(t)=0.9vx(t1)+2xvy(t)=0.9vy(t1)+4y
  4. 根据动量v(x)和v(y)来更新参数 x = x − 0.1 ∗ v x ( t ) , y = y − 0.1 ∗ v y ( t ) x=x-0.1*v_x(t),y=y-0.1*v_y(t) x=x0.1vx(t)y=y0.1vy(t)
  5. 重复第2-4步,直到收敛到最优点

3.3.2 自适应梯度方法

1 AdaGrad

和动量法思路不一样,分别改变学习率

1 区分哪个方向是震荡方向,哪个方向是平坦方向就可以了,在震荡方向减少步长,平坦方向增大步长

2 如何区分平坦还是震荡?

通过梯度幅度的平方较大的地方,梯度幅度平方较小的方向是平坦方向

w w w代表参数 ϵ \epsilon ϵ学习率,反向回传计算梯度后得到梯度g

则传统梯度下降的参数更新表达式为:

传统梯度下降参数更新 $w=w-\epsilon g $

动量法参数更新$w=w-v(t) $

而自适应的AdaGrad参数更新

w = w − ϵ r + δ g w=w-\frac{\epsilon}{\sqrt{r}+\delta}g w=wr +δϵg

其中 $ r=r+g*g$ 利用新得到的r来更新权值

当r 较小时 ϵ \epsilon ϵ 就会被放大 整体学习率变大

当r 较大时 ϵ \epsilon ϵ 就会被缩小 整体学习率变小

具体来说,Adagrad算法会对每一个参数维护一个历史梯度平方和的累加量,并将其用于调整学习率。在更新每一个参数时,Adagrad算法会根据历史梯度平方和对当前的梯度进行归一化,然后再乘以学习率。这样可以使得每个参数的学习率自适应地调整,更好地适应不同的数据集和模型。

根号r旁边加了一个小常数,避免除零

缺陷 r会不断累积 会让r变得很大,这时候就会导致无法起到调节作用

基于这个缺陷的改进算法RMSProp

2 RMSProp

上面讲到 自适应的AdaGrad参数更新

w = w − ϵ r + δ g w=w-\frac{\epsilon}{\sqrt{r}+\delta}g w=wr +δϵg

其中 $ r=r+g*g$

而对于自适应RMSProp参数更新

w = w − ϵ r + δ g w=w-\frac{\epsilon}{\sqrt{r}+\delta}g w=wr +δϵg

其中$ r=\rho r+(1-\rho)g*g$

加上一个衰减项,解决了上面的缺陷

具体是,当r变得较大的时候,后面部分就不起作用了

使得 r = ρ r r=\rho r r=ρr 由于 ρ < 0 \rho<0 ρ<0 所以r就会减小 不会无限制变大

3.3.1 Adam

同时使用动量和自适应梯度的方法

在这里插入图片描述

这里加了一个修正偏差 可以 极大减缓算法初期的冷启动问题

最开始启动的时候 梯度很小,更新很慢,所以要修正偏差

4.网络信息流通畅,提高训练效率

为了使得训练正常进行

要正向反向信息流传递通畅,为此有一些技巧

4.1 权值初始化

初始化作用

  1. 避免梯度消失和梯度爆炸:在神经网络中,参数的初始化会影响到反向传播计算中梯度的大小,过小或过大的参数都会导致梯度消失或梯度爆炸的问题。通过合理的参数初始化,可以使得梯度的大小更加合适,防止出现梯度消失或梯度爆炸的情况,从而提高模型的稳定性和收敛速度。
  2. 加快网络收敛速度:合理的参数初始化可以使得神经网络在训练初期更快地收敛,从而提高模型的训练速度和效率。例如,我们可以使用Xavier初始化、He初始化等方法来初始化参数,从而提高模型的收敛速度。
  3. 提高模型泛化能力:合理的参数初始化可以使得神经网络更好地适应新的样本,从而提高模型的泛化能力。例如,对于卷积神经网络和循环神经网络,我们可以使用不同的参数初始化方法来提高模型的泛化能力和性能。

有效的初始化方法

正向信息流顺利,反向梯度流也顺利

Xavier初始化方法

Xavier初始化的主要思想是根据输入和输出神经元的数量来设置每个权重的初始值,使得这些权重的方差保持不变。

权值采样自N(0,1/N)的高斯分布

适合双曲正切和Sigmoid函数

但是不适合ReLu激活函数

ReLu函数适合下面的方法

He 初始化方法

权值采样自N(0,2/N)的高斯分布

当ReLU函数和Leakly ReLU函数方法

4.2 批归一化 Batch

调整权值分布使得输出与输入具有相同的分布

减去小批量均值除以小批量方差再输出

计算小批量均值

计算小批量方差

批归一化操作 在非线性激活之前,全连接层后

避免梯度消失

5 .对抗过拟合方法

5.1 随机失活 Dropout

随机使得某一层的神经元失活

为什么可以达到效果

  • 解释一: 参数量减少
  • 解释二: 鼓励权重分散
  • 解释三: 可以看做模型集成

5.2 数据增强

过合理地对原始数据进行变换,增加训练集的样本数量,从而减少模型的过拟合风险。例如,对图像数据进行旋转、翻转、缩放等操作,对文本数据进行随机切割、替换等操作。

5.3 正则化

正则化是一种常用的缓解过拟合的方法,它通过在损失函数中增加正则项来惩罚模型的复杂度,从而减小模型的过拟合风险。常用的正则化方法包括L1正则化、L2正则化和弹性网络等。

5.4 批归一化

批归一化可以减少每一层输入的分布变化,从而使得网络更快地收敛,同时也可以作为一种正则化技术,减小模型的过拟合风险。

6 超参数优化方法

6.1 网格搜索法

网格搜索法是一种简单直观的超参数优化方法,它通过遍历超参数空间中所有可能的组合,来查找最佳的超参数组合。具体来说,网格搜索法首先需要定义超参数的取值范围,然后将每个超参数的取值范围离散化,生成一个超参数网格。然后遍历这个网格上的所有组合,依次评估每个组合的性能,最终找到最佳的超参数组合。

6.2 随机搜索法

随机搜索法是一种更加高效的超参数优化方法,它通过在超参数空间中随机采样,来查找最佳的超参数组合。具体来说,随机搜索法首先需要定义超参数的取值范围,然后在这个范围内随机采样若干组超参数组合,依次评估每个组合的性能。随机搜索法的优点是可以避免网格搜索法中的过拟合问题,同时对于超参数空间较大或维度较高的情况,随机搜索法更加高效。

可以先粗搜索,搜索间隔调大一些,选定区域后 再细搜索

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

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

相关文章

八大排序(二)快速排序

一、快速排序的思想 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右…

免费的AI写作软件-智能AI写作工具

我们要谈的话题是AI写作&#xff0c;尤其是免费AI写作&#xff0c;以及147SEOAI写作免费工具。您是否曾经为了创作文章而感到煞费苦心&#xff1f;是否一直在寻找一种能够轻松生成高质量文章的方法&#xff1f; 147GPT批量文章生成工具​www.147seo.com/post/2801.html​编辑ht…

Flink TaskManger 内存计算实战

Flink TaskManager内存计算图 计算实例 案例一、假设Task Process内存4GB。 taskmanager.memory.process.size4096m 先排减JVM内存。 JVM Metaspace 固定内存 256mJVM Overhead 固定比例 process * 0.1 4096 * 0.1 410m 得到 Total Flink Memory 4096-256-410 3430m 计…

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows 大家好我是艾西&#xff0c;最近研究了下 l4d2&#xff08;求生之路2&#xff09;这款游戏的搭建以及架设过程。今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器。毕竟自己当服主是热爱游…

华为云云耀云服务器L实例评测|redis漏洞回顾 MySQL数据安全解决 搭建主从集群MySQL 相关设置

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;数据丢失&#xff0c;还好我有几份备份&#xff0c;没有造成太大的损失&#xff1b;后来有发现Redis数据库被攻击的情况&#xff0c;加入了redis密…

基于springboot+vue的校园外卖服务系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决

目录 一、实现登陆注册界面 1、前期准备 2、登录静态页实现 2.1、创建Vue组件 2.2、静态页面实现 2.3、配置路由 2.4、更改App.vue样式 2.5、效果 3、注册静态页实现 3.1、静态页面实现 3.2、配置路由 3.3、效果 二、axios 1、前期准备 1.1、准备项目 1.2、安装…

原生HTML实现marquee向上滚动效果

实现原理&#xff1a;借助CSS3中animation动画以及原生JS克隆API <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /…

Northstar 量化平台

基于 B/S 架构、可替代付费商业软件的一站式量化交易平台。具备历史回放、策略研发、模拟交易、实盘交易等功能。兼顾全自动与半自动的使用场景。 已对接国内期货股票、外盘美股港股。 面向程序员的量化交易软件&#xff0c;用于期货、股票、外汇、炒币等多种交易场景&#xff…

OpenCV中的HoughLines函数和HoughLinesP函数到底有什么区别?

一、简述 基于OpenCV进行直线检测可以使用HoughLines和HoughLinesP函数完成的。这两个函数之间的唯一区别在于,第一个函数使用标准霍夫变换,第二个函数使用概率霍夫变换(因此名称为 P)。概率版本之所以如此,是因为它仅分析点的子集并估计这些点都属于同一条线的概率。此实…

php文件上传功能(文件上传)

实现文件上传是Web开发中常用的功能之一&#xff0c;而PHP也是支持文件上传的。那么&#xff0c;下面我们就来介绍一下常用的PHP实现文件上传的方法。 使用HTML表单实现文件上传 HTML表单是Web开发中最基本的元素之一&#xff0c;它可以接收用户输入的数据&#xff0c;并通过…

论文阅读_大语言模型_Llama2

英文名称: Llama 2: Open Foundation and Fine-Tuned Chat Models 中文名称: Llama 2&#xff1a;开源的基础模型和微调的聊天模型 文章: http://arxiv.org/abs/2307.09288 代码: https://github.com/facebookresearch/llama 作者: Hugo Touvron 日期: 2023-07-19 引用次数: 11…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️…

SWC 流程

一个arxml 存储SWC &#xff08;可以存多个&#xff0c;也可以一个arxml存一个SWC&#xff09;一个arxml 存储 composition &#xff08;只能存一个&#xff09;一个arxml 存储 system description (通过import dbc自动生成system) 存储SWC和composition的arxml文件分开&#…

如何用好免费的ChatGPT

如何用好免费的ChatGPT 前言ChatGPT使用入口在线体验地址&#xff1a;点我体验 ChatGPT介绍ChatGPT初级使用技巧初级使用技巧&#xff1a;清晰明了的问题表达 ChatGPT中级使用语法中级使用语法&#xff1a;具体化问题并提供背景信息 ChatGPT高级使用高级使用&#xff1a;追问、…

安防监控系统/视频云存储/视频监控平台EasyCVR无法级联上级平台,该如何解决?

安防视频监控系统EasyCVR平台能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也…

Linux三大搜索指令的区别

find&#xff1a;可以在指定的路径下进行文件的搜索 —— 真的在磁盘文件中查找 例如find /usr/bin/ -name ls which 可以在指令路径下&#xff0c;/usr/bin,搜索指令文件 例如&#xff1a;which ls whereis:在系统特定的路径下查找&#xff0c;既可以找到可执行程序&#xff…

设计模式之观察者(发布订阅)模式

观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新自己 class Program{static void Main(string[] args){ConcreteSubject concreteSu…

字符串函数

目录 一、求字符串长度 strlen 用法&#xff1a; 注意&#xff1a; 用例&#xff1a; 二、长度不受限制的字符串函数 strcpy 用法&#xff1a; 注意&#xff1a; 用例: strcat 用法&#xff1a; 注意&#xff1a; 用例&#xff1a; strcmp 用法&#xff1a; 三…