机器学习课程学习周报十一

news2025/1/8 3:53:40

机器学习课程学习周报十一

文章目录

  • 机器学习课程学习周报十一
    • 摘要
    • Abstract
    • 一、机器学习部分
      • 1.1 再探GAN的数学原理
        • 1.1.1 似然与概率
        • 1.1.2 GAN和最大似然估计
        • 1.1.3 最大后验概率
      • 1.2 WGAN
      • 1.3 GAN的性能评估方法
      • 1.4 条件型生成
    • 总结

摘要

本周的学习主要围绕生成对抗网络(GAN)的数学原理及其在机器学习中的应用展开。重点探讨了似然与概率的区别,GAN与最大似然估计的关系,以及如何通过训练生成器和判别器来最小化生成数据与真实数据的散度。此外,介绍了Wasserstein GAN(WGAN)对JS散度缺陷的改进,以及GAN性能评估的方法,如Inception分数和Fréchet Inception距离(FID)。最后,了解了条件生成模型在生成图像时的应用。

Abstract

This week’s study focuses on the mathematical principles of Generative Adversarial Networks (GANs) and their applications in machine learning. The distinction between likelihood and probability, the relationship between GANs and maximum likelihood estimation, and how to minimize the divergence between generated and real data by training generators and discriminators are explored. Additionally, improvements of Wasserstein GAN (WGAN) over the shortcomings of JS divergence and methods for evaluating GAN performance, such as the Inception Score and Fréchet Inception Distance (FID). Finally, I gained knowledge of the conditional generative model when generating images.

一、机器学习部分

1.1 再探GAN的数学原理

1.1.1 似然与概率

似然函数(likelihood function,通常简写为likelihood),概率(probability)

  • 概率是在特定环境下某件事情发生的可能性,也就是结果没有产生之前依据环境所对应的参数来预测某件事情发生的可能性。 比如抛硬币,抛之前我们不知道最后是哪一面朝上,但是根据硬币的性质我们可以推测任何一面朝上的可能性均为50%,这个概率只有在抛硬币之前才是有意义的,抛完硬币后的结果便是确定的。
  • 而似然刚好相反,是在确定的结果下去推测产生这个结果的可能环境(参数)。 还是抛硬币的例子,假设我们随机抛掷一枚硬币1,000次,结果500次硬币人头朝上,500次数字朝上(实际情况一般不会这么理想,这里只是举个例子),我们很容易判断这是一枚标准的硬币,两面朝上的概率均为50%,这个过程就是我们运用出现的结果来判断这个事情本身的性质(参数),也就是似然。

通俗来说,似然是:给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参数,即“模型已定,参数未知”。例如,我们知道这个分布是正态分布,但是不知道均值和方差;或者是二项分布,但是不知道均值。

概率和似然的数学表达

P ( X ∣ θ ) P(X|\theta ) P(Xθ)

P ( X ∣ θ ) P(X|\theta ) P(Xθ)是条件概率的表示方法,表示在 θ \theta θ的前提下,事件 X X X发生的概率。

L ( θ ∣ X ) L(\theta |X) L(θX)
L ( θ ∣ X ) L(\theta |X) L(θX)表示已知结果 X X X,参数为 θ \theta θ对应的概率,这个式子中 θ \theta θ是变量。

求似然的目的是估计 θ \theta θ,如果估计的 θ \theta θ与真实的 θ \theta θ一致,则似然和概率在数值上是相等的:

L ( θ ∣ X ) = P ( X ∣ θ ) L(\theta |X) = P(X|\theta ) L(θX)=P(Xθ)

两者在这种情况下,数值相同,但意义并不相同。 L L L是关于 θ \theta θ的函数,而 P P P则是关于 X X X的函数,两者从不同的角度描述同一件事。

(参考:概率和似然,终于懂了)

1.1.2 GAN和最大似然估计

最大似然估计:

  • 给定一个真实的数据分布,写为 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x),我们并不知道这个分布的公式不知道这个分布长什么样子,但是我们可以从这个分布中采样出样本(例如我们其实并不知道某一图片数据集中图片的分布,但是我们可以从中任意地抽取样本)

  • 然后我们要去找一个分布,写为 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ),这个分布的形状是由参数所决定的

    • 例如, P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)是高斯混合模型, θ \theta θ就是高斯分布函数中的均值和方差

    • 我们希望找到一组参数 θ ∗ {\theta ^*} θ,能使分布 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)尽可能地接近真实的数据分布 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x)

  • 具体的做法为:

    • 先从 P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x)中采样一些数据样本 x 1 {x^1} x1 x 2 {x^2} x2 x m {x^m} xm
    • 计算每一个数据样本 x i {x^i} xi P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ)这个分布抽出的概率,表示为 P G ( x i ; θ ) {P_G}({x^i};\theta ) PG(xi;θ)
    • 找一组参数 θ ∗ {\theta ^*} θ使得 P G ( x ; θ ) {P_G}(x;\theta ) PG(x;θ) P d a t a ( x ) {P_{{\rm{data}}}}(x) Pdata(x)越接近越好,就是每一个数据样本的 P G ( x i ; θ ) {P_G}({x^i};\theta ) PG(xi;θ)值越大越好,将概率值乘在一起得到这个似然函数: L = ∏ i = 1 m P G ( x i ; θ ) L = \prod\limits_{i = 1}^m {{P_G}({x^i};\theta )} L=i=1mPG(xi;θ)
    • 找一组参数 θ ∗ {\theta ^*} θ,使得上述的似然函数值最大化,则可以估计出真实的数据分布。
  • 接下来就是求参数 θ ∗ {\theta ^*} θ

在这里插入图片描述

如何确定 P G {P_G} PG这个分布?

例子中,我们假设 P G {P_G} PG高斯混合模型Gaussian Mixture Model),这个模型显然有很多限制,不能代表一种普遍的分布。因此在GAN的论文中,我们把 P G {P_G} PG换成一个神经网络。GAN中的生成器就是一个网络,其定义了概率分布 P G {P_G} PG
在这里插入图片描述

图中的 P G ( x ) {P_G(x)} PG(x)就是我们目前的讨论对象,现在这个产生这个分布的不是固定的概率分布公式而是一个生成器网络。而在生成器网络的前端,一般都会有一个采样输入 z z z,这个分布叫做Prior Distribution,图里是正态分布,有人也许会用均匀分布等等,这个分布的选用对最后的影响不大,因为生成器网络会将其转变为各式各样的复杂分布。回到前面讨论的问题,如何找这个分布 P G {P_G} PG,现在的目标就是找的这个 P G {P_G} PG也就是生成器,要让 P G {P_G} PG P d a t a {P_{data}} Pdata散度Divergence)最小化。

接着问题是 P G {P_G} PG P d a t a {P_{data}} Pdata的分布函数我们都是不知道的,因此无法计算Divergence,更无法去最小化这个Divergence。然而GAN的算法能解决这个问题,从数据集 P d a t a {P_{data}} Pdata中采样相当数量的图片,从生成器中采样相当数量的生成图片,然后训练判别器来解决最小化Divergence的问题,训练判别器就是相当于训练一个二元的分类器,希望能将真实图片与生成图片很好地区分开,判别器的训练结果能反应两个分布的散度(差异性),原因是真实图片与生成图片越能很好地区分,判别器的目标函数就大,表明散度很大差异很大,判别器越不能很好地区分,目标函数就小,表面散度很小差异很小。

判别器的目标函数如下所示,目标函数为交叉熵的负数,因此最小化分类器的交叉熵就是在最大化判别器的目标函数,再找出最大化判别器目标函数时的判别器参数 D ∗ {D^*} D。最大化目标函数所得到的值与JS散度有关,证明如下:

在这里插入图片描述

因此可将 G ∗ = a r g min ⁡ G D i v ( P G , P d a t a ) {G^*} = \mathop{arg {\min }}\limits_G Div({P_G},{P_{data}}) G=GargminDiv(PG,Pdata)中的divergence换成 m a x D V ( D , G ) \mathop{max }\limits_D V(D,G) DmaxV(D,G),从而得到 G ∗ = a r g min ⁡ G m a x D V ( D , G ) {G^*} = \mathop{arg {\min }}\limits_G \mathop{max }\limits_D V(D,G) G=GargminDmaxV(D,G)

使用采样代替期望:

在判别器的目标函数中:

V ( D , G ) = E x ∼ P d a t a [ log ⁡ D ( x ) ] + E x ∼ P G [ log ⁡ ( 1 − D ( x ) ) ] V(D,G) = {E_{x \sim {P_{data}}}}\left[ {\log D(x)} \right] + {E_{x \sim {P_G}}}\left[ {\log (1 - D(x))} \right] V(D,G)=ExPdata[logD(x)]+ExPG[log(1D(x))]

分别从 P d a t a ( x ) {P_{data}}(x) Pdata(x)中采样 { x 1 , x 2 , … , x m } \left\{ {{x^1},{x^2}, \ldots ,{x^m}} \right\} {x1,x2,,xm},从 P G ( x ) {P_G}(x) PG(x)采样 { x ~ 1 , x ~ 2 , … , x ~ m } \left\{ {{{\tilde x}^1},{{\tilde x}^2}, \ldots ,{{\tilde x}^m}} \right\} {x~1,x~2,,x~m},并将 V ( D , G ) V(D,G) V(D,G)写为:

V ~ = 1 m ∑ i = 1 m log ⁡ D ( x i ) + 1 m ∑ i = 1 m log ⁡ ( 1 − D ( x ~ i ) ) \tilde V = \frac{1}{m}\sum\limits_{i = 1}^m {\log } D({x^i}) + \frac{1}{m}\sum\limits_{i = 1}^m {\log (1 - D({{\tilde x}^i}))} V~=m1i=1mlogD(xi)+m1i=1mlog(1D(x~i))

所以实际上是求 a r g max ⁡ D V ~ \mathop{arg {\max }}\limits_D \tilde V DargmaxV~

解minmax问题:

在这里插入图片描述

假设现在只有3种生成器,3张图代表了3种不同的生成器,图的横坐标代表不同的判别器,图的纵坐标代表 V ( D , G ) V(D,G) V(D,G)的值。先算 m a x D V ( D , G ) \mathop{max} \limits_D V(D,G) DmaxV(D,G) 就是找每个图中 V ( D , G ) V(D,G) V(D,G)的最大值点,然后算 min ⁡ G max ⁡ D V ( D , G ) \mathop{\min }\limits_G \mathop{\max }\limits_D V(D,G) GminDmaxV(D,G)就是找这3个点中 V ( D , G ) V(D,G) V(D,G)最小的那个点,找最小是因为 m a x D V ( D , G ) \mathop{max }\limits_D V(D,G) DmaxV(D,G)的数值就代表了 P G {P_G} PG P d a t a {P_{data}} Pdata的Divergence。

实际上GAN训练判别器和训练生成器的过程就是在解这min max的问题,解这个问题的目的就是要最小化生成器生成的图片与真实图片的JS散度,使用梯度下降法解这个问题:用 L ( G ) L(G) L(G)代表 max ⁡ D V ( D , G ) \mathop{\max }\limits_D V(D,G) DmaxV(D,G),则找最好的生成器是 θ G ← θ G − η ∂ L ( G ) / ∂ θ G {\theta _G} \leftarrow {\theta _G} - \eta \partial L(G)/\partial {\theta _G} θGθGηL(G)/θG
在这里插入图片描述

L ( G ) L(G) L(G)中含有 max ⁡ D \mathop{\max }\limits_D Dmax,因此这里用分段函数表示,在做梯度下降时 L ( G ) L(G) L(G)是可以微分的,上图的f(x)分段函数是 L ( G ) L(G) L(G)的示例。

梯度下降中,先给定一个 G 0 {G_0} G0,接下来算 G 0 {G_0} G0 L ( G ) L(G) L(G)的梯度,这一步要先找 D 0 ∗ D_0^* D0最大化 V ( D , G ) V(D,G) V(D,G)(使用梯度上升法),然后得到 L ( G ) L(G) L(G)再算 G 0 {G_0} G0 L ( G ) L(G) L(G)的梯度,再得到 G 1 {G_1} G1。此时再重新找一个 D 1 ∗ D_1^* D1,因为在分段函数中可能已经移动了区域, L ( G ) L(G) L(G)是求max, L ( G ) L(G) L(G)的函数可能已经变化了,因此是重新找一个 D 1 ∗ D_1^* D1找到现在的 L ( G ) L(G) L(G),再算 G 1 {G_1} G1 L ( G ) L(G) L(G)的梯度,从而优化 G 1 {G_1} G1得到 G 2 {G_2} G2,以此循环往复。
在这里插入图片描述

1.1.3 最大后验概率

最大似然估计和最大后验估计有相似的地方,最大后验估计又与贝叶斯公式有关,所以在这里对比着学习。根据贝叶斯公式,后验概率公式为:

P ( θ ∣ X ) = P ( X ∣ θ ) P ( θ ) P ( X ) P(\theta |X) = \frac{{P(X|\theta )P(\theta )}}{{P(X)}} P(θX)=P(X)P(Xθ)P(θ)

其中 P ( θ ∣ X ) P(\theta |X) P(θX)表示后验概率,分子上的 P ( X ∣ θ ) P(X|\theta) P(Xθ)的数值等于似然 L ( θ ∣ X ) L(\theta |X) L(θX),分子上的 P ( θ ) P(\theta) P(θ)是先验概率, P ( X ) P(X) P(X)是边际似然,边际似然表示观测数据 X X X在所有可能参数值下出现的总概率,边际似然的计算对于连续参数来说: P ( X ) = ∫ P ( X ∣ θ ) P ( θ ) d θ P(X) = \int {P(X|\theta )P(\theta )d} \theta P(X)=P(Xθ)P(θ)dθ对于离散参数来说: P ( X ) = ∑ θ P ( X ∣ θ ) P ( θ ) P(X) = \sum\limits_\theta {P(X|\theta )P(\theta )} P(X)=θP(Xθ)P(θ)

在进行最大后验估计的时候,会把分母省略,只对分子部分求最大:

a r g max ⁡ θ P ( θ ∣ X ) = a r g max ⁡ θ P ( X ∣ θ ) P ( θ ) \mathop{arg {\max }} \limits_\theta P(\theta |X) = \mathop{arg {\max }}\limits_\theta P(X|\theta )P(\theta ) θargmaxP(θX)=θargmaxP(Xθ)P(θ)

最大后验估计的优化目标是 P ( θ ∣ X ) P(\theta |X) P(θX),即给定了观测值 X X X之后使模型参数 θ \theta θ出现的概率最大。相比于最大似然估计方法,最大后验概率考虑了参数 θ \theta θ的先验概率 P ( θ ) P(\theta) P(θ),所以就算似然概率 P ( X ∣ θ ) P(X|\theta) P(Xθ)很大,但是如果参数 θ \theta θ出现的概率小,也更倾向于不考虑模型参数为 θ \theta θ,这是二者的区别。

似然函数与后验概率在表示上有相似的地方:

似然: L ( θ ∣ X ) L(\theta |X) L(θX)

后验概率: P ( θ ∣ X ) P(\theta |X) P(θX)

计算似然: L ( θ ∣ X ) L(\theta |X) L(θX) = P ( X ∣ θ ) P(X|\theta ) P(Xθ)

1.2 WGAN

JS散度同时也存在问题,JS散度的两个输入 P G {P_G} PG P d a t a {P_{data}} Pdata之间的重叠部分往往非常少。

  • 这是因为图片其实是高维空间里的低维流形,因为在高维空间中随便采样一个点,它通常都没有办法构成一个人物的头像图片,所以人物头像图片的分布,在高维的空间中其实是非常狭窄的。以二维空间为例,图片的分布可能就是二维空间的一条线,也就是 P G {P_G} PG P d a t a {P_{data}} Pdata都是二维空间中的两条直线。而二维空间中的两条直线,除非它们刚好重合,否则它们相交的范围是几乎可以忽略的。
  • 从另一个角度解释,我们从来都不知道 P G {P_G} PG P d a t a {P_{data}} Pdata的具体分布,因为其源于采样,所以也许它们是有非常小的重叠分布范围。比如采样的点不够多,就算是这两个分布实际上很相似,也很难有任何的重叠的部分。

在这里插入图片描述

上图中表明了,JS散度的缺陷,当两个分布不重叠时,不管两个分布的中心距离有多近,其JS散度都是常数 log ⁡ 2 \log 2 log2,这样就会存在不公平的问题。
在这里插入图片描述

JS 散度的值并不能很好地反映两个分布的差异,对于两个没有重叠的分布,JS散度的值都为 log ⁡ 2 \log 2 log2,与具体的分布无关。因此更换了一种衡量两个分布相似程度的方式,即Wasserstein距离,这种GAN被称为Wasserstein GANWGAN)。
在这里插入图片描述

Wasserstein距离的想法如下,假设两个分布分别为P和Q,我们想要知道这两个分布的差异,我们可以想像有一个推土机,它可以把P这边的土堆挪到Q这边,那么推土机平均走的距离就是 Wasserstein距离。在这个例子里面,我们假设P集中在一个点,Q集中在一个点,如果P和Q的分布不是集中在一个点,而是分布在一个区域,那么我们就要考虑所有的可能性,也就是所有的推土机的走法,然后看平均走的距离是多少,这个平均走的距离就是 Wasserstein距离。Wasserstein距离可以想象为有一个推土机在推土,所以 Wasserstein距离也称为推土机距离(Earth Mover’s DistanceEMD)。

在这里插入图片描述

如果是更复杂的分布,如上图,我们可以把P的土搬到Q来,也可以反过来把Q的土搬到P。两种分布计算距离就有很多不同的方法,即不同的“移动”方式,从中计算算出来的距离,即推土机平均走的距离就不一样。对于左边这个例子,推土机平均走的距离比较少;右边这个例子因为舍近求远,所以推土机平均走的距离比较大。为了让Wasserstein距离只有一个值,我们将距离定义为穷举所有的“移动”方式,然后看哪一个推土的方法可以让平均的距离最小,那个最小的值才是Wasserstein距离。

在这里插入图片描述

比较Wasserstein距离和JS散度,假设两个分布 P G {P_G} PG P d a t a {P_{data}} Pdata它们的距离是 d 0 {d_0} d0,那么Wasserstein距离算出来就是 d 0 {d_0} d0;假设两个分布 P G {P_G} PG P d a t a {P_{data}} Pdata它们的距离是 d 1 {d_1} d1,那么Wasserstein距离算出来就是 d 1 {d_1} d1。而对于JS散度来说,只要两个分布没有重叠的地方,算出的差异就一直是 log ⁡ 2 \log 2 log2

1.3 GAN的性能评估方法

评估GAN生成图片质量的方法,一开始是训练一个图像的分类系统,然后把GAN产生出来的图片输入到这个图像的分类系统里面,看它产生什么样的结果。这个图像分类系统的输 是一张图片,输出是一个概率分布,这个概率分布代表说这张图片是猫的概率、狗的概率、斑马的概率等等。如果这个概率分布越集中,就代表现在产生的图片可能越好。如果生成出来的图片是一个四不像,图像识别系统就会非常的困惑,它产生出来的这个概率分布就会是非常平均的分布。

在这里插入图片描述

光用这个做法会被一个叫做模式崩塌mode collapse)的问题骗过去。模式崩塌是指在训练 GAN 的过程中遇到的一个状况,假设上图蓝色的星星是真正的数据的分布,红色的星星是GAN的模型的分布。我们会发现生成式的模型它输出来的图片来来去去就是那几张。这个问题目前还没有很好的解决方法。

此外还有Inception分数,用Inception网络来做评估,用Inception网络度量质量和多样性。如果质量高并且多样性又大,那Inception分数就会比较大。

Fréchet Inception distance (FID)是目前通常使用的方法,先把生成器产生出来的人脸图片,丢到 InceptionNet 里面,让 Inception 网络输出它的类别。这里我们需要的不是最终的类别,而是进入Softmax之前的隐藏层的输出向量,这个向量的维度是上千维的,代表这个图片。我们就把它降维后画在二维的平面上,接下来我们假设真实的图片和生成的图片都服从高斯分布,然后去计算这两个分布之间的 Fréchet的距离。两个分布间的距离越小越好,距离越小越代表这两组图片越接近,也就是产生出来的品质越高。

1.4 条件型生成

前面介绍的GAN中的生成器,都没有输入任何的条件,只输入了一个随机的分布,然后产生出一张图片。为了进一步可以操控生成器的输出,我们给予其一个额外的输入条件 x x x,让生成器根据条件 x x x和输入的采样 z z z来产生输出 y y y

如果按照之前的思路,判别器就是使用一张图片 y y y当作输入,并输出一个数值,这个数值代表输入的图像多像真实的图片。在训练集中,判别器将要看到真实的图片就标为1,看到生成的图片就标0,然后反复训练判别器和生成器。但是这样的方法没办法解决条件型GAN的问题以文字条件生成图片为例,如果只将图片 y y y当作输入的话,生成器会学到的东西是只要产生清晰的图片骗过判别器就可以了,而不再管输入的文字条件 x x x。因此,在训练判别器的时候,不仅要输入图片 y y y,还需要文字条件 x x x,同时,判别器需要计算图片 y y y与文字条件 x x x的匹配程度,对于匹配程度高的数据对判别器就输出一个较高的分数,越接近1。对于匹配程度低的数据对,就输出一个较低的分数,越接近0。

GAN根据不同条件的可控生成:Image-to-Image Translation with Conditional Adversarial Networks(在条件生成中,如果用supervised learning的方法进行img-to-img的结果会比较模糊,这是因为同样的输入可能对应不一样的输出(使用监督学习训练一个自动闯关游戏,在训练数据中遇到转角将要转弯时,同时含有向左转和向右转的数据,模型就会学到向左转和向右转都是对的,最后的结果就会比较平均既要往左又要往右,导致的图片模糊),模型学到的结果平均起来,就变得模糊。如果单独用GAN,GAN的创造力太强可能会生成条件里没有要求的部分。因此使用GAN+supervised learning的结果会比较好。)

Talking Head Generation: Few-Shot Adversarial Learning of Realistic Neural Talking Head Models

总结

本周解决了上周在学习GAN时的疑难数学问题,GAN的评估问题仍然值得深思。尽管现在的Stable Diffusion生成的图片更加精细,但也没有很好的评价指标。或许我可以从建立GAN的评估体系的过程中,学习经验并尝试为Diffusion模型建立合适的评估体系。

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

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

相关文章

详细介绍msvcr120.dll文件以及修复msvcr120.dll丢失的几种方法

遇到“msvcr120.dll丢失”错误通常会在尝试运行某些程序时发生,这类错误提示“程序无法启动,因为您的计算机缺少msvcr120.dll文件。”这可能导致许多用户感到困扰和不便。有几个步骤可以帮助你轻松修复“msvcr120.dll丢失”错误,保证应用程序…

Linux新建虚拟机Ubuntu详解

1. 打开软件,点击新建虚拟机; 2. 选择典型; 3. 点击稍后安装操作系统后,点击下一步; 4. 选择客户机操作系统以及版本,这里我们选择Ubuntu 64位; 5. 给虚拟机命名以及新建文件夹存放虚拟机位置&…

bat批处理实现从特定文件夹中提取文件内容并以父文件夹名存储

1、需求分析 标题是bat批处理实现从特定文件夹中提取文件内容并以父文件夹名存储。这里面我们要做的工作是: ①、批处理脚本使用的是bat文件; ②、文件夹下面有很多子文件夹,然后子文件夹下仍然有相同的文件结构,我们需要从三级…

创业者必读!选择拍卖源码还是自建开发,哪种方案更安全?

在当今数字化时代,拍卖平台作为一种独特的电子商务模式,正逐渐成为人们关注的焦点。随着互联网技术的发展,网络安全问题变得越来越突出。如何保障用户数据安全,防止信息泄露及攻击事件的发生,已经成为拍卖软件开发者面…

面试必备:接口自动化测试精选面试干货

一、 请问你是如何做接口测试的? 大体来说,经历以下过程:接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说,接口测试流程分成以下九步: 第一步&am…

HMI设计:嵌入式设备和电脑的差异化,工控领域首选。

嵌入式设备属于专机专用,电脑是通用,从性能、用途、特殊能力、成本、通信上嵌入式设备完全优于电脑,是工控领域的首选。 嵌入式设备和电脑在很多方面有着显著的差异,主要体现在以下几个方面: 1. 设计用途&#xff1a…

算法练习题17——leetcode54螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 代码 import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋顺序遍历的结果List<Integer>…

神经网络训练不起来怎么办(零)| General Guidance

摘要&#xff1a;模型性能不理想时&#xff0c;如何判断 Model Bias&#xff0c; Optimization&#xff0c; Overfitting 等问题&#xff0c;并以此着手优化模型。在这个分析过程中&#xff0c;我们可以对Function Set&#xff0c;模型弹性有直观的理解。关键词&#xff1a;模型…

SnapGene 2.3.2软件下载安装教程百度网盘分享链接地址

SnapGene简介&#xff1a;SnapGene 2.3.2软件下载安装教程百度网盘分享链接地址&#xff0c;SnapGene 是一款超厉害的分子生物学软件。它最初由美国公司开发&#xff0c;后来换了东家。 这款软件功能多样&#xff0c;在序列编辑分析方面表现出色&#xff0c;能轻松搞定 DNA 序列…

Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析

目录 一、Dialog和DialogFragment的区别 Android在DialogFragment推出后&#xff0c;就已经不推荐继续使用Dialog&#xff0c;可替换为DialogFragment&#xff1a; 更好的生命周期管理&#xff1a;DialogFragment能够自动处理Activity的生命周期事件&#xff0c;确保对话框在…

Python 从入门到实战9(集合)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中字典的定义及相关操作。今天…

模型训练套路(一)

一、训练完整使用网络模型 import torch import torchvision from torch import nn from torch.utils.data import DataLoaderfrom model1 import* # 此处的引用为此文在实现过程中所解决的问题 train_data torchvision.datasets.CIFAR10(root "../data", trainT…

63、Python之函数高级:装饰器缓存实战,优化递归函数的性能

引言 通过前面的文章&#xff0c;我们已经掌握了Python中常用的装饰器的使用技巧&#xff0c;这篇文章中&#xff0c;我们通过一个装饰器的实战案例&#xff0c;来进一步加深对装饰器的适用场景的理解。 本文的主要内容有&#xff1a; 1、递归函数 2、递归实现斐波那契数列…

AWTK HTML View 控件更新

AWTK HTML View 控件基于 Lite HTML 实现&#xff0c;从最初的版本开始&#xff0c;3 年多过去了&#xff0c;Lite HTML 做了大量的更新&#xff0c;最近抽空将 AWTK HTML View 控件适配到最新版本的 Lite HTML&#xff0c;欢迎大家使用。 AWTK HTML View 控件。HTML View 控件…

SAP B1 基础实操 - 用户定义字段 (UDF)

目录 一、功能介绍 1. 使用场景 2. 操作逻辑 3. 常用定义部分 3.1 主数据 3.2 营销单据 4. 字段设置表单 4.1 字段基础信息 4.2 不同类详细设置 4.3 默认值/必填 二、案例 1 要求 2 操作步骤 一、功能介绍 1. 使用场景 在实施过程中&#xff0c;经常会碰见用户需…

Qt线程使用

嗨嗨嗨&#xff0c;今天又学到了新的知识——线程&#xff0c;这个玩意在项目中使用的频率是非常高的&#xff0c;毕竟电脑的主线程就那么一个&#xff0c;那么这也就是我们为啥要学习线程的原因。比如说&#xff0c;我们们的游戏&#xff0c;如果我们的游戏界面显示的同时我们…

【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】

奥迪A8提车交车仪式AE模板制作过程软件生成器素材 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片…

PD快充协议方案 及应用场景

快充协议诱骗原理主要依赖于快充协议芯片与供电端&#xff08;如PD充电器&#xff09;之间的握手通信&#xff0c;以申请所需要的电压与电流&#xff0c;确保充电过程安全、快速且高效。这种芯片通过内置的通讯模块与供电端通信&#xff0c;根据设备的实际需求调整输出电压和电…

大路灯护眼灯有必要吗安全吗?性价比高落地护眼灯推荐

大路灯护眼灯有必要吗安全吗&#xff1f;近几年来&#xff0c;随着生活节奏的加快&#xff0c;目前青少年的近视率呈现一个直线上升的趋势&#xff0c;其中占比达到了70%以上&#xff0c;并且最令人意外的是小学生竟然也占着比较大的比重&#xff0c;这一系列的数据不仅表明着近…

苍穹外卖学习笔记(一)

文章目录 开发环境搭建一. 前端环境搭建二. 后端环境搭建1.进入idea项目2.提交git仓库(推送github远程仓库)3.数据库环境搭建4.前后端联调(在源代码中项目已经实现登录功能)nginx反向代理好处: 三. 完善登录功能(md5加密存储)1.首先打开pojo模块中实体类的employee&#xff0c;…