【扩散模型Diffusion Model系列】0-从VAE开始(隐变量模型、KL散度、最大化似然与AIGC的关系)

VAE

VAE(Variational AutoEncoder),变分自编码器,是一种无监督学习算法,被用于压缩、特征提取和生成式任务。相比于GAN(Generative Adversarial Network),VAE在数学上有着更加良好的性质,有利于理论的分析和实现。

文章目录

  • VAE
    • 1 生成式模型的目标——KL散度和最大化似然MLE
    • 2 从AE到VAE
    • 3 VAE的损失函数
    • 4 结语

1 生成式模型的目标——KL散度和最大化似然MLE

生成式模型(Generative Model)的目标是学习一个模型,从一个简单的分布 p ( x ) p(x) p(x)中采样出数据 x x x,通过生成模型 f ( x ) f(x) f(x)来逼近真实数据的分布 p d a t a ( x ) p_{data}(x) pdata(x),并生成样本,实现了上面这一点即使我们所希望的结果。

自然,我们可以想到,生成模型最本质的目标就是最小化模型生成的样本分布 p θ ( x ) p_{\theta}(x) pθ(x)和真实样本分布 p d a t a ( x ) p_{data}(x) pdata(x)之间的KL散度
a r g m i n θ D K L ( p d a t a ( x ) ∣ ∣ p θ ( x ) ) = a r g m i n θ ∫ p d a t a ( x ) l o g p d a t a ( x ) p θ ( x ) = a r g m a x θ ∫ p d a t a ( x ) l o g p θ ( x ) 【 p d a t a ( x ) 无参数优化】 = a r g m a x θ E x ∼ p d a t a ( x ) [ log ⁡ p θ ( x ) ] 【期望的定义】 ≈ a r g m a x θ 1 m ∑ i = 1 m log ⁡ p θ ( x i ) 【从数据集中采样 m 个,估算期望,对应于训练过程】 = a r g m a x θ ∏ i = 1 m p θ ( x i ) 【最大化似然】 \begin{align} &\mathop{argmin}\limits_{\theta} \;D_{KL}(\,p_{data}(x)\,||\,p_{\theta}(x)\,) \nonumber \\=&\mathop{argmin}\limits_{\theta} \int p_{data}(x)\;log\,\frac{p_{data}(x)}{p_{\theta}(x)} \nonumber \\=&\mathop{argmax}\limits_{\theta} \int p_{data}(x)\;log\,{p_{\theta}(x)} \qquad\, 【p_{data}(x)无参数优化】\nonumber \\=&\mathop{argmax}\limits_{\theta}E_{x\sim p_{data}(x)}\left[\log{p_{\theta}(x)}\right] \qquad \, 【期望的定义】\nonumber \\\approx&\mathop{argmax}\limits_{\theta}\frac{1}{m}\sum\limits_{i=1}^{m}\log{p_{\theta}(x_{i})} \qquad \quad \;\; 【从数据集中采样m个,估算期望,对应于训练过程】\nonumber \\=&\mathop{argmax}\limits_{\theta} \prod\limits_{i=1}^{m}p_{\theta}(x_{i}) \qquad \qquad \qquad \;\,【最大化似然】\nonumber \end{align} ====θargminDKL(pdata(x)∣∣pθ(x))θargminpdata(x)logpθ(x)pdata(x)θargmaxpdata(x)logpθ(x)pdata(x)无参数优化】θargmaxExpdata(x)[logpθ(x)]【期望的定义】θargmaxm1i=1mlogpθ(xi)【从数据集中采样m个,估算期望,对应于训练过程】θargmaxi=1mpθ(xi)【最大化似然】

2 从AE到VAE

显然上述的生成式模型并不专门针对VAE,任何一个输出和输入相同分布的模型都可以得到此结论,那么不得不提的就是AE(AutoEncoder),诸如MAE、DAE、VQVAE等。

