扩散模型理论与公式推导——详细过程速览与理解加深

参考:

[1] Ho J, Jain A, Abbeel P. Denoising diffusion probabilistic models[J]. Advances in neural information processing systems, 2020, 33: 6840-6851.

[2] 扩散模型/Diffusion Model原理讲解_哔哩哔哩_bilibili

[3] 扩散模型公式推导_扩散模型数学推导-CSDN博客

[4] 扩散模型的一些公式证明_扩散模型公式-CSDN博客

[5] 超详细!!扩散模型基本原理讲解,一文搞懂扩散模型_扩散模型原理-CSDN博客

文章目录

      • 一、加噪过程:
      • 二、去噪过程(逆向推导)
      • 三、目标函数

推荐在简单了解扩散模型原理后再来看本篇文章,加深对理论的理解,本篇只叙述有关扩散模型公式理论的推导~

一、加噪过程:

q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) . (1) q(x_t|x_{t-1})=\mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_tI).\quad\text{(1)} q(xtxt1)=N(xt;1βt xt1,βtI).(1)

其中,x0 是mel-spec,xT 是纯高斯分布噪声,β 是个超参数,代表添加噪声的幅度,或者也可以写成这样,这实际上就用到了重参数技巧来写的公式:
x t = 1 − β t x t − 1 + β t ϵ t (2) \mathbf{x}_t=\sqrt{1-\beta_t}\mathbf{x}_{t-1}+\sqrt{\beta_t}\boldsymbol{\epsilon}_t\quad\text{(2)} xt=1βt xt1+βt ϵt(2)
其中,ε 为从标准高斯分布中采样的噪声。在原扩散模型中,β 会变得越来越大(通过线性调度器或者余弦调度器)引用【深度学习模型】扩散模型(Diffusion Model)基本原理及代码讲解-CSDN博客,即:

所谓的加噪声,就是基于稍微干净的图片计算一个(多维)高斯分布(每个像素点都有一个高斯分布,且均值就是这个像素点的值,方差是预先定义的 ),然后从这个多维分布中抽样一个数据出来,这个数据就是加噪之后的结果。显然,如果方差非常非常小,那么每个抽样得到的像素点就和原本的像素点的值非常接近,也就是加了一个非常非常小的噪声。如果方差比较大,那么抽样结果就会和原本的结果差距较大。
去噪声也是同理,我们基于稍微噪声的图片 计算一个条件分布,我们希望从这个分布中抽样得到的是相比于 更加接近真实图片的稍微干净的图片。我们假设这样的条件分布是存在的,并且也是个高斯分布,那么我们只需要知道均值和方差就可以了。问题是这个均值和方差是无法直接计算的,所以用神经网络去学习近似这样一个高斯分布。

当然,我们还可以将迭代式进行推导,将 xt 写成闭式解(即无需逐步迭代进行计算)。为了方便计算,我们有如下定义:
α t : = 1 − β t , α ˉ t : = ∏ s = 1 t α s (3) \alpha_{t}:=1-\beta_{t},\quad\bar{\alpha}_{t}:=\prod_{s=1}^{t}\alpha_{s}\quad\text{(3)} αt:=1βt,αˉt:=s=1tαs(3)
结合迭代、重参数技巧,我们不难推导出:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) x t = α ˉ t x 0 + 1 − α ˉ t ϵ (4) \begin{aligned} q(\mathbf{x}_t|\mathbf{x}_0) &= \mathcal{N}(\mathbf{x}_t;\sqrt{\bar{\alpha}_t}\mathbf{x}_0,(1-\bar{\alpha}_t)\mathbf{I}) \\ x_t &= \sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon \end{aligned} \quad\text{(4)} q(xtx0)xt=N(xt;αˉt x0,(1αˉt)I)=αˉt x0+1αˉt ϵ(4)
其中,ε 服从标准高斯分布。

二、去噪过程(逆向推导)

去噪的话我们使用 p 来表示反向重建的过程,使用 θ 表示神经网络参数,实际上,重建的过程就是(图引用自[2]):

