激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解

news2024/11/25 6:49:36

相关文章

  1. 梯度下降算法、随机梯度下降算法、动量随机梯度下降算法、AdaGrad算法、RMSProp算法、Adam算法详细介绍及其原理详解
  2. 反向传播算法和计算图详细介绍及其原理详解
  3. 激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解


前言

  本文总结了关于激活函数、 S i g m o i d Sigmoid Sigmoid激活函数、 t a n h tanh tanh激活函数、 R e L U ReLU ReLU激活函数、 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数、 P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数的相关内容,详细介绍了其原理以及优缺点,本文的全部内容如下所示。


一、激活函数

1.1 什么是激活函数

  设想这么一种情况,假如我们现在由输入值 x x x,经过线性变换 y 1 = w 1 x + b 1 y_{1}=w_{1}x+b_{1} y1=w1x+b1,得到 y 1 y_1 y1,这个过程如下图所示:

请添加图片描述

图1:前向传播过程

  很明显这个线性变换就是一条直线,它的图像可能类似如下图所示的增函数:

请添加图片描述

图2:此神经元的线性变化对应的函数图像

  那如果我们在之前的基础上再做一次线性变换 y 2 = w 2 y 1 + b 2 y_{2}=w_{2}y_{1}+b_{2} y2=w2y1+b2,得到 y 2 y_{2} y2,那么整个过程就如下图所示:

请添加图片描述

图3:具有两个神经元的线性前向传播过程

  因为我们做的是线性变换,所以说得到的函数图像仍是一条直线,虽然可能变成了如下图所示的减函数:

请添加图片描述

图4:经过第二个神经元的线性变化对应的函数图像

  所以说,就算将很多的线性变换叠加为神经网络,最终也只能解决线性的问题。对于下图来说,虽然每个神经元都可以进行一次计算,但是计算的结果都是线性变换后的结果,最终也只能解决线性拟合问题。

请添加图片描述

图5:多个神经元的线性前向传播过程

  但是在日常生活中,我们遇到的大部分情况都是非线性问题,那么该如何利用神经网络解决非线性问题呢?在讲解这个问题之前,让我们先回顾一下高中生物的一个知识点:神经元,这个结构如下图所示:

请添加图片描述

图6:生物体中的神经元结构

  首先树突接受上一个神经元的信号,然后由轴突引起内外电荷数量的变化,得到一个动作电压,最终使整个神经元被激活,将得到的经过激活后的信号继续向后传导。而深度学习也借鉴了这个过程,每个神经元计算后的结果需要传入非线性函数 f f f进行非线性计算,这个过程把非线性函数 f f f当作是从输入到输出的激活过程,所以此非线性函数也被称为激活函数(Activation Function),经过激活函数计算后的值 o o o才是此神经元最终的输出值。

请添加图片描述

图7:激活函数示意图

1.2 使用激活函数后如何更新参数

  我们之前学过,可以利用梯度下降算法来最优化参数,那么使用激活函数后如何应用梯度下降来更新参数呢?其实这个问题很简单,我们只需要多计算两步:

  • 损失函数 L L L对激活值 o o o的偏导
  • 激活函数 f f f对预测值 y y y的偏导

  整个过程如下图所示:

请添加图片描述

图8:具有激活函数的反向传播过程

1.3 成为激活函数的条件

  让我们再考虑一个问题,现实世界中有数以万计的函数,谁都可以成为激活函数么?很显然是不是的,某个函数要想作为激活函数来使用,应满足以下几点要求:

  • 为了避免只能解决线性问题,所以激活函数应是非线性函数
  • 为了使用梯度下降算法来最优化参数,所以激活函数应是连续可导函数
  • 为了数值上的稳定,激活函数应能映射所有的实数,所以激活函数的定义域应为 R \mathbb{R} R
  • 为了只是增加非线性,不改变对输入的响应状态,所以激活函数应是单调递增的 S S S型曲线

  现在,我们已经了解了什么是激活函数,那么在我们平时使用神经网络时,究竟都在使用哪些激活函数呢?下面将对常用的一些激活函数进行详解。

