吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5

目录

  • 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)
    • 第三周: 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)
      • 3.4 归一化网络的激活函数(Normalizing activations in a network)
      • 3.5 将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a neural network)

第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)

第三周: 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)

3.4 归一化网络的激活函数(Normalizing activations in a network)

在深度学习兴起后,最重要的一个思想是它的一种算法,叫做 Batch 归一化,由 Sergey loffe和Christian Szegedy 两位研究者创造。Batch归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好,也会是你的训练更加容易,甚至是深层网络。让我们来看看 Batch 归一化是怎么起作用的吧。

在这里插入图片描述
当训练一个模型,比如 logistic 回归时,你也许会记得,归一化输入特征可以加快学习过程。你计算了平均值,从训练集中减去平均值,计算了方差,接着根据方差归一化你的数据集,在之前的视频中我们看到,这是如何把学习问题的轮廓,从很长的东西,变成更圆的东西,更易于算法优化。所以这是有效的,对 logistic 回归和神经网络的归一化输入特征值而言。

在这里插入图片描述
那么更深的模型呢?你不仅输入了特征值𝑥,而且这层有激活值 a [ 1 ] a^{[1]} a[1],这层有激活值 a [ 2 ] a^{[2]} a[2]等等。如果你想训练这些参数,比如 w [ 3 ] w^{[3]} w[3] b [ 3 ] b^{[3]} b[3],那归一化 a [ 2 ] a^{[2]} a[2]的平均值和方差岂不是很好?以便使 w [ 3 ] w^{[3]} w[3] b [ 3 ] b^{[3]} b[3]的训练更有效率。在 logistic 回归的例子中,我们看到了如何归一化 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3,会帮助你更有效的训练w和b。

所以问题来了,对任何一个隐藏层而言,我们能否归一化a值,在此例中,比如说 a [ 2 ] a^{[2]} a[2]的值,但可以是任何隐藏层的,以更快的速度训练 w [ 3 ] w^{[3]} w[3] b [ 3 ] b^{[3]} b[3],因为 a [ 2 ] a^{[2]} a[2]是下一层的输入值,所以就会影响 w [ 3 ] w^{[3]} w[3] b [ 3 ] b^{[3]} b[3]的训练。简单来说,这就是 Batch 归一化的作用。尽管严格来说,我们真正归一化的不是 a [ 2 ] a^{[2]} a[2],而是 z [ 2 ] z^{[2]} z[2],深度学习文献中有一些争论,关于在激活函数之前是否应该将值 z [ 2 ] z^{[2]} z[2]归一化,或是否应该在应用激活函数 a [ 2 ] a^{[2]} a[2]后再规范值。实践中,经常做的是归一化 z [ 2 ] z^{[2]} z[2],所以这就是我介绍的版本,我推荐其为默认选择,那下面就是 Batch 归一化的使用方法。

在神经网络中,已知一些中间值,假设你有一些隐藏单元值,从 z ( 1 ) z^{(1)} z(1) z ( m ) z^{(m)} z(m),这些来源于隐藏层,所以这样写会更准确,
z [ l ] ( i ) z^{[l](i)} z[l](i)为隐藏层,𝑖从 1 到𝑚,但这样书写,我要省略𝑙及方括号,以便简化这一行的符号。所以已知这些值,如下,你要计算平均值,强调一下,所有这些都是针对𝑙层,但我省略𝑙及方括号,然后用正如你常用的那个公式计算方差,接着,你会取每个𝑧(𝑖)值,使其规范化,方法如下,减去均值再除以标准偏差,为了使数值稳定,通常将 ϵ \epsilon ϵ作为分母,以防防𝜎 = 0的情况。

在这里插入图片描述

所以现在我们已把这些z值标准化,化为含平均值 0 和标准单位方差,所以𝑧的每一个分量都含有平均值 0 和方差 1,但我们不想让隐藏单元总是含有平均值 0 和方差 1,也许隐藏单元有了不同的分布会有意义,所以我们所要做的就是计算,我们称之为 z ^ ( i ) \hat{z}^{(i)} z^(i) z ^ ( i ) = γ z n o r m ( i ) + β \hat{z}^{(i)} = \gamma z_{norm}^{(i)} +\beta z^(i)=γznorm(i)+β,这里𝛾和𝛽是你模型的学习参数,所以我们使用梯度下降或一些其它类似梯度下降的算法,比如 Momentum 或者 Nesterov,Adam,你会更新𝛾和𝛽,正如更新神经网络的权重一样。