AE的目标是最小化重构误差,即重构误差越小,则表示模型生成的数据和真实数据的分布越接近,和上述描述的生成式模型目标一致,但AE之所以不能用于生成式模型,是因为AE的Bottleneck的分布实际上是未知的,我们无法凭空采样一个符合bottleneck分布的数据,所以AE不能直接用于生成式模型。

AE和VAE实际上都可以被视为一个隐变量模型 p ( x ∣ z ) p(x|z) p(xz)认为在真实数据分布之后,存在着一个隐变量 z z z,其分布为 p ( z ) p(z) p(z) x x x z z z之间存在一个隐变量连接,即 p ϕ ( x ∣ z ) p_{\phi}(x|z) pϕ(xz)
例如可以将所有的矩形视为一个真实分布 p ( x ) p(x) p(x),而所有的长和宽的分布视为 p ( z ) p(z) p(z),那么显然,当我们从 p ( z ) p(z) p(z)采样一个长宽 z 即 z ∼ p ( z ) z即z \sim p(z) zzp(z)时,事实上也采样到了一个矩形,这是因为我们认为存在明确的 p ϕ ( x ∣ z ) p_{\phi}(x|z) pϕ(xz),即矩形的宽和高和矩形的分布存在一个连接。

在AE中, z z z是bottleneck特征向量,很好地表征了原始数据的特征,因此可以利用Decoder即 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)进行复原,理论上如果我们可以采样到 z z z,那么就可以进行复原,但事实上我们不知道 z z z的分布,因此我们无法用AE进行生成式。

而在VAE中,我们希望通过Encoder的学习,将真实的后验分布 p ϕ ( z ∣ x ) p_{\phi}(z|x) pϕ(zx)进行近似,即 p θ ( z ∣ x ) p_{\theta}(z|x) pθ(zx),并且希望后验分布 p ϕ ( z ∣ x ) p_{\phi}(z|x) pϕ(zx)服从于正态分布 N ( 0 , I ) N(0,I) N(0,I),这样的话,在优化足够好的Encoder,即 p θ ( z ∣ x ) ≈ N ( 0 , I ) p_{\theta}(z|x) \approx N(0,I) pθ(zx)N(0,I)时,我们有:
p ( z ) = ∫ p ϕ ( z ∣ x ) p ( x ) d x = ∫ p θ ( z ∣ x ) p ( x ) d x = ∫ N ( 0 , I ) p ( x ) d x = N ( 0 , I ) ∫ p ( x ) d x = N ( 0 , I ) \begin{align} p(z)=&\int p_{\phi}(z|x)p(x)\,dx=\int p_{\theta}(z|x)p(x)\,dx\nonumber\\=&\int N(0,I)p(x)\,dx=N(0,I)\int p(x)dx=N(0,I)\nonumber \end{align} p(z)==pϕ(zx)p(x)dx=pθ(zx)p(x)dxN(0,I)p(x)dx=N(0,I)p(x)dx=N(0,I)
这样的话,我们就可以轻松地从正态分布中采样 z ∼ p ( z ) z\sim p(z) zp(z),为此我们必须考虑对“AE的bottleneck”进行修改,从而让 p θ ( z ∣ x ) p_{\theta}(z|x) pθ(zx)的分布近似于 N ( 0 , I ) N(0,I) N(0,I),这也是为什么VAE输出的是正态分布的参数 μ , σ 2 \mu,\sigma^2 μ,σ2

理论上,我们通过重参数技巧 x = μ + σ ϵ , ϵ ∼ N ( 0 , I ) x=\mu+\sigma\,\epsilon,\epsilon \sim N(0,I) x=μ+σϵ,ϵN(0,I),即可实现输出为 N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2)且将采样这一不可导的操作转为可导

若是不对编码器 p θ ( z ∣ x ) p_{\theta}(z|x) pθ(zx)加以限制,只使用MSE进行训练,VAE会逐渐退化为AE,因为网络一定会倾向于将 σ 2 → 0 \sigma^2 \rightarrow 0 σ20,因为这最有利于重建,那么我们最直接的想法就是使用另外2个MSE,强迫 μ → 0 , σ 2 → I \mu \rightarrow 0,\,\sigma^2\rightarrow I μ0,σ2I,但这样3个MSE之间的比例就会十分难以调整,容易顾此失彼,因此,我们继续从MLE出发,继续推导VAE的损失函数。