二、 S i g m o i d Sigmoid Sigmoid激活函数

2.1 S i g m o i d Sigmoid Sigmoid激活函数介绍

  刚才我们也提到了,一个函数要想成为激活函数,需要满足很多条件,那么什么函数可以满足这些条件呢?目前我们比较常用的就是 S i g m o i d Sigmoid Sigmoid激活函数,可以有效地处理非线性问题,其函数解析式为:
σ = 1 1 + e − y \sigma=\frac{1}{1+e^{-y}} σ=1+ey1
   S i g m o i d Sigmoid Sigmoid激活函数的函数图像为:

请添加图片描述

图9:Sigmoid激活函数的函数图像

  由其函数图像可以看到, S i g m i o d Sigmiod Sigmiod激活函数是一个典型的非线性函数,将输入映射至0~1之间。而且, S i g m o i d Sigmoid Sigmoid激活函数还可由希腊字母 σ \sigma σ表示。

  通常,我们需要使用经过激活函数 f f f(对于 S i g m o i d Sigmoid Sigmoid激活函数来说,此时的 f f f就是 σ ′ \sigma^{\prime} σ)激活后的值与真实值之间的误差形成的误差函数 L L L来进行参数最优化,也就是刚才提到的内容,这也就需要得到 S i g m o i d Sigmoid Sigmoid激活函数的导函数:
σ ′ = ( 1 1 + e − y ) ′ = − ( 1 1 + e − y ) 2 ( − e − y ) = e − y ( 1 + e − y ) 2 = 1 1 + e − y e − y 1 + e − y = σ ( 1 − σ ) \begin{aligned} \sigma^{\prime} & =\left(\frac{1}{1+e^{-y}}\right)^{\prime} \\ & =-\left(\frac{1}{1+e^{-y}}\right)^{2}\left(-e^{-y}\right) \\ & =\frac{e^{-y}}{\left(1+e^{-y}\right)^{2}} \\ & =\frac{1}{1+e^{-y}} \frac{e^{-y}}{1+e^{-y}} \\ & =\sigma(1-\sigma) \end{aligned} σ=(1+ey1)=(1+ey1)2(ey)=(1+ey)2ey=1+ey11+eyey=σ(1σ)
   S i g m o i d Sigmoid Sigmoid激活函数的导函数 σ ′ \sigma^{\prime} σ的图像如下图所示,类似于一个倒立的钟形图像,其最大值为0.25。经过观察发现,当 y y y值较大或较小时, σ ′ \sigma^{\prime} σ的值为0,这种函数我们也称其为饱和函数。

请添加图片描述

图10:Sigmoid激活函数的导函数图像

  此时,让我们将目光再次聚焦到 S i g m o i d Sigmoid Sigmoid激活函数的函数图像上,我们可以注意到, S i g m o i d Sigmoid Sigmoid激活函数的函数值总是大于0的,所以经过激活后的值,也都大于0。这种函数也被称为非零均值函数,如下图所示:

请添加图片描述

图11:Sigmoid激活函数是非零均值函数

  既然 S i g m o i d Sigmoid Sigmoid激活函数的函数值永远大于0,那么这样的结果会如何呢?我们可以使用之前的例子进行说明,图示如下,需要注意此时的激活函数 f f f S i g m o i d Sigmoid Sigmoid激活函数 σ \sigma σ

请添加图片描述

图12:使用Sigmoid激活函数后的反向传播过程

  因为刚才提到, S i g m o i d Sigmoid Sigmoid激活函数的函数值永远大于0,所以上图中黄色部分永远大于0,那么 ∂ L ∂ w 1 \frac{\partial L}{\partial w_{1}} w1L ∂ L ∂ w 2 \frac{\partial L}{\partial w_{2}} w2L的正负就取决于红框内 ∂ L ∂ o \frac{\partial L}{\partial o} oL的正负,这就意味着 w 1 w_{1} w1 w 2 w_{2} w2的梯度符号始终一致,最终导致参数 w 1 w_{1} w1 w 2 w_{2} w2被同时正向或者反向更新,这种情况会使神经网络更慢的收敛到预定位置。所以说, S i g m o i d Sigmoid Sigmoid这样的非零均值激活函数会导致神经网络不易收敛。

