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

news2024/11/29 10:46:12

文章目录

  • 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.coloradmin.cn/o/1028168.html

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

相关文章

自定义协议、序列化与反序列化

在编写TCP和UDP程序的时候&#xff0c;我们很自然的就使用了读取的函数对数据进行获取&#xff0c;对于UDP来说提供的是无连接的以数据报的形式进行传输&#xff0c;对于TCP来说是面向数据流的&#xff0c;在之前的程序中我们只是进行了读取的操作&#xff0c;但是并没有对读取…

通讯网关软件008——利用CommGate X2Mysql实现OPC数据转储Mysql

本文介绍利用CommGate X2MYSQL实现从OPC Server读取数据并转储至MYSQL数据库。CommGate X2MYSQL是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从OPC Server读取数据并转储至MYSQL数据…

Go语言进化之路:泛型的崛起与复用的新篇章

一、引言 泛型编程在许多编程语言中都是一项非常强大的特性&#xff0c;它可以使程序更加通用、具有更高的重用性。然而&#xff0c;Go语言在很长一段时间内一直没有提供泛型功能。在过去的一些版本中&#xff0c;Go语言开发者试图引入泛型&#xff0c;但最终都因为各种原因被…

分布式系统——分布式系统知识脑图

摘要 本博文主要介绍分布式系统知识脑图&#xff0c;帮助大家更好的快速的了解分布式系统相关知识。同时也是为大家在工作中应对分布式系统设计提供相关参考。 一、分布式系统知识脑图 博文参考

origin自定义颜色

点击图例&#xff0c;然后点击菜单栏的颜色右边的三角形。选择自定义颜色 在红绿蓝里输入自己想要的颜色配比。点击确定 如图&#xff0c;定义好五组颜色。我这里用的是比较经典的五色配图 蓝&#xff1a;1,86,153 黄&#xff1a;250,192,15 橙&#xff1a;243,118,74 浅蓝…

mysql workbench常见问题

1、No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar 方法一&#xff1a;双击你要使用的库 方法二&#xff1a;USE 数据库名 2、复制表名&#xff0c;字段名 3、保存链接

【PostgreSQL内核学习(十一)—— (CreatePortal)】

CreatePortal 概述CreatePortal 函数GetPortalByName 函数PortalHashTableLookup 函数 MemoryContextAllocZero 函数 AllocSetContextCreate 函数ResourceOwnerCreatePortalHashTableInsert总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们…

AI大模型服务应用场景

大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型通常在各种领域&#xff0c;例如自然语言处理、图像识别和语音识别等&#xff0c;表现出高度准确和广泛的泛化能力。伴随…

2023-9

内核向应用层发送netlink单播消息&#xff1a; nlmsg_unicast -> netlink_unicast -> netlink_sendskb -> __netlink_sendskb -> 把skb链入struct sock 的 sk_receive_queue 链表中&#xff0c;再调用sk->sk_data_ready(sk); -> sock_def_readable -> wak…

排序算法:归并排序(递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

关于使用API接口获取商品数据的那些事(使用API接口获取商品数据的步骤和注意事项。)

随着电商行业的不断发展&#xff0c;越来越多的企业和个人需要获取各大电商平台上的商品数据。而最常用的方法是使用API接口获取商品数据。本文将为您介绍使用API接口获取商品数据的步骤和注意事项。 一、选择API接口 首先需要了解各大电商平台提供的API接口&#xff0c;目前…

算法通关村第14关【黄金】| 数据流的中位数

思路&#xff1a;使用一个小根堆一个大根堆来找中位数 小根堆保存较大的一半数字&#xff0c;大根堆保存较小的一半数字 奇数queMin的队头即为中位数&#xff0c;偶数queMin和queMax队头相加/2为中位数 初始状态&#xff1a; queMin: [] queMax: [] 添加数字 1&#xff1a; …

【Java 基础篇】Java 进程详解:从基础到实践

Java 是一种广泛应用于各种类型的软件开发的编程语言&#xff0c;而与 Java 紧密相关的一个概念就是进程。本篇博客将从基础开始&#xff0c;详细介绍 Java 进程的概念、创建、管理以及一些实际应用场景。无论您是初学者还是有一定经验的开发者&#xff0c;都能从本文中获取有关…

如何高效批量查询快递单号,提高工作效率?

在日常生活中&#xff0c;快递单号的查询是一项常规任务。过去&#xff0c;这项任务需要通过人工一个一个地在快递平台上查询&#xff0c;既耗时又费力。然而&#xff0c;随着科技的发展&#xff0c;我们有了更多的工具可以帮助我们高效地完成这项任务。本文将介绍如何使用固乔…

【List篇】LinkedList 详解

目录 成员变量属性构造方法add(), 插入节点方法remove(), 删除元素方法set(), 修改节点元素方法get(), 取元素方法ArrayList 与 LinkedList的区别Java中的LinkedList是一种实现了List接口的 双向链表数据结构。链表是由一系列 节点(Node)组成的,每个节点包含了指向 上一个…

Java“牵手”1688商品评论数据采集+1688商品评价接口,1688商品追评数据接口,行业商品质检接口,1688API接口申请指南

1688商品评论平台是阿里巴巴集团旗下的一个在线服务市场平台&#xff0c;为卖家提供商品评价服务。平台上有多种评价工具和数据支持&#xff0c;可以帮助卖家更好地了解商品的质量和特点&#xff0c;从而做出更明智的采购决策。 1688商品评论平台支持多种评价方式&#xff0c;…

R语言画多变量间的两两相关性图

语言代码&#xff1a; setwd("D:/Desktop/0000/R") #更改路径df<-read.csv("kaggle/Seed_Data.csv") head(df) df$target<-factor(df$target) # 因为目标是数字&#xff0c;所以加他&#xff0c;不加会报错 cols<-c("steelblue","…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(LeNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素&#xff1a; 缺少的成分&#xff1a;数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中&#xff0c;ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…

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

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

威胁的数量、复杂程度和扩散程度不断上升

Integrity360 宣布了针对所面临的网络安全威胁、数量以及事件响应挑战的独立研究结果。 数据盗窃、网络钓鱼、勒索软件和 APT 是最令人担忧的问题 这项调查于 2023 年 8 月 9 日至 14 日期间对 205 名 IT 安全决策者进行了调查&#xff0c;强调了他们的主要网络安全威胁和担忧…