3 VAE的损失函数

承接第一节,我们已经确认了生成式网络的最终目标就是最大化 p θ ( x ) p_{\theta}(x) pθ(x)的似然,而正如常识所知,直接最大化 p θ ( x ) p_{\theta}(x) pθ(x)太过困难,我们采用隐变量模型建构,那么公式如下:
l o g p θ ( x ) = l o g p θ ( x ) ∫ p ϕ ( z ∣ x ) d z = ∫ p ϕ ( z ∣ x ) l o g p θ ( x ) d z = ∫ p ϕ ( z ∣ x ) l o g p θ ( x , z ) p θ ( z ∣ x ) d z 【条件概率的定义】 = ∫ p ϕ ( z ∣ x ) l o g p θ ( x , z ) p ϕ ( z ∣ x ) p θ ( z ∣ x ) p ϕ ( z ∣ x ) d z = ∫ p ϕ ( z ∣ x ) l o g p θ ( x , z ) p ϕ ( z ∣ x ) d z + ∫ p ϕ ( z ∣ x ) l o g p ϕ ( z ∣ x ) p θ ( z ∣ x ) d z = E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] + D K L ( p ϕ ( z ∣ x ) ∣ ∣ p θ ( z ∣ x ) ) ≥ E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] 【 K L 散度 ≥ 0 ,可利用 − l n x ≥ 1 − x 证明】 \begin{align} log p_{\theta}(x)&=log p_{\theta}(x) \int p_{\phi}(z|x)\,dz\nonumber \\&=\int p_{\phi}(z|x)\,log p_{\theta}(x)\,dz\nonumber \\&=\int p_{\phi}(z|x)\,log \frac{p_{\theta}(x,z)}{p_{\theta}(z|x)}\,dz\quad【条件概率的定义】\nonumber \\&=\int p_{\phi}(z|x)\,log \frac{p_{\theta}(x,z)\,p_{\phi}(z|x)}{p_{\theta}(z|x)\,p_{\phi}(z|x)}\,dz\nonumber \\&=\int p_{\phi}(z|x)\,log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}\,dz+\int p_{\phi}(z|x)\,log \frac{p_{\phi}(z|x)}{p_{\theta}(z|x)}\,dz\nonumber \\&=E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]+D_{KL}(\,p_{\phi}(z|x)\,||\,p_{\theta}(z|x)\,)\nonumber \\& \ge E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]\qquad\;【KL散度\ge0,可利用-lnx \ge 1-x证明】\nonumber \end{align} logpθ(x)=logpθ(x)pϕ(zx)dz=pϕ(zx)logpθ(x)dz=pϕ(zx)logpθ(zx)pθ(x,z)dz【条件概率的定义】=pϕ(zx)logpθ(zx)pϕ(zx)pθ(x,z)pϕ(zx)dz=pϕ(zx)logpϕ(zx)pθ(x,z)dz+pϕ(zx)logpθ(zx)pϕ(zx)dz=Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]+DKL(pϕ(zx)∣∣pθ(zx))Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]KL散度0,可利用lnx1x证明】
最终我们可认为损失函数为:
a r g m a x θ l o g p θ ( x ) = a r g m a x θ E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] \mathop{argmax}\limits_{\theta}\,log p_{\theta}(x) = \nonumber \mathop{argmax}\limits_{\theta} E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]\nonumber θargmaxlogpθ(x)=θargmaxEzpϕ(zx)[logpϕ(zx)pθ(x,z)]
L = − E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] L= -E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]\nonumber L=Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]
对于上式我们可以有2种理解:

  1. 最大化 p θ ( x ) p_{\theta}(x) pθ(x)转化为了最大化下界ELBO(Evidence Lower Bound),因此我们只需要去优化 E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}] Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]
  2. E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] = l o g p θ ( x ) − D K L ( p ϕ ( z ∣ x ) ∣ ∣ p θ ( z ∣ x ) ) E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]=log p_{\theta}(x)-D_{KL}(\,p_{\phi}(z|x)\,||\,p_{\theta}(z|x)\,) Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]=logpθ(x)DKL(pϕ(zx)∣∣pθ(zx)),最小化损失函数 L L L即最大化 E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}] Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]时,会最大化似然 l o g p θ ( x ) log p_{\theta}(x) logpθ(x),即让生成图片更真实的同时;最小化Encoder建模的 p θ ( z ∣ x ) p_{\theta}(z|x) pθ(zx)和真实隐变量后验分布 p ϕ ( z ∣ x ) p_{\phi}(z|x) pϕ(zx)之间的KL散度(当然是事实上是二者trade off)