2.2 梯度消失

  我们刚刚提到, σ ′ \sigma^{\prime} σ的最大值为0.25,所以,在利用梯度下降算法进行参数最优化的过程,其中在进行反向传播计算梯度的时候,每层的梯度会被动缩小大约 1 4 \frac{1}{4} 41,如下图所示:

请添加图片描述

图13:使用Sigmoid激活函数会使每层神经元的梯度被动缩小大约1/4

  这种情况看起来很糟对不对,但是根据 σ ′ \sigma^{\prime} σ的图像可知,其还有另一个特点:当 y y y的值很大或者很小时, σ ′ \sigma^{\prime} σ的值为0。那么也就意味着,当进行反向转播求导时,可能在某一层的梯度几乎为0,那么会导致参数不会被更新,这个过程如下图所示(绿色对号代表正常计算,没有错误;红色叉号代表 σ ′ \sigma^{\prime} σ几乎为零)。这种更糟糕的现象也被称为梯度消失,而 σ ′ \sigma^{\prime} σ又可以被称为饱和函数,所以饱和函数会导致梯度消失。

请添加图片描述

图14:使用类似Sigmoid激活函数的饱和函数作为激活函数会导致梯度消失问题

三、 t a n h tanh tanh激活函数

  经过刚才的讲解可以发现, S i g m o i d Sigmoid Sigmoid激活函数虽然使用较简单,但是存在很多严重的问题,为了解决这些问题,研究人员提出另一种激活函数,也就是我们平时经常使用的 t a n h tanh tanh激活函数, t a n h tanh tanh函数又名为双曲正切函数,这也是我们在高等数学中常用的一个函数。既然要使用 t a n h tanh tanh函数作为激活函数使用,我们就要对其基本性质进行了解,其函数解析式为:
tanh ⁡ = 1 − e − y 1 + e − y \tanh =\frac{1-e^{-y}}{1+e^{-y}} tanh=1+ey1ey

  此函数解析式对应的 t a n h tanh tanh激活函数图像为:

请添加图片描述

图15:tanh激活函数的函数图像

  可以看到, t a n h tanh tanh激活函数并不是类似 S i g m o i d Sigmoid Sigmoid激活函数的非零均值函数,而是零均值函数,因为其函数平均值可以为0,所以 t a n h tanh tanh函数不会导致神经网络不易收敛。

  另外,因为要进行反向传播求导来使用梯度下降算法,其导函数图像我们也要分析以下,如下图所示的就是 t a n h tanh tanh函数的导函数图像:

请添加图片描述

图16:tanh激活函数的导函数图像

  可以看到, t a n h tanh tanh函数的导函数 t a n h ′ tanh^{\prime} tanh是一个饱和函数,因为其当 y y y值较大或较小时, t a n h ′ tanh^{\prime} tanh的值接近0,也就意味着 t a n h tanh tanh激活函数也存在梯度消失的问题。

  如果在神经网络中使用 t a n h tanh tanh激活函数,只需要将最后计算得到的 y y y值传入 t a n h tanh tanh激活函数进行激活,这个过程如下图所示:

请添加图片描述

图17:使用tanh激活函数的前向传播过程

四、 R e L U ReLU ReLU激活函数

4.1 R e L U ReLU ReLU激活函数介绍

  我们学习到现在了,好像并没有一个好的办法解决梯度消失的问题,但是在神经网络的训练中,梯度消失会使神经网络模型训练的精度不高,从而使模型准确率下降。那么为了解决此问题,研究人员又提出了另一种激活函数: R e L U ReLU ReLU激活函数,又称为修正线性单元(Rectified Linear Unit),我们先来看其函数解析式:
ReLU ⁡ ( y ) = { y , y > 0 0 , y ≤ 0 \operatorname{ReLU}(y)=\left\{\begin{array}{ll} y, & y>0 \\ 0, & y \leq 0 \end{array}\right. ReLU(y)={y,0,y>0y0
  此函数解析式对应的 R e L U ReLU ReLU激活函数图像为如下所示:

请添加图片描述

图18:ReLU激活函数的函数图像

  可以看到,当 y > 0 y>0 y0时, R e L U ReLU ReLU激活函数就是一个正比例函数,但是会抑制 y ≤ 0 y≤0 y0的输入,只保留正数部分。通过 R e L U ReLU ReLU激活函数的图像可以看出,其为非零均值函数,看起来会导致神经网络收敛过慢,但是要考虑到 R e L U ReLU ReLU激活函数表达式较简单,计算也较简单,所以在大多数情况下, R e L U ReLU ReLU激活函数不会导致神经网络收敛过慢,反而会让神经网络收敛的速度加快,这也是 R e L U ReLU ReLU激活函数的优点之一。

  那么其导函数图像又是什么样呢?毕竟我们要使用激活函数来进行反向传播的过程, R e L U ReLU ReLU激活函数导函数图像 R e L U ′ ReLU^{\prime} ReLU的图像如下图所示:

请添加图片描述

图19:ReLU激活函数的导函数图像

  可以看到,只有当神经元输出大于0的时候才会回传梯度,小于0的时候就不会进行反向传播。因为当 y > 0 y>0 y0时, R e L U ′ = 1 ReLU^{\prime}=1 ReLU=1;当 y ≤ 0 y≤0 y0时, R e L U ′ = 0 ReLU^{\prime}=0 ReLU=0。而且很明显可以注意到, R e L U ′ ReLU^{\prime} ReLU是一个非饱和函数,所以可以避免梯度消失的现象,这也是 R e L U ReLU ReLU激活函数的优点之二。

4.2 稀疏性

  当我们使用 R e L U ReLU ReLU函数作为激活函数使用时,只需要把激活函数 f f f替换为 R e L U ReLU ReLU函数即可,整个过程如下所示:

请添加图片描述

图20:使用ReLU激活函数的前向传播过程

  那如果我们在整个神经网络中,全部使用 R e L U ReLU ReLU函数作为激活函数呢?也就是将上图的一个简单的神经元扩展到一个具有多个神经元的复杂神经网络中,如下图所示。此时除了上述已经提到的优点外, R e L U ReLU ReLU函数还可以发挥什么样的作用呢?

请添加图片描述

图21:ReLU激活函数的稀疏性示意图

  因为经过 R e L U ReLU ReLU激活函数激活后的值,要么大于0,要么等于0被抑制,所以 R e L U ReLU ReLU激活函数在训练过程中可以动态控制神经元的状态,这种性质也被称为稀疏性。那么 R e L U ReLU ReLU激活函数具有的稀疏性性质的具体优点又体现在哪里呢?其优点主要包括以下几点:

  • 当输入数据的参数发生微小改动时,只有少部分的神经元需要改变状态,而不需要全局调整,从而使信息耦合程度降低
  • 此种动态开启和关闭神经元的做法,可以支持不同输入维度和中间层维度的特征学习
  • 这种稀疏的表达方式,一般都是线性可分或者弱线性可分,所以可以降低网络训练的难度
  • 虽然输出的特征是稀疏的,但是被激活的输出仍保持原有的表达能力

4.3 R e L U ReLU ReLU激活函数的局限性

  经过刚才的介绍可以发现, R e L U ReLU ReLU激活函数的优点非常明显,可以有效地帮助我们训练神经网络,也正是因为这些优点,使得 R e L U ReLU ReLU激活函数成为目前为止应用最广泛的激活函数。但是 R e L U ReLU ReLU激活函数也仍存在一些局限性:

  • 非零均值函数

    刚才提到,虽然 R e L U ReLU ReLU激活函数计算较简单,在大多数情况下会加速神经网络的收敛,但是注意,我说的是大多数情况,毕竟 R e L U ReLU ReLU激活函数还是一个非零均值函数,所以,在有些情况下, R e L U ReLU ReLU激活函数仍会使神经网络的收敛速度变慢,不过这个问题可以使用输出的归一化方法来解决

  • 神经元坏死

    因为经过 R e L U ReLU ReLU激活函数激活后的值,要么大于0,要么等于0,所以在训练的过程中,可能会出现一些神经元始终不会被激活,从而让神经网络表达能力下降的问题。因为在进行反向传播求导的过程中,导数始终为0,也就意味着此神经元被关闭,也可称为神经元坏死

五、 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数

  刚才我们已经提到了关于 R e L U ReLU ReLU激活函数的两个局限性,其中可以使用归一化的方法解决 R e L U ReLU ReLU激活函数具有的非零均值函数的性质,那么关于神经元坏死的问题该如何解决呢?为了解决此问题,研究人员在2013年提出了 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数,其函数解析式如下所示:
L-ReLU ⁡ ( y ) = { y , y > 0 0.01 y , y ≤ 0 \operatorname{L-ReLU}(y)=\left\{\begin{array}{ll} y, & y>0 \\ 0.01 y, & y \leq 0 \end{array}\right. L-ReLU(y)={y,0.01y,y>0y0
   L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数对应的函数图像如下所示:

请添加图片描述

图22:Leaky ReLU激活函数对应的函数图像

  通过以上函数解析式以及函数图像可以看到, L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数在负半轴增加了一个很小的梯度值(即当 y ≤ 0 y≤0 y0时, L − R e L U ( y ) = 0.01 y L-ReLU(y)=0.01y LReLU(y)=0.01y),这样在保留一定稀疏性的情况下,也避免了神经元坏死。所以可以通过应用 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数来解决神经元坏死的问题。

   L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数对应的导函数  L-ReLU  ′ \text { L-ReLU }^{\prime}  L-ReLU 图像如下所示:

请添加图片描述

图23:Leaky ReLU激活函数对应的导函数图像

  若要在神经网络中应用 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数,只需要将激活函数 f f f替换为 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数即可,这个过程如下图所示:

请添加图片描述

图24:使用Leaky ReLU激活函数的前向传播过程

六、 P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数

  因为 L e a k y R e L U Leaky \quad ReLU LeakyReLU激活函数负半轴的梯度是固定的(一直固定为 0.01 y 0.01y 0.01y),所以不太灵活,在某些情况下可能性能不佳,为了解决这个问题,研究人员在2015年提出了 P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数,其函数解析式如下所示:
P-ReLU ⁡ ( y ) = { y , y > 0 α y , y ≤ 0 \operatorname{P-ReLU}(y)=\left\{\begin{array}{ll} y, & y>0 \\ \alpha y, & y \leq 0 \end{array}\right. P-ReLU(y)={y,αy,y>0y0
   P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数对应的函数图像如下所示:

请添加图片描述

图25:Parametric ReLU激活函数对应的函数图像

  通过以上函数解析式以及函数图像可以看到, P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数将负半轴的梯度值更换成了可以动态学习调整的参数(即当 y ≤ 0 y≤0 y0时, P − R e L U ( y ) = α y P-ReLU(y)=\alpha y PReLU(y)=αy),而是否保留稀疏性或者抑制神经元,都要通过训练过程来确定,这样可以使神经网络动态调整训练过程中的参数值,从而获得最佳训练性能。

   P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数对应的导函数图像 P − R e L U ′ P-ReLU^{\prime} PReLU如下图所示:

请添加图片描述

图26:Parametric ReLU激活函数对应的导函数图像

  若要在神经网络中应用 P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数,只需要将激活函数 f f f替换为即可 P a r a m e t r i c R e L U Parametric \quad ReLU ParametricReLU激活函数,这个过程如下图所示:

请添加图片描述

图27:使用Parametric ReLU激活函数的前向传播过程

总结

  以上就是本篇博客的全部内容了,内容不少,但是我认为难度并不是很大,如果尤其之前学习的基础,理解起来并不难,那么今天的学习就到这里了。下篇还会继续给大家带来高质量相关内容博客,敬请期待!

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

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

相关文章

从技术、产品、运营3个维度详尽阐述从0到1搭建用户画像系统

通过阅读以下原文获取下载链接。 ​​​​​从技术、产品、运营3个维度详尽阐述从0到1搭建用户画像系统 1 简介 本书借助数据仓库实现一套用户画像系统的方案。从实际工程案例出发,结合多业务场景,内容涵盖开发离线批处理计算的标签及流式计算标签&am…

【C语言进阶】 带你玩转指针

指针进阶一、字符指针二、指针数组三、数组指针3.1:数组指针的使用四、数组参数、指针参数4.1:一维数组传参4.2:二维数组传参4.3:一级指针传参:4.4:二级指针传参:五:函数指针一、字符…

直播 | StarRocks 联合腾讯云分享 EMR-StarRocks 的降本增效之路

极速湖仓(Lakehouse)是 StarRocks 构建极速统一新范式的核心支点。 用户无需将数据导入到 StarRocks 中,无需构建昂贵的数仓,即可实现亚秒级的查询速度,统一分析离线和实时数据,全面发挥湖仓架构的潜在优势…

让国外软件也害怕,4款国产黑科技软件,功能强大且实用

国外月亮不一定比国内圆,国外的软件也不一定比国内好,下面几款软件功能强大到离谱,甚至比国外同款软件更好用。 1、Dism 这是一款妥妥的良心电脑系统优化工具,虽然英文名字,却是由热爱软件的大学生开发,属于…

Android 使用dx/d8将jar转换为dex

前言 在 JDK1.8 之前我们可以通过 dx 工具将 jar 转为 dex。 为了能够支持 JDK1.8,目前 AGP 是通过在 D8/R8 将 class 文件编译成 dex 文件的过程中,对字节码进行转换来实现的,这个转换过程称为脱糖。 因此 JDK1.8 及以后我们需要使用 d8 工…

计算机网络笔记之物理层

文章目录比特、比特率,码元率(波特率)通信方式之单工、半双工和双工介质访问控制数据、信号、模拟信号、数字信号传输介质多模光纤和单模光纤光纤的优点无线传输卫星通信的特点参考计算机网络笔记之网络概论 物理层的主要功能是规定了接口的…

如何优化 order by 语句

order by 查询语句使用也是非常频繁,有时候数据量大了会发现排序查询很慢,本文就介绍一下 MySQL 是如何进行排序的,以及如何利用其原理来优化 order by 语句。 建立一张表: CREATE TABLE cc4 (id INT(11) NOT NULL,user_name VA…

reactHooks+TS:富文本braft-editor常见用法

react富文本braft-editor使用 阅读文档推荐:https://www.yuque.com/braft-editor/be、https://braft.margox.cn/demos/code-highlighter、 1、安装 # 使用npm安装 npm install braft-editor --save# 使用yarn安装 yarn add braft-editor2、基本使用 第一步&…

FGH60N60SMD 60A600V IGBT单管在工业逆变应用中的解决方案

场截止IGBT单管 60A600V FGH60N60SMD 采用新型场截止 IGBT 技术,为太阳能逆变器、UPS、焊接机、电信、ESS 和 PFC 等低导通和开关损耗至关重要的应用。 ONsemi安森美IGBT单管系列: FGH40N60SMD FGH60N60SMD FGH75T65SHD-F155 NGTB40N120FL2WG特性&…

基于pytorch的CREStereo立体匹配算法

文章目录前言一、CREStereo是什么?1.自适应群相关层局部特征注意力2D-1D转换局部搜索可变形的搜索窗口Group-wise相关性2.级联的网络3.叠加级联推理4.叠加级联推理损失函数二、基于pytorch的CREStereo立体匹配算法前言 CREStereo目前在middlebury上的排名第三&#…

Java高手速成 | Spring、JPA与Hibernate的整合

01、设置Spring的配置文件 在Spring的配置文件applicationContext.xml中&#xff0c;配置C3P0数据源、EntityManagerFactory和JpaTransactionManager等Bean组件。以下是applicationContext.xml文件的源程序。 /* applicationContext.xml */ <?xml version"1.0" …

【财务】FMS财务管理系统---审计流程

本文是电商系列的终结篇&#xff0c;笔者在本文介绍了审计流程及注意事项。 本篇是介绍财务审计的&#xff0c;作为电商系列的终结篇。后续计划去完成供应链后台的相关系统的梳理与学习&#xff0c;非常感谢朋友们在阅读过程中提出的问题与建议。 一、审计及流程 财务审计是每…

吴晓波年终秀原版PPT下载

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点2023年&#xff0c;如何科学制定年度规划&#xff1f;罗振宇2023年跨年演讲PPT原稿《底层逻辑》高清配图清华大学256页PPT元宇宙研究报告.pdf&#x…

nginx学习笔记2(小d课堂)

nginx目录文件讲解&#xff1a; 我们这里要去了解我们画红框了的这四个目录。 我们一般只用这两个文件&#xff0c;nginx.conf.default是nginx的默认模板。 我们先来看看这个默认模板&#xff1a; 这里面会有特别多的配置&#xff0c;我们后面的课会去学到。我们可能以后改哪个…

【实战篇】37 # 如何使用 QCharts 图表库绘制常用数据图表?

说明 【跟月影学可视化】学习笔记。 QCharts 图表库 QCharts 是一个基于 spritejs 封装的图表库&#xff0c;可以让用户以组件的形式组合出各种图表&#xff1a;https://www.qcharts.cn/#/home QCharts 图表的基本用法 最简单的方式是&#xff0c;直接通过 CDN&#xff0c;…

Mac 几款不错的文件管理工具

Default Folder X 文件快捷访问工具 Default Folder X V6.9d19 是一款 Mac 上的文件夹快捷访问工具&#xff0c;您可以访问您最近的&#xff0c;最喜欢的&#xff0c;并打开文件夹的默认文件夹X的工具栏右侧的内容。扩大你把鼠标移到他们的层次弹出菜单&#xff0c;让您浏览您…

【胖虎的逆向之路】动态加载和类加载机制详解

胖虎的逆向之路 —— 动态加载和类加载机制详解一、前言二、类的加载器1. 双亲委派模式2. Android 中的类加载机制1&#xff09;Android 基本类的预加载2&#xff09;Android类加载器层级关系及分析3&#xff09;BootClassLoader4&#xff09;Class文件加载5&#xff09;PathCl…

从 Redshift 迁移数据到 DolphinDB

AWS Redshift 是最早的云数据仓库之一&#xff0c;为用户提供完全托管的 PB 级云中数据仓库服务。用户可以使用标准 SQL 和现有的商业智能工具&#xff0c;经济高效地进行数据分析。但 AWS Redshift 上手难度较大&#xff0c;对知识储备要求较高&#xff0c;设计和优化相当复杂…

PCB设计中的屏蔽罩设计

屏蔽罩是一个合金金属罩&#xff0c;是减少显示器辐射至关重要的部件&#xff0c;应用在MID或VR产品中可以有效的减少模块与模块之间的相互干扰&#xff0c;如图3-54所示&#xff0c;常见于主控功能模块和电源模块及Wifi模块之间的隔离。图3-54 屏蔽罩的使用 01 屏蔽罩夹子一般…

前端沙箱浅析

前言 沙箱&#xff0c;即sandbox。 通常解释为&#xff1a;沙箱是一种安全机制&#xff0c;为运行中的程序提供隔离环境。常用于执行未经测试或者不受信任的程序或代码&#xff0c;它会为待执行的程序创建一个独立的执行环境&#xff0c;内部程序的执行不会影响外部程序的运行…