在这里插入图片描述
请注意𝛾和𝛽的作用是,你可以随意设置𝑧̃(𝑖)的平均值,事实上,如果 γ = σ 2 + ϵ \gamma = \sqrt{\sigma^2 + \epsilon} γ=σ2+ϵ ,如果𝛾等于这个分母项( z n o r m ( i ) = z ( i ) − μ σ 2 + ϵ z_{norm}^{(i)} =\frac{z^{(i)} -\mu}{\sqrt{\sigma^2 + \epsilon}} znorm(i)=σ2+ϵ z(i)μ中的分母), β \beta β等于 μ \mu μ,这里的这个值是 z n o r m ( i ) = z ( i ) − μ σ 2 + ϵ z_{norm}^{(i)} =\frac{z^{(i)} -\mu}{\sqrt{\sigma^2 + \epsilon}} znorm(i)=σ2+ϵ z(i)μ中的 μ \mu μ,那么 γ z n o r m ( i ) + β \gamma z_{norm}^{(i)} + \beta γznorm(i)+β的作用在于,它会精确转化这个方程,如果这些成立( γ = σ 2 + ϵ \gamma = \sqrt{\sigma^2 + \epsilon} γ=σ2+ϵ , β = μ \beta =\mu β=μ),那么 z ^ ( i ) = z ( i ) \hat{z}^{(i)} = z^{(i)} z^(i)=z(i)

通过对𝛾和𝛽合理设定,规范化过程,即这四个等式,从根本来说,只是计算恒等函数,通过赋予𝛾和𝛽其它值,可以使你构造含其它平均值和方差的隐藏单元值。

在这里插入图片描述

所以,在网络匹配这个单元的方式,之前可能是用 z ( 1 ) z^{(1)} z(1) z ( 2 ) z^{(2)} z(2)等等,现在则会用 z ^ i \hat{z}^{i} z^i取代 z ( i ) z^{(i)} z(i),方便神经网络中的后续计算。如果你想放回[𝑙],以清楚的表明它位于哪层,你可以把它放这。

所以我希望你学到的是,归一化输入特征X是怎样有助于神经网络中的学习,Batch 归一化的作用是它适用的归一化过程,不只是输入层,甚至同样适用于神经网络中的深度隐藏层。你应用 Batch 归一化了一些隐藏单元值中的平均值和方差,不过训练输入和这些隐藏单元值的一个区别是,你也许不想隐藏单元值必须是平均值 0 和方差 1。

在这里插入图片描述
比如,如果你有 sigmoid 激活函数,你不想让你的值总是全部集中在这里,你想使它们有更大的方差,或不是 0 的平均值,以便更好的利用非线性的 sigmoid 函数,而不是使所有的值都集中于这个线性版本中,这就是为什么有了𝛾和𝛽两个参数后,你可以确保所有的 z ( i ) z^{(i)} z(i)值可以是你想赋予的任意值,或者它的作用是保证隐藏的单元已使均值和方差标准化。那里,均值和方差由两参数控制,即𝛾和𝛽,学习算法可以设置为任何值,所以它真正的作用是,使隐藏单元值的均值和方差标准化,即 z ( i ) z^{(i)} z(i)有固定的均值和方差,均值和方差可以是 0 和 1,也可以是其它值,它是由𝛾和𝛽两参数控制的。

我希望你能学会怎样使用 Batch 归一化,至少就神经网络的单一层而言,在下一个视频中,我会教你如何将 Batch 归一化与神经网络甚至是深度神经网络相匹配。对于神经网络许多不同层而言,又该如何使它适用,之后,我会告诉你,Batch 归一化有助于训练神经网络的原因。所以如果觉得 Batch 归一化起作用的原因还显得有点神秘,那跟着我走,在接下来的两个视频中,我们会弄清楚。

3.5 将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a neural network)

你已经看到那些等式,它可以在单一隐藏层进行 Batch 归一化,接下来,让我们看看它是怎样在深度网络训练中拟合的吧。