我们定义 p 为参数化高斯分布,去近似逆向扩散的过程。则逆向过程可以写为:
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) (5) p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t,t),\Sigma_\theta(x_t,t))\quad\text{(5)} pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))(5)
我们需要去通过神经网络去得到平均值和方差,并从中采样。当然,采样这一过程之后还是会通过重参数去改写。那这一逆向过程我们应该如何计算呢?如何计算从 xt 到 xt-1?先来看看已知条件:
x t = α t x t − 1 + 1 − α t ϵ t (6) x t = α ˉ t x 0 + 1 − α ˉ t ϵ (7) x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}\epsilon_t\quad\text{(6)} \\ x_t = \sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon\quad\text{(7)} \\ xt=αt xt1+1αt ϵt(6)xt=αˉt x0+1αˉt ϵ(7)
我们还有贝叶斯公式,并添加 x0 条件后,我们可以有:
p ( x t − 1 ∣ x t , x 0 ) = p ( x t ∣ x t − 1 , x 0 ) p ( x t − 1 ∣ x 0 ) p ( x t ∣ x 0 ) (8) p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,x_0)=\frac{p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1},x_0)p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)}{p(\boldsymbol{x}_t|\boldsymbol{x}_0)}\quad\text{(8)} p(xt1xt,x0)=p(xtx0)p(xtxt1,x0)p(xt1x0)(8)
诶!RHS是不是就出现了前向过程?我们之前已经讲过了前向过程的高斯分布,因此我们不难得到:
p ( x t ∣ x t − 1 , x 0 ) = α t x t − 1 + 1 − α t ϵ ∼ N ( α t x t − 1 , 1 − α t ) (9) p ( x t − 1 ∣ x 0 ) = α ‾ t − 1 x 0 + 1 − α ‾ t − 1 ϵ ∼ N ( α ‾ t − 1 x 0 , 1 − α ‾ t − 1 ) (10) p(x_t|x_{t-1},x_0)=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}\epsilon\sim\mathcal{N}(\sqrt{\alpha_t}x_{t-1},1-\alpha_t)\quad\text{(9)} \\ p(x_{t-1}|x_0)=\sqrt{\overline{\alpha}_{t-1}}x_0+\sqrt{1-\overline{\alpha}_{t-1}}\epsilon\sim\mathcal{N}(\sqrt{\overline{\alpha}_{t-1}}x_0,1-\overline{\alpha}_{t-1})\quad\text{(10)} p(xtxt1,x0)=αt xt1+1αt ϵN(αt xt1,1αt)(9)p(xt1x0)=αt1 x0+1αt1 ϵN(αt1 x0,1αt1)(10)
根据高斯分布的表达式:
N ( x ; μ , σ 2 ) = 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 \mathcal{N}(x;\mu,\sigma^2)=\frac1{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} N(x;μ,σ2)=2πσ2 1e2σ2(xμ)2
我们将式(8)改写成高斯分布,带入式(9)(10)后,最后经过一系列化简后我们就可以得到:
p ( x t − 1 ∣ x t , x 0 ) ∼ N ( a t ( 1 − a ˉ t − 1 ) 1 − a ˉ t x t + a ˉ t − 1 ( 1 − a t ) 1 − a ˉ t x 0 , ( 1 − a t 1 − a ˉ t − 1 1 − a ˉ t ) 2 ) (11) p(x_{t-1}|x_t,x_0)\sim N\left(\frac{\sqrt{a_t}(1-\bar{a}_{t-1})}{1-\bar{a}_t}x_t+\frac{\sqrt{\bar{a}_{t-1}}(1-a_t)}{1-\bar{a}_t}x_0,\left(\frac{\sqrt{1-a_t}\sqrt{1-\bar{a}_{t-1}}}{\sqrt{1-\bar{a}_t}}\right)^2\right)\quad\text{(11)} p(xt1xt,x0)N(1aˉtat (1aˉt1)xt+1aˉtaˉt1 (1at)x0,(1aˉt 1at 1aˉt1 )2)(11)
不过,这里面有我们的目标 x0,因此我们需要将 x0 给置换掉,而由公式(4)我们可以知道:
x t = α ‾ t x 0 + 1 − α ‾ t ϵ ⟶ x 0 = x t − 1 − α ‾ t ϵ α ‾ t (12) x_t=\sqrt{\overline{\alpha}_t}x_0+\sqrt{1-\overline{\alpha}_t}\epsilon\longrightarrow x_0=\frac{x_t-\sqrt{1-\overline{\alpha}_t}\epsilon}{\sqrt{\overline{\alpha}_t}}\quad\text{(12)} xt=αt x0+1αt ϵx0=αt xt1αt ϵ(12)
带入式(11)后,我们就最终得到了去噪过程的推导式:
p ( x t − 1 ∣ x t , ϵ ) ∼ N ( 1 α t ( x t − 1 − α t 1 − α ‾ t ϵ ) , ( 1 − a t 1 − a ˉ t − 1 1 − a ˉ t ) 2 ) (13) p(x_{t-1}|x_t,\epsilon)\sim N\left(\frac1{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha}_t}}\epsilon),\left(\frac{\sqrt{1-a_t}\sqrt{1-\bar{a}_{t-1}}}{\sqrt{1-\bar{a}_t}}\right)^2\right)\quad\text{(13)} p(xt1xt,ϵ)N(αt 1(xt1αt 1αtϵ),(1aˉt 1at 1aˉt1 )2)(13)
我们现在就有了去噪过程的推导式,只需要 xt 和 ε 就可以推导出 x_t-1。而 xt 我们是知道的,ε 不知道,那么问题就从原来的输入为 xt,输出 x_t-1,到了如今的输入 xt,预测 ε,并带入推导式中。问题的关键就是去预测噪声 ε。