若是我们使得 p θ ( z ∣ x ) → N ( 0 , I ) p_{\theta}(z|x)\rightarrow N(0,I) pθ(zx)N(0,I),即大功告成。于是我们继续分解:
E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] = ∫ p ϕ ( z ∣ x ) l o g p θ ( x , z ) p ϕ ( z ∣ x ) d z = ∫ p ϕ ( z ∣ x ) l o g p θ ( x ∣ z ) p ( z ) p ϕ ( z ∣ x ) d z = ∫ p ϕ ( z ∣ x ) l o g p θ ( x ∣ z ) d z + ∫ p ϕ ( z ∣ x ) l o g p ( z ) p ϕ ( z ∣ x ) d z = E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x ∣ z ) ] − D K L ( p ϕ ( z ∣ x ) ∣ ∣ p ( z ) ) ≈ E z ∼ p θ ( z ∣ x ) [ l o g p θ ( x ∣ z ) ] − D K L ( p θ ( z ∣ x ) ∣ ∣ p ( z ) ) \begin{align} E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]&=\int p_{\phi}(z|x)\,log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}\,dz\nonumber \\&=\int p_{\phi}(z|x)\,log \frac{p_{\theta}(x|z)\,p(z)}{p_{\phi}(z|x)}\,dz\nonumber \\&=\int p_{\phi}(z|x)\,log p_{\theta}(x|z)\,dz + \int p_{\phi}(z|x)\,log \frac{p(z)}{p_{\phi}(z|x)}\,dz\nonumber \\&=E_{z\sim p_{\phi}(z|x)}[log p_{\theta}(x|z)]-D_{KL}(\,p_{\phi}(z|x)\,||\,p(z)\,)\nonumber \\& \approx E_{z\sim p_{\theta}(z|x)}[log p_{\theta}(x|z)]-D_{KL}(\,p_{\theta}(z|x)\,||\,p(z)\,)\nonumber \end{align} Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]=pϕ(zx)logpϕ(zx)pθ(x,z)dz=pϕ(zx)logpϕ(zx)pθ(xz)p(z)dz=pϕ(zx)logpθ(xz)dz+pϕ(zx)logpϕ(zx)p(z)dz=Ezpϕ(zx)[logpθ(xz)]DKL(pϕ(zx)∣∣p(z))Ezpθ(zx)[logpθ(xz)]DKL(pθ(zx)∣∣p(z))
其中 E z ∼ p θ ( z ∣ x ) [ l o g p θ ( x ∣ z ) ] E_{z\sim p_{\theta}(z|x)}[log p_{\theta}(x|z)] Ezpθ(zx)[logpθ(xz)]为最大似然,我们假设最终为正态分布,最大似然就完全等价于最小化重建损失MSE
D K L ( p θ ( z ∣ x ) ∣ ∣ p ( z ) ) D_{KL}(\,p_{\theta}(z|x)\,||\,p(z)\,) DKL(pθ(zx)∣∣p(z))则为正则项,用于约束Encoder的输出,具体公式如下:
D K L ( p θ ( z ∣ x ) ∣ ∣ p ( z ) ) = − ∫ p ϕ ( z ∣ x ) l o g p ( z ) p ϕ ( z ∣ x ) d z = ∫ p ϕ ( z ∣ x ) [ z 2 2 − l o g 1 2 π − ( z − μ θ ( x ) ) 2 2 σ θ ( x ) 2 + l o g 1 2 π σ θ ( x ) 2 ] d z = 1 2 ∫ p ϕ ( z ∣ x ) [ z 2 − ( z − μ θ ( x ) σ θ ( x ) ) 2 − l o g σ θ ( x ) 2 ] d z = 1 2 [ − 1 + μ θ ( x ) 2 + σ θ ( x ) 2 − l o g σ θ ( x ) 2 ] 【 E ( z 2 ) = μ 2 + σ 2 ,用于解答 z 2 和 ( z − μ σ ) 2 】 \begin{align} D_{KL}(\,p_{\theta}(z|x)\,||\,p(z)\,)&=-\int p_{\phi}(z|x)\,log \frac{p(z)}{p_{\phi}(z|x)}\,dz\nonumber \\&=\int p_{\phi}(z|x)\,[\,\frac{z^2}{2}-log\frac{1}{\sqrt{2\pi}}-\frac{(z-\mu_{\theta}(x))^2}{2{\sigma_{\theta}(x)}^2}\,+log\frac{1}{\sqrt{2\pi{\sigma_{\theta}(x)}^2}}]dz\nonumber \\&=\frac{1}{2}\int p_{\phi}(z|x)\,[\,z^2-(\frac{z-\mu_{\theta}(x)}{{\sigma_{\theta}(x)}})^2\,-log{\sigma_{\theta}(x)}^2]dz\nonumber \\&=\frac{1}{2}[\,-1+{\mu_{\theta}(x)}^2+{\sigma_{\theta}(x)}^2-log{\sigma_{\theta}(x)}^2\,]\qquad\qquad【E(z^2)=\mu^2+\sigma^2,用于解答z^2和(\frac{z-\mu}{\sigma})^2】\nonumber \end{align} DKL(pθ(zx)∣∣p(z))=pϕ(zx)logpϕ(zx)p(z)dz=pϕ(zx)[2z2log2π 12σθ(x)2(zμθ(x))2+log2πσθ(x)2 1]dz=21pϕ(zx)[z2(σθ(x)zμθ(x))2logσθ(x)2]dz=21[1+μθ(x)2+σθ(x)2logσθ(x)2]E(z2)=μ2+σ2,用于解答z2(σzμ)2
综上,我们得到了VAE的损失函数如下:
L v a e = − E z ∼ p ϕ ( z ∣ x ) [ l o g p θ ( x , z ) p ϕ ( z ∣ x ) ] = − E z ∼ p θ ( z ∣ x ) [ l o g p θ ( x ∣ z ) ] + D K L ( p θ ( z ∣ x ) ∣ ∣ p ( z ) ) = M S E ( x , p θ ( x , ϵ ) ) + 1 2 [ − 1 + μ θ ( x ) 2 + σ θ ( x ) 2 − l o g σ θ ( x ) 2 ] \begin{align} L_{vae}&=-E_{z\sim p_{\phi}(z|x)}[log \frac{p_{\theta}(x,z)}{p_{\phi}(z|x)}]\nonumber \\&=-E_{z\sim p_{\theta}(z|x)}[log p_{\theta}(x|z)]+D_{KL}(\,p_{\theta}(z|x)\,||\,p(z)\,)\nonumber \\&=MSE(x,p_{\theta}(x,\epsilon))+\frac{1}{2}[\,-1+{\mu_{\theta}(x)}^2+{\sigma_{\theta}(x)}^2-log{\sigma_{\theta}(x)}^2\,]\qquad\nonumber \end{align} Lvae=Ezpϕ(zx)[logpϕ(zx)pθ(x,z)]=Ezpθ(zx)[logpθ(xz)]+DKL(pθ(zx)∣∣p(z))=MSE(x,pθ(x,ϵ))+21[1+μθ(x)2+σθ(x)2logσθ(x)2]
具体实现上,即是Encoder后接两层Linear,分别预测 μ θ ( x ) 和 σ θ ( x ) 2 \mu_{\theta}(x)和\sigma_{\theta}(x)^2 μθ(x)σθ(x)2,然后通过重参数化技巧,采样一个 x ′ = μ θ ( x ) + σ θ ( x ) ϵ x'=\mu_{\theta}(x)+\sigma_{\theta}(x)\,\epsilon x=μθ(x)+σθ(x)ϵ输入Decoder,重建x,当然在细节上,我们可以选择预测 l o g σ θ ( x ) 2 log\,\sigma_{\theta}(x)^2 logσθ(x)2,从而避免了网络输出为负的情况。