在这里插入图片描述

假设你有一个这样的神经网络,我之前说过,你可以认为每个单元负责计算两件事。第一,它先计算z,然后应用其到激活函数中再计算a,所以我可以认为,每个圆圈代表着两步的计算过程。同样的,对于下一层而言,那就是 z 1 [ 2 ] z_1^{[2]} z1[2] z 2 [ 2 ] z_2^{[2]} z2[2]等。所以如果你没有应用 Batch 归一化,你会把输入𝑋拟合到第一隐藏层,然后首先计算 z [ 1 ] z^{[1]} z[1],这是由 w [ 1 ] w^{[1]} w[1] b [ 1 ] b^{[1]} b[1]两个参数控制的。接着,通常而言,你会把 z [ 1 ] z^{[1]} z[1]拟合到激活函数以计算 a [ 1 ] a^{[1]} a[1]。但 Batch 归一化的做法是将 z [ 1 ] z^{[1]} z[1]值进行 Batch 归一化,简称 BN,此过程将由 β [ 1 ] \beta^{[1]} β[1] γ [ 1 ] \gamma^{[1]} γ[1]两参数控制,这一操作会给你一个新的规范化的 z [ 1 ] z^{[1]} z[1]值( z ^ [ 1 ] \hat{z}^[1] z^[1]),然后将其输入激活函数中得到 a [ 1 ] a^{[1]} a[1],即 a [ 1 ] = g [ 1 ] ( z ^ [ l ] ) a^{[1]} = g^{[1]}(\hat{z}^{[l]}) a[1]=g[1](z^[l])

在这里插入图片描述
现在,你已在第一层进行了计算,此时 Batch 归一化发生在𝑧的计算和𝑎之间,接下来,你需要应用 a [ 1 ] a^{[1]} a[1]值来计算 z [ 2 ] z^{[2]} z[2],此过程是由 w [ 2 ] w^{[2]} w[2] b [ 2 ] b^{[2]} b[2]控制的。与你在第一层所做的类似,你会将 z [ 2 ] z^{[2]} z[2]进行 Batch 归一化,现在我们简称 BN,这是由下一层的 Batch 归一化参数所管制的,即 β [ 2 ] \beta^{[2]} β[2] γ [ 2 ] \gamma^{[2]} γ[2],现在你得到 z ^ [ 2 ] \hat{z}^{[2]} z^[2],再通过激活函数计算出 a [ 2 ] a^{[2]} a[2]等等。

所以需要强调的是 Batch 归一化是发生在计算𝑧和𝑎之间的。直觉就是,与其应用没有归一化的𝑧值,不如用归一过的 z ^ \hat{z} z^,这是第一层( z ^ [ 1 ] \hat{z}^{[1]} z^[1])。第二层同理,与其应用没有规范过的 z [ 2 ] z^{[2]} z[2]值,不如用经过方差和均值归一后的 z ^ [ 2 ] \hat{z}^{[2]} z^[2]。所以,你网络的参数就会是 w [ 1 ] w^{[1]} w[1] b [ 1 ] b^{[1]} b[1] w [ 2 ] w^{[2]} w[2] b [ 2 ] b^{[2]} b[2]等等,我们将要去掉这些参数。但现在,想象参数 w [ 1 ] w^{[1]} w[1] b [ 1 ] b^{[1]} b[1] w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l],我们将另一些参数加入到此新网络中 β [ 1 ] \beta^{[1]} β[1] β [ 2 ] \beta^{[2]} β[2] γ [ 1 ] \gamma^{[1]} γ[1] γ [ 2 ] \gamma^{[2]} γ[2]等等。对于应用 Batch 归一化的每一层而言。需要澄清的是,请注意,这里的这些 β \beta β β [ 1 ] \beta^{[1]} β[1] β [ 2 ] \beta^{[2]} β[2]等等)和超参数 β \beta β没有任何关系,下一张幻灯片中会解释原因,后者是用于 Momentum 或计算各个指数的加权平均值。Adam 论文的作者,在论文里用 β \beta β代表超参数。Batch 归一化论文的作者,则使用 β \beta β代表此参数( β [ 1 ] \beta^{[1]} β[1] β [ 2 ] \beta^{[2]} β[2]等等),但这是两个完全不同的 β \beta β。我在两种情况下都决定使用 β \beta β,以便你阅读那些原创的论文,但 Batch 归一化学习参数 β [ 1 ] \beta^{[1]} β[1] β [ 2 ] \beta^{[2]} β[2]等等和用于 Momentum、Adam、RMSprop 算法中的𝛽不同。