三、目标函数

好的,现在回到扩散模型本身来。我们的目的就是为了去算好 x_t-1 的概率分布,也就是能预测好 ε,计算好分布的平均值和方差。我们应该如何让网络去拟合 ε?我们先来看看我们的目标函数:我们的目的是为了通过神经网络去得到 x0,我们使用 θ 表示神经网络参数,则我们的目标是:
p θ ( x 0 ) : = ∫ p θ ( x 0 : T ) d x 1 : T , p θ ( x 0 : T ) : = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) (14) p_{\theta}(\mathbf{x}_{0}):=\int p_{\theta}(\mathbf{x}_{0:T}) d\mathbf{x}_{1:T}, \quad p_\theta(\mathbf{x}_{0:T}):=p(\mathbf{x}_T)\prod_{t=1}^Tp_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)\quad\text{(14)} pθ(x0):=pθ(x0:T)dx1:T,pθ(x0:T):=p(xT)t=1Tpθ(xt1xt)(14)
直接积分是肯定不行的,但我们可以变相去求解它的变分下界。在求解变分下界之前,我们先将前向加噪的过程 q 拿来一用。由于咱们是从原图片开始,通过 Markov 链的形式来一点一点进行加噪,我们当然可以将这一过程视为近似后验分布,因此我们就可以定义这样一个基于所有中间加噪图片潜在变量的近似后验分布:
q ( x 1 : T ∣ x 0 ) : = ∏ t = 1 T q ( x t ∣ x t − 1 ) , q ( x t ∣ x t − 1 ) : = N ( x t ; 1 − β t x t − 1 , β t I ) (15) q(\mathbf{x}_{1:T}|\mathbf{x}_0):=\prod_{t=1}^Tq(\mathbf{x}_t|\mathbf{x}_{t-1}),\quad q(\mathbf{x}_t|\mathbf{x}_{t-1}):=\mathcal{N}(\mathbf{x}_t;\sqrt{1-\beta_t}\mathbf{x}_{t-1},\beta_t\mathbf{I})\quad\text{(15)} q(x1:Tx0):=t=1Tq(xtxt1),q(xtxt1):=N(xt;1βt xt1,βtI)(15)
有了前向加噪过程 q,也就是近似后验分布,你就既可以通过 KL 散度联系起两个后验分布p和q从而推导出变分下界,也可以通过式(14)(15),加上Jensen不等式来推导出变分下界,结果目标函数(损失函数)就如下:
− log ⁡ p θ ( x 0 ) ≤ E x 1 : T ∼ q ( x 1 : T ∣ x 0 ) [ − log ⁡ p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ] = E q [ − log ⁡ p ( x T ) − ∑ t ≥ 1 log ⁡ p θ ( x t − 1 ∣ x t ) q ( x t ∣ x t − 1 ) ] = : L (16) -\log p_\theta(\mathbf{x}_0)\leq\mathbb{E}_{\mathbf{x_{1:T}}\sim{q(\mathbf{x_{1:T}}|\mathbf{x}_0)}}\left[-\log\frac{p_\theta(\mathbf{x}_{0:T})}{q(\mathbf{x}_{1:T}|\mathbf{x}_0)}\right]=\mathbb{E}_q\left[-\log p(\mathbf{x}_T)-\sum_{t\geq1}\log\frac{p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)}{q(\mathbf{x}_t|\mathbf{x}_{t-1})}\right]=:L\quad\text{(16)} logpθ(x0)Ex1:Tq(x1:Tx0)[logq(x1:Tx0)pθ(x0:T)]=Eq[logp(xT)t1logq(xtxt1)pθ(xt1xt)]=:L(16)
而这一个损失函数也可以进一步改写,改写的推导过程可以参考扩散模型的一些公式证明_扩散模型公式-CSDN博客,不过我没有自己验证过,结果是和原论文(DDPM)是一样的。改写为:
L = D K L ( q ( x T ∣ x 0 ) ∣ ∣ p ( x T ) ) + ∑ t > 1 D K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ p ( x t − 1 ∣ x t ) ) − l o g p ( x 0 ∣ x 1 ) (17) L=D_{KL}\left(q(x_T|x_0)||p(x_T)\right)+\sum_{t>1}D_{KL}\left(q(x_{t-1}|x_t,x_0)||p(x_{t-1}|x_t)\right)-logp(x_0|x_1)\quad\text{(17)} L=DKL(q(xTx0)∣∣p(xT))+t>1DKL(q(xt1xt,x0)∣∣p(xt1xt))logp(x0x1)(17)
损失函数肉眼可见有三项,我们规定从左到右分别为 L_T,L_t-1 和 L_0:

  • L_T:这一项为 x_T 的近似后验分布和真实分布的KL散度,这一项需要我们确保加噪的结果是生成了一个高噪声的图片,越接近先验噪声分布越好,这里由于使用高斯分布近似,因此也就是需要结果趋近于标准高斯分布。
  • L_0:原论文中,由于输出的图像数据是离散的(像素0~255映射到[-1,1]),因此在去噪过程的最后一项,作者将其改成了独立的离散解码器。此外,作者也说明了在去噪过程完成后,模型最终给出的是一个去除了所有噪声的估计值,这个估计值是干净的数据 x0 的最佳近似,也就是 x1,因此这一项在理想情况下应该是非常高的似然。
  • L_t-1:这一项就是最关键的一项,也是我们需要求解的一项,计算的是每一个时间步中,近似(前向过程)后验去噪分布和真实去噪分布之间的KL散度。幸运的是,在之前的过程中,我们可以根据式(13)去写下这两项的具体表达式。