4 结语

现在准备开始写Diffusion Model的博客,算是一个总结,也算是对学习知识的回顾,学到现在真的得到了太多人博客的帮忙,希望自己也能成其中的一员。

Reference:

苏剑林.《变分自编码器(一):原来是这么一回事》

苗思奇.《机器学习方法—优雅的模型(一):变分自编码器(VAE)》

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

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

相关文章

C++指针

本文章对C指针的使用做一个全面的阐述与解释 1.1指针的定义使用 指针&#xff1a; 通过指针间接访问内存 指针就是地址 看下面代码&#xff1a; #include<iostream> using namespace std; int main(){//1、定义指针int * p;int a 10;//2、使用指针p &a;cout<…

STM32-02-STM32基础知识

文章目录 STM32基础知识1. STM32F103系统架构2. STM32寻址范围3. 存储器映射4. 寄存器映射 STM32基础知识 1. STM32F103系统架构 STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片&#xff0c;而Cortex M内核使用的是ARM v7-M架构&#xff0c;是为了替代…

根据星历文件实现卫星的动态运行模拟matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .................................................................................... % …

测试用例的修改更新

测试用例的修改更新是指测试过程中由于用户需求的改变&#xff0c;或者测试过程中发现有新的需求产生&#xff0c;使得测试用例需要进行修改。修改更新测试用例不仅是一种测试技术&#xff0c;更是一种质量保证的方法。但修改和更新测试用例的技术要点在于&#xff1a; 1、执行…

ReactHooks大全—useEffect

React Hooks是一种在函数组件中使用状态和生命周期等特性的方法。useEffect是其中一个常用的Hook&#xff0c;它可以让你在组件渲染后执行一些副作用操作&#xff0c;比如发送网络请求、订阅事件、修改DOM等。在本文中&#xff0c;我们将介绍useEffect的基本使用、实现原理、最…

Note3---初阶二叉树~~

目录​​​​​​​ 前言&#x1f344; 1.树概念及结构☎️ 1.1 树的概念&#x1f384; 1.2 树的相关概念&#x1f99c; 1.2.1 部分概念的加深理解&#x1f43e; 1.2.2 树与非树&#x1fab4; 1.3 树的表示&#x1f38b; 1.4 树在实际中的运用&#xff08;表示文件系统…

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2)

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2) 简介 上篇重点介绍了OnnxSimplifier的库&#xff0c;其中的FixedPointFn迭代优化函数利用到了OnnxOptimizer这个官方的优化库&#xff0c;大部分的优化细节是在OnnxOptimizer内的。因此本篇重点介绍一下OnnxOpti…

飞天使-docker知识点12-docker-compose

文章目录 docker-compose命令启动单个容器重启容器停止和启动容器停止和启动所有容器演示一个简单示范 docker-compose 部署有依赖问题 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用简单的 YAML 文件来配置应用程序的服务、网络和存储等方…

全志V3s之NFS连接ubuntu22.04

1、问题一&#xff1a; [ 100.329728] VFS: Unable to mount root fs via NFS, trying floppy. [ 100.336262] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6 [ 100.343580] Please append a correct "root" boot option; here…

RT-Smart elf 动态加载技术 : 开启 ldso 动态加载

前言 RT-Smart,类似于Linux,可以动态的加载运行 应用程序 elf 文件 应用程序 elf 文件,有的是静态链接编译的,有的是动态链接编译的,动态链接编译的,还需要加载 动态共享库 (.so) 本篇讲解一下 RT-Smart 上 elf 动态加载功能的实现,顺便讲一下动态加载的原理 环境搭建 R…

12.18

有道云笔记 机械臂 #include <myhead.h> #define SERPORT 8822 #define SERIP "192.168.125.61" #define PORT 6666 #define IP "192.168.125.88" int main(int argc, const char *argv[]) {int cfd-1;if((cfdsocket(AF_INET,SOCK_STREAM,0))-1){p…

RTrPPG

研究背景 心率 (HR) 和脉搏率变异性 (PRV) 是允许分析心脏行为的两个生理参数。心率监测可以通过接触式和非接触式的两种方法进行。通常用于测量 HR 和 PRV 的两种接触式技术是心电图 (ECG) 和光电容积脉搏波 (PPG)。 ECG 测量由心脏活动引起的电场。另一方面&#xff0c;PPG …

02什么是CPU上下文切换

上⼀节&#xff0c; 讲了要怎么理解平均负载&#xff08; Load Average&#xff09; &#xff0c; 并⽤三个案例展示了不同场景下平均负载升⾼的分析⽅法。 这其中&#xff0c; 多个进程竞争 CPU 就是⼀个经常被我们忽视的问题。 1、CPU上下文切换的概念 我想你⼀定很好奇&am…

2023/12/18 work

1. 机械臂 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>#define CLI_PORT 6667 //本机的端口号 #define CLI_IP "192.168.125.79" //本机的IP#define SER_PORT 8888 //服务器的端口号 #define…

智能家居和智能家居控制设备有什么区别?

智能家居和智能家居控制设备在功能和用途伤的区别&#xff1a; 智能家居是一种整体的概念&#xff0c;它涵盖了整个家庭环境的智能化&#xff0c;包括智能家电、智能照明、智能安防等设备的互联互通和协同工作。智能家居的目标是通过中央控制器或智能音箱等设备&#xff0c;实现…

瑞安籍侨领池万进荣任意大利瑞安同乡总会第五届会长

浙江温州瑞安是全国重点侨乡&#xff0c;拥有海外侨胞16万人、侨领2100多名、归侨侨眷近12万人&#xff0c;在世界100多个国家和地区建有70多个侨团组织。 意大利瑞安同乡总会第五届理事会会长团全体成员 青年部全体成员 各兄弟会长及代表 12月10日&#xff0c;意大利瑞安同乡…

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用 燃气轮机发电机组作为一种高效可靠的常备应急电源&#xff0c;在保障发电品质稳定性和可靠性方面发挥着关键作用。其中&#xff0c;励磁控制系统是保证供电质量的重要环节&#xff0c;对发电机组的稳定运行至关重要。为了有…

渲染函数JSX

大多数情况使用vue模板语法创建应用&#xff0c;在某些场景下&#xff0c;需要用到JavaScript完全的编程能力&#xff0c;这时就用到渲染函数了。 基本用法 创建Vnodes Vue提供了一个h()函数用于创建vnodes&#xff1a; import {h} from vueconst vnode h(div, // type{ i…

档案数字化管理可以提供什么服务?

档案数字化管理提供了便捷、高效和安全的档案管理服务&#xff0c;帮助组织更好地管理和利用自己的档案资源。 具体来说&#xff0c;专久智能档案数字化管理可以提供以下服务&#xff1a; 1. 档案扫描和数字化&#xff1a;将纸质档案通过扫描仪转换为数字格式&#xff0c;包括文…

xtu oj 1293 Diamond

题目描述 根据给出的尺寸n输出一个字符钻石&#xff0c;比如n3时&#xff0c;字符钻石为 CCBC CBABCCBCC 输入 第一行是整数K&#xff0c;表示样例的个数。 以后每行一个样例&#xff0c;为钻石的尺寸&#xff0c;n(1≤n≤26) 输出 依次输出每个样例的结果&#xff0c;每个…