在这里插入图片描述
所以现在,这是你算法的新参数,接下来你可以使用想用的任何一种优化算法,比如使用梯度下降法来执行它。

举个例子,对于给定层,你会计算 d β [ l ] d\beta^{[l]} dβ[l],接着更新参数 β \beta β β [ l ] \beta^{[l]} β[l] = β [ l ] \beta^{[l]} β[l] α d β [ l ] \alpha d\beta^{[l]} αdβ[l]。你也可以使用 Adam 或 RMSprop 或 Momentum,以更新参数 β \beta β和𝛾,并不是只应用梯度下降法。

即使在之前的视频中,我已经解释过 Batch 归一化是怎么操作的,计算均值和方差,减去均值,再除以方差,如果它们使用的是深度学习编程框架,通常你不必自己把 Batch 归一化步骤应用于 Batch 归一化层。因此,探究框架,可写成一行代码,比如说,在 TensorFlow框架中,你可以用这个函数(tf.nn.batch_normalization)来实现 Batch 归一化,我们稍后讲解,但实践中,你不必自己操作所有这些具体的细节,但知道它是如何作用的,你可以更好的理解代码的作用。但在深度学习框架中,Batch 归一化的过程,经常是类似一行代码的东西。

所以,到目前为止,我们已经讲了 Batch 归一化,就像你在整个训练站点上训练一样,或就像你正在使用 Batch 梯度下降法。

在这里插入图片描述

实践中,Batch 归一化通常和训练集的 mini-batch 一起使用。你应用 Batch 归一化的方式就是,你用第一个 mini-batch(X^{{1}}),然后计算 z [ 1 ] z^{[1]} z[1],这和上张幻灯片上我们所做的一样,应用参数 w [ 1 ] w^{[1]} w[1] b [ 1 ] b^{[1]} b[1],使用这个 m i n i − b a t c h ( X 1 ) mini-batch(X^{{1}}) minibatch(X1)。接着,继续第二个 mini-batch(X^{{2}}),接着Batch 归一化会减去均值,除以标准差,由 β [ 1 ] \beta^{[1]} β[1] γ [ 1 ] \gamma^{[1]} γ[1]重新缩放,这样就得到了 z ^ [ 1 ] \hat{z}^{[1]} z^[1],而所有的这些都是在第一个 mini-batch 的基础上,你再应用激活函数得到 a [ 1 ] a^{[1]} a[1]。然后用 w [ 2 ] w^{[2]} w[2] b [ 2 ] b^{[2]} b[2]计算 z [ 2 ] z^{[2]} z[2],等等,所以你做的这一切都是为了在第一个 mini-batch( X 1 X^{{1}} X1)上进行一步梯度下降法。

在这里插入图片描述
类似的工作,你会在第二个 mini-batch(KaTeX parse error: Expected 'EOF', got '}' at position 7: X^[{2}}̲)上计算 z [ 1 ] z^{[1]} z[1],然后用 Batch 归一化来计算 z ^ [ 1 ] \hat{z}^{[1]} z^[1],所以 Batch 归一化的此步中,你用第二个 mini-batch(KaTeX parse error: Expected 'EOF', got '}' at position 7: X^[{2}}̲)中的数据使 z ^ [ 1 ] \hat{z}^{[1]} z^[1]归一化,这里的 Batch 归一化步骤也是如此,让我们来看看在第二个 mini-batch( X 2 X^{{2}} X2)中的例子,在mini-batch 上计算 z [ 1 ] z^{[1]} z[1]的均值和方差,重新缩放的 β \beta β γ \gamma γ得到 z [ 1 ] z^{[1]} z[1],等等。

然后在第三个 mini-batch( X 3 X^{{3}} X3)上同样这样做,继续训练。

现在,我想澄清此参数的一个细节。先前我说过每层的参数是 w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l],还有 β [ l ] \beta^{[l]} β[l] γ [ l ] \gamma^{[l]} γ[l],请注意计算𝑧的方式如下, z [ l ] z^{[l]} z[l] = w [ l ] a [ l − 1 ] + b [ l ] w^{[l]}a^{[l−1]} + b^{[l]} w[l]a[l1]+b[l],但 Batch 归一化做的是,它要看这个 mini-batch,先将 z [ l ] z^{[l]} z[l]归一化,结果为均值 0 和标准方差,再由 β \beta β γ \gamma γ重缩放,但这意味着,无论 b [ l ] b^{[l]} b[l]的值是多少,都是要被减去的,因为在 Batch 归一化的过程中,你要计算 z [ l ] z^{[l]} z[l]的均值,再减去平均值,在此例中的 mini-batch 中增加任何常数,数值都不会改变,因为加上的任何常数都将会被均值减去所抵消。

在这里插入图片描述

所以,如果你在使用 Batch 归一化,其实你可以消除这个参数( b [ l ] b^{[l]} b[l]),或者你也可以,暂时把它设置为 0,那么,参数变成 z [ l ] z^{[l]} z[l] = w [ l ] a [ l − 1 ] w^{[l]}a^{[l−1]} w[l]a[l1],然后你计算归一化的 z [ l ] z^{[l]} z[l] z ^ [ l ] \hat{z}^{[l]} z^[l] = γ [ l ] \gamma^{[l]} γ[l] z [ l ] z^{[l]} z[l]+ β [ l ] \beta^{[l]} β[l],你最后会用参数 β [ l ] \beta^{[l]} β[l],以便决定 z ^ [ l ] \hat{z}^{[l]} z^[l]的取值,这就是原因。

在这里插入图片描述
所以总结一下,因为 Batch 归一化超过了此层 z [ l ] z^{[l]} z[l]的均值,𝑏[𝑙]这个参数没有意义,所以,你必须去掉它,由 β [ l ] \beta^{[l]} β[l]代替,这是个控制参数,会影响转移或偏置条件。

最后,请记住 z [ l ] z^{[l]} z[l]的维数,因为在这个例子中,维数会是( n [ l ] n^{[l]} n[l], 1), β [ l ] \beta^{[l]} β[l]的尺寸为( n [ l ] n^{[l]} n[l], 1),如果是 l 层隐藏单元的数量,那 β [ l ] \beta^{[l]} β[l] γ [ l ] \gamma^{[l]} γ[l]的维度也是( n [ l ] n^{[l]} n[l], 1),因为这是你隐藏层的数量,你有 n [ l ] n^{[l]} n[l]隐藏单元,所以 β [ l ] \beta^{[l]} β[l] γ [ l ] \gamma^{[l]} γ[l]用来将每个隐藏层的均值和方差缩放为网络想要的值。

在这里插入图片描述
让我们总结一下关于如何用 Batch 归一化来应用梯度下降法,假设你在使用 mini-batch梯度下降法,你运行𝑡 = 1到 batch 数量的 for 循环,你会在 mini-batch X t X^{{t}} Xt上应用正向 prop,每个隐藏层都应用正向 prop,用 Batch 归一化代替 z [ l ] z^{[l]} z[l] z ^ [ l ] \hat{z}^{[l]} z^[l]。接下来,它确保在这个 mini-batch 中,𝑧值有归一化的均值和方差,归一化均值和方差后是 z ^ [ l ] \hat{z}^{[l]} z^[l],然后,你用反向 prop 计算 d w [ l ] dw^{[l]} dw[l] d b [ l ] db^{[l]} db[l],及所有 l 层所有的参数, d β [ l ] d\beta^{[l]} dβ[l] d γ [ l ] d\gamma^{[l]} dγ[l]。尽管严格来说,因为你要去掉𝑏,这部分其实已经去掉了。最后,你更新这些参数: w [ l ] w^{[l]} w[l]= w [ l ] − α d w [ l ] w^{[l]} − \alpha dw^{[l]} w[l]αdw[l],和以前一样, β [ l ] \beta^{[l]} β[l]= β [ l ] − α d β [ l ] \beta^{[l]} −\alpha d\beta^{[l]} β[l]αdβ[l],对于𝛾也是如此 γ [ l ] \gamma^{[l]} γ[l]= γ [ l ] − α d γ [ l ] \gamma^{[l]} − \alpha d\gamma^{[l]} γ[l]αdγ[l]

如果你已将梯度计算如下,你就可以使用梯度下降法了,这就是我写到这里的,但也适用于有 Momentum、RMSprop、Adam 的梯度下降法。与其使用梯度下降法更新 mini-batch,你可以使用这些其它算法来更新,我们在之前几个星期中的视频中讨论过的,也可以应用其它的一些优化算法来更新由 Batch 归一化添加到算法中的 β \beta β γ \gamma γ参数。

在这里插入图片描述
我希望,你能学会如何从头开始应用 Batch 归一化,如果你想的话。如果你使用深度学习编程框架之一,我们之后会谈。希望,你可以直接调用别人的编程框架,这会使 Batch归一化的使用变得很容易。

现在,以防 Batch 归一化仍然看起来有些神秘,尤其是你还不清楚为什么其能如此显著的加速训练,我们进入下一个视频,详细讨论 Batch 归一化为何效果如此显著,它到底在做什么。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TENT: FULLY TEST-TIME ADAPTATION BY ENTROPY MINIMIZATION--论文笔记

论文笔记 资料 1.代码地址 https://github.com/DequanWang/tent 2.论文地址 https://arxiv.org/abs/2006.10726 1论文摘要的翻译 在这种完全测试时适应的情况下,模型只有测试数据和自身参数。我们建议通过测试熵最小化(tent)进行适应&…

windows查看mysql的版本(三种方法)

方法一:在win r 打开 cmd,在cmd命令状态下:mysql --help 回车即可 方法二:在mysql客户端窗口状态下:输入status并回车即可 在计算机开始菜单搜索以上应用打开即可进入mysql客户端窗口。 方法三:在mys…

python2.x版本安装、安装pip

文章目录 一、安装python二、安装pip2.1、pip简介2.2、pip安装2.3、no such option: -e2.4、pip卸载2.5、pip扩展 本文讲解在windows系统装安装python2.7.13版本 一、安装python 1.下载安装包,官网链接地址:https://www.python.org/downloads/ 直接在…

寻找峰值 ---- 二分查找

题目链接 题目: 分析: 因为题目中要找的是任意一个峰值即可, 所以和<山脉数组的峰值索引>这道题差不多因为峰值左右都小于峰值, 所以具有"二段性", 可以使用二分查找算法如果nums[mid] < nums[mid 1], mid一定不是峰值, 所以left mid 1如果nums[mid] &…

java技术:spring-secrity实现认证、授权

目录 一、依赖 二、逻辑图 三、代码设计 1、WebSecurityConfigurerAdapter的实现类 2、设计登录接口 config配置&#xff1a; 1&#xff09;UserDetailsService实现类重写&#xff1a; 2&#xff09;书写登录实现类&#xff08;调用authenticationManager、可以与后面的…

MariaDB 给指定列值自动加密(持久数据加触发器)

文章目录 代码插入时&#xff0c;自动加密更新时&#xff0c;自动加密查看触发器数据操作示例update数据取出解密取 注意一次尝试&#xff0c;看加密后数据长度 参考链接&#xff1a; 一篇非常好的讲解触发器的文章&#xff1a;示例、原理MySQL/MariaDB触发器。 用触发器自动加…

Android App启动流程和源码详解

前言 之前看了些App启动流程的文章&#xff0c;但是看得很浅显&#xff0c;隔了没多久就忘了&#xff0c;自己抓耳挠腮的终于看完了&#xff0c;看得头疼哦。因为很多是个人理解&#xff0c;大哥们主打一个7分信&#xff0c;2分思考&#xff0c;1分怀疑哈。 主要看的源码是An…

CPP Con 2020:Type Traits I

先谈谈Meta Programming 啥是元编程呢&#xff1f;很简单&#xff0c;就是那些将其他程序当作数据来进行处理和传递的编程&#xff08;私人感觉有点类似于函数式&#xff1f;&#xff09;这个其他程序可以是自己也可以是其他程序。元编程可以发生在编译时也可以发生在运行时。…

27寸2K显示器 - HKC G27H2

HKC G27H2是一款面向电竞市场的高性能显示器&#xff0c;以其2K分辨率和180Hz的刷新率作为主要卖点&#xff0c;旨在为玩家提供流畅而清晰的视觉体验。配备HDR 400技术和95% DCI-P3色域覆盖&#xff0c;这款显示器还支持升降旋转支架&#xff0c;为用户提供了高度的人体工程学适…

微软开源多模态大模型Phi-3-vision,微调实战来了

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型& AIGC 技术趋势、大模型& AIGC 落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了…

继承初级入门复习

注意&#xff1a;保护和私有在类中没有区别&#xff0c;但是在继承中有区别&#xff0c;private在继承的子类不可见&#xff0c;protect在继承的子类可见 记忆方法&#xff1a;先看基类的修饰符是private&#xff0c;那都是不可见的。如果不是&#xff0c;那就用继承的修饰和基…

知了传课Flask学习(持续更新)

一、基础内容 1.Flask快速应用 pip install flask from flask import Flaskapp Flask(__name__)app.route(/) def index():return Hello worldif __name__ __main__:app.run() 2.debug、host、port配置 from flask import Flask,requestapp Flask(__name__)app.route(/) d…

在洁净实验室设计装修中怎么选择合适实验室家具?

在现代科学研究和技术开发中&#xff0c;洁净实验室装修设计成为了确保实验准确性和安全性的重要因素。洁净实验室需要提供一个无尘、无菌、受控的环境&#xff0c;而在洁净实验室装修设计这个过程中&#xff0c;如何选择合适的实验室家具就显得尤为重要&#xff0c;因为它直接…

第一行代码 按书配置Menu不出来

问题&#xff1a;按照书本配置Menu&#xff0c;就是不出来 页面activity 源码 重写了&#xff1a;onCreateOptionsMenu(), onOptionsItemSelected() package com.example.lanidemoktimport android.os.Bundle import android.util.Log import android.view.Menu import andro…

欢乐钓鱼大师攻略大全,游戏自动辅助,钓鱼大全!

欢迎来到《欢乐钓鱼大师》的攻略大全&#xff01;本文将为你详细介绍游戏中的各类玩法、技巧和注意事项&#xff0c;帮助你快速掌握游戏精髓&#xff0c;成为一名真正的钓鱼大师。攻略内容包括新手鱼竿选择、锦标赛攻略、实用技巧、藏宝图玩法、箱子开法等多个方面。让我们一起…

个人博客网站开发笔记3

文章目录 前言p4 Front Matterp5 配置文件p6 命令p7 部署新的教学视频部署博客到github找视频教程也是一个技能详细步骤安装主题安装渲染器修改主题创建gitub仓库生成密钥验证密钥是否匹配修改config文件推送到github 前言 主要是安装啥的比较费劲 现在已经比较简单了感觉 之…

面试问题小结

说说你的项目&#xff0c;从里面学到啥了&#xff08;随便说&#xff09; CAS 线程池 的各个方面 线程咋创建&#xff08;4种方式&#xff09; 说一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B树中咋存储的&#xff08;类似下面的图&#xff0c;变通一下就行了&a…

WXML模板语法-事件绑定

一、 1.事件 事件是渲染层到逻辑层的通讯方式&#xff0c;通过事件可以将用户在渲染层产生的行为&#xff0c;反馈到逻辑层进行业务的处理 2.小程序中常用的事件 3.事件对象的属性列表 当事件回调触发的时候&#xff0c;会收到一个事件对象event&#xff0c;其属性为&#x…

一文带你入门ini格式

引入: 以蜂鸣器为例&#xff0c;每次我们增加新的设备&#xff0c; 都需要添加两个新文件: 修改程序代码&#xff0c;手动添加: 缺点: 不利于维护 设备类节点直接通过ini文件配置 什么是.ini文件 ini文件通常以纯文本形式存在&#xff0c;并且包含了一个或多个节&#xff08;se…

快速搭建流媒体服务

1、安装流媒体服务 源码地址&#xff1a;https://gitee.com/ossrs/srs 本次采用docker安装 docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 查看运行效果&#xff…