那么这样一下子讨论下来,实际上损失函数只有 L_t-1 这一项最有效。我们来看看怎么计算 L_t-1 这一项。首先这两个分布都是高斯分布,因此我们可以根据高斯分布表达式去简写 KL 散度的公式。有如下两个高斯分布之间的 KL 散度计算公式:
D K L ( N ( μ 1 , σ 1 2 ) ∣ ∣ N ( μ 2 , σ 2 2 ) ) = l o g σ 2 σ 1 + σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 − 1 2 (18) D_{KL}\left(\mathcal{N}(\mu_1,\sigma_1^2)\left|\right|\mathcal{N}(\mu_2,\sigma_2^2)\right)=log\frac{\sigma_2}{\sigma_1}+\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}-\frac12\quad\text{(18)} DKL(N(μ1,σ12)N(μ2,σ22))=logσ1σ2+2σ22σ12+(μ1μ2)221(18)
我们将这两个分布用高斯分布的形式表示出来如下:
q ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ t ( x t , x 0 ) , β ~ t I ) (19) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) (20) q(\mathbf{x}_{t-1}|\mathbf{x}_t,\mathbf{x}_0)=\mathcal{N}(\mathbf{x}_{t-1};\tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t,\mathbf{x}_0),\tilde{\beta}_t\mathbf{I})\quad\text{(19)} \\ p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)=\mathcal{N}(\mathbf{x}_{t-1};\boldsymbol{\mu}_\theta(\mathbf{x}_t,t),\boldsymbol{\Sigma}_\theta(\mathbf{x}_t,t))\quad\text{(20)} q(xt1xt,x0)=N(xt1;μ~t(xt,x0),β~tI)(19)pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))(20)
在原来的模型中,作者将模型预测的方差 Σ 设置成了一个无法训练的仅与时间步相关的变量,即 Σ = σ_t^2 I

值得一提的是,作者声明从实验结果来看,无论将 σ_t^2 设置为 β_t 还是和式(13)中一样的方差,结果上来看都差不多

而由式(13)我们知道,q 的方差同样也和模型无关(也是只和时间步相关),因此在式(18)中只有平均值参与的计算才有意义,我们将式(17)的 L_t-1 化简后如下:
L t − 1 = 1 2 σ t 2 ∥ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∥ 2 + C (21) L_{t-1}=\frac1{2\sigma_t^2}\|\tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t,\mathbf{x}_0)-\boldsymbol{\mu}_\theta(\mathbf{x}_t,t)\|^2+C\quad\text{(21)} Lt1=2σt21μ~t(xt,x0)μθ(xt,t)2+C(21)
这里其实可以看出,模型其实就是在预测前向过程后验分布的均值。根据式(13),并且由于 μ tilde 是个前向过程后验均值,受到 x0 的影响,我们结合式(4),有:
μ ~ t ( x t , x 0 ) = 1 α t ( x t ( x 0 , ϵ ) − β t 1 − α ˉ t ϵ ) = 1 α t ( ( α ˉ t x 0 + 1 − α ˉ t ϵ ) − β t 1 − α ˉ t ϵ ) (22) \begin{aligned} \tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t,\mathbf{x}_0) &= \frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t(\mathbf{x}_0,\boldsymbol{\epsilon})-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\boldsymbol{\epsilon}\right) \\ &=\frac{1}{\sqrt{\alpha_t}}\left((\sqrt{\bar{\alpha}_t}\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon})-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\boldsymbol{\epsilon}\right) \end{aligned}\quad\text{(22)} μ~t(xt,x0)=αt 1(xt(x0,ϵ)1αˉt βtϵ)=αt 1((αˉt x0+1αˉt ϵ)1αˉt βtϵ)(22)
此外,利用式(13),模型预测的均值 μ_θ 也可以写出来,注意这里的 ε 不再是已知的,而是需要模型去预测,我们在式(13)的后续讲解中有交代过。
μ θ ( x t , t ) = 1 α t ( ( α ˉ t x 0 + 1 − α ˉ t ϵ ) − β t 1 − α ˉ t ϵ θ ( x t , t ) ) (23) \boldsymbol{\mu}_\theta(\mathbf{x}_t,t)=\frac{1}{\sqrt{\alpha_t}}\left((\sqrt{\bar{\alpha}_t}\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon})-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t)\right)\quad\text{(23)} μθ(xt,t)=αt 1((αˉt x0+1αˉt ϵ)1αˉt βtϵθ(xt,t))(23)
将式(22)和式(23)带入式(21)中,并结合式(4)替换掉 xt,规整一下写法,我们就得到了最终的化简结果:
L ( θ ) = E x 0 , ϵ , t [ β t 2 2 σ t 2 α t ( 1 − α ˉ t ) ∥ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) ∥ 2 ] (24) L(\theta)=\mathbb{E}_{\mathbf{x}_0,\boldsymbol{\epsilon},t}\left[\frac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\bar{\alpha}_t)}\left\|\boldsymbol{\epsilon}-\boldsymbol{\epsilon}_\theta(\sqrt{\bar{\alpha}_t}\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon},t)\right\|^2\right]\quad\text{(24)} L(θ)=Ex0,ϵ,t[2σt2αt(1αˉt)βt2 ϵϵθ(αˉt x0+1αˉt ϵ,t) 2](24)
最后,作者又将这个损失函数进一步简化,据说是可以提高采样的质量并且更易于实现:
L s i m p l e ( θ ) : = E t , x 0 , ϵ [ ∥ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) ∥ 2 ] (25) L_{\mathrm{simple}}(\theta):=\mathbb{E}_{t,\mathbf{x}_0,\boldsymbol{\epsilon}}\Big[\left\|\boldsymbol{\epsilon}-\boldsymbol{\epsilon}_\theta(\sqrt{\bar{\alpha}_t}\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon},t)\right\|^2\Big]\quad\text{(25)} Lsimple(θ):=Et,x0,ϵ[ ϵϵθ(αˉt x0+1αˉt ϵ,t) 2](25)
式(25)就是最终的损失函数了。

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

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

相关文章

10、java程序流程控制之二:分支语句(switch-case结构)、循环结构(for循环)(经典案例)

java程序流程控制之二: Ⅰ、分支语句:switch-case1、switch-case 分支结构:其一、描述:其二、代码为:其三、截图为: 2、switch-case 分支结构的案例1:判断是否合格其一、描述:其二、…

Docker数据管理和网络管理

文章目录 一、Docker数据管理Docker容器的分层哪些数据需要持久化容器数据持久保存方式数据卷(data volume)数据卷的使用场景数据卷的特点数据卷使用方法实际例子 二、网络管理Docker安装完成后默认的网络设置创建容器后的网络配置修改默认网络设置容器名…

“南禾”女士包网站的设计与实现----附源码17160

摘 要 随着社会经济的发展和人们生活水平的提高,女士包市场逐渐成为一个庞大的产业。女性消费者对于时尚、品质和个性化的追求,对于高品质、款式新颖的女士包需求不断增加。南禾作为中高端女士包品牌,为抓住了这一市场需求,为女性…

再见,Midjourney | FLUX 彻底改变了 AI 图像游戏

Flux 刚发布一周,大家都疯了! 因为真的是分不清是AI还是真实啊🏴‍☠️ Flux生成 Flux生成 FLUX 彻底改变了 AI 图像游戏。 02 黑深林 Black Forest Labs由Stable Diffusion模型的原班人马创立,旨在开发并开源高质量的图像和…

AI技术加速落地 港科广联手思谋打开智能缺陷检测新纪元

AI 技术应用落地的元年,工业是主战场,尤其是工业缺陷检测。 在“生产制造-缺陷检测-工艺优化-生产制造”的智能制造闭环链条中,基于AI的智能缺陷检测扮演着“把关者”的角色。但这个把关者长期以来却缺少一个称手的工具——样本量大、精度高…

【Cadence22】将别人发的原理图和PCB库修改为自己的库,进而继续制图

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

Firefox滚动条在Win10和Win11下表现不一致问题?

文章目录 前言总结解决方法 前言 最近在写页面的时候发现一个非常有意思的事。Firefox滚动条在Win10和Win11下表现居然不一致。在网上几经查找资料, 终于找到原因所在。总结成下面的文章,加深印象也防止下次遇到。 总结 参考文章: Firefox…

云快充协议1.5版本的充电桩系统软件

介绍 小程序端:城市切换、附近电站、电桩详情页、扫码充电、充电中动态展示、订单支付、个人中心、会员充值、充值赠送、联系客服; 管理后台:充电数据看板、会员管理、订单管理、充值管理、场站运营、文章管理、财务管理、意见反馈、管理员管…

VBA学习(25):从一个工作表复制数据到另一个工作表

今天演示一个简单的例子,也是经常看到网友问的问题,将一个工作表中的数据复制到另一个工作表。 如下图1所示,有3个工作表,需要将工作表“新数据#1”和“新数据#2”中的数据复制到工作表“汇总”中。其中,在“汇总”工…

【Web】LIT CTF 2024 题解(全)

目录 anti-inspect jwt-1 jwt-2 traversed kirbytime scrainbow anti-inspect 因为一直while true,网页会卡死无法访问 const flag "LITCTF{your_%cfOund_teh_fIg_94932}";console.log(flag,"background-color: darkblue; color: white; f…

Python办公自动化:使用`xlutils` 修改Excel文档

在日常办公自动化中,除了读取Excel文件,我们还经常需要对文件进行修改或更新。在Python中,除了xlrd,还可以使用xlutils库来实现对Excel文件的修改操作。本文将继续以“巴黎奥运会奖牌榜.xlsx”文件为例,讲解如何使用xl…

eNSP 华为浮动路由

R1&#xff1a; <Huawei>system-view [Huawei]sysname R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 172.16.1.1 24 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 10.10.1.1 24 [R1-GigabitEthernet0/0/1]quit [R1]vlan 10 //e口是…

配置Google API,用JavaScript和Python读取Google sheet里的数据

[发布时间是2024年8月。技术流程可能会存在一些变动] 开头提醒一下各位公司&#xff0c;国内包括腾讯云华为云阿里云&#xff0c;国外包括AWS和GCP&#xff0c;希望你们在开发产品的同时把这方面的文档写的更清楚明白一些。 现在&#xff0c;随着办公逐渐云化&#xff0c;从云…

Linux学习笔记11(计算机网络)

目录 网络七层模型/五层模型 IP地址分类 CIDR Centos7的网卡IP配置 RockyLinux9的网卡IP配置 网络七层模型/五层模型 自下到上 物理层&#xff1a; 建立物理连接&#xff0c;传输 0 和 1 的比特流 数据链路层&#xff1a; 物理地址寻址&#xff0c;流量控制&#xff0c;差错…

【redis】springboot 用redis stream实现MQ消息队列 考虑异常ack重试场景

redis stream是redis5引入的特性&#xff0c;一定程度上借鉴了kafka等MQ的设计&#xff0c;部署的redis版本必须 > 5 本文主要讲的是思路&#xff0c;结合简单的源码分析&#xff08;放心&#xff0c;无需深入大量源码&#xff09;&#xff1b;讲述在redis stream文档缺乏&a…

链表的奇偶节点重新排列及空指针问题分析【链表、空指针】

在处理链表问题时&#xff0c;重组链表节点是一种常见需求。本文将详细探讨如何在链表中将奇数索引节点放在偶数索引节点之前&#xff0c;并深入分析实现过程中的空指针问题及其解决方案。 1. 问题描述 给定一个单链表&#xff0c;要求将链表中的节点按照奇数索引节点在前、偶…

控制SD图片生成的神经网络模型--ControlNet

ControlNet 是一个通过添加额外条件来控制SD中图像生成的神经网络&#xff0c;可以使用 ControlNet 来做以下事情&#xff1a; 指定人体姿势。 从另一幅图像复制图片的构图。 生成参考图片类似的图像。 将涂鸦图片变成专业的图像。 ControlNet 是用于控制SD的神经网络模型…

8.8 哈希表简单 1 Two Sum 141 Linked List Cycle

1 Two Sum class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {//给的target是目标sum 要返回vector<int> res(2,0);是在num中找加数//首先假设每个输入都是由唯一的结果&#xff0c;而且不适用相同的元素两次一共有n*(n-1)种…

记录前后端接口使用AES+RSA混合加解密

一、前言 由于项目需求&#xff0c;需要用到前后端数据的加解密操作。在网上查找了了相关资料&#xff0c;但在实际应用中遇到了一些问题&#xff0c;不能完全满足我的要求。 以此为基础&#xff08;前后端接口AESRSA混合加解密详解&#xff08;vueSpringBoot&#xff09;附完…

2024.8.7(SQL语句)

一、回顾 1、主服务器 [rootslave-mysql ~]# yum -y install rsync [rootmaster-mysql ~]# yum -y install rsync [rootmaster-mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster-mysql ~]# ls [rootmaster-mysql ~]# tar -xf mysql-8.0.33-linux-glib…