扩散模型(DDPM)介绍

news2024/12/24 20:36:43

文章目录

  • 扩散模型
  • 扩散过程
    • 前向过程
    • 逆向过程
  • 网络结构

文章主要介绍了DDPM扩散模型,包含了详细的数学推导,可能公式有点多,但是只要能够耐心看完,相信会有一些收获的。好了下面进入正题。

扩散模型

扩散模型是一种新的生成模型,可以生成高分辨率、高质量的图像。目前像谷歌,OpenAI,Nvidia等大厂都在持续投入研究,并推出自家的扩散模型,包括谷歌的Imagen、OpenAI的DALLE-2等,还有像近期大热的Midjourney和StableDiffusion,背后的原理均是基于扩散模型。但是扩散模型背后的原理到底是什么呢?今天笔者将聚焦于Denoising Diffusion Probabilistic Models (DDPM)这篇文章,带大家一探扩散模型的原理。

扩散过程

扩散过程主要分为两个阶段,前向过程和反向过程。当给定一张图像 x 0 x_0 x0时,前向过程就是经过 T T T步,给输入图像 x 0 x_0 x0逐步加上高斯噪声,前向过程被用来生成训练过程中的目标数据;反向过程则与前向过程相反,是逐步去掉添加到 x 0 x_0 x0上的噪声,最后生成一张无噪声的图像。在实际操作中,我们通过一个神经网络(unet)来预测噪声。首先在训练阶段,通过前向过程我们知道了添加到图像上的噪声 s s s(因为 s s s是我们生成的),此噪声 s s s即作为unet的目标输出,输入则为在 x 0 x_0 x0上添加噪声后的图像 x s x_s xs,通过( x s x_s xs s s s)数据对,我们可以训练一个具备预测噪声能力的unet,该unet具备能力:当输入含噪图像时,可以预测出该含噪图像上添加的噪声 s s s,这样就可以计算出不含噪的图像。当然这里只介绍了一步,实际上反向过程是反复执行上面预测噪声,去掉噪声的多步去噪的过程。

前向过程

扩散模型的前向过程其实就是一个马尔科夫链。马尔科夫链到底是什么,这里我们不必深究,只需要知道它有一个特性就是链上新产生的一个数只依赖于这个新产生数的前一个数。前向过程的理解可以结合下图: q ( x t ∣ x t − 1 ) = N ( x t ; μ t = 1 − β t x t − 1 , Σ t = β t I ) \begin{equation} q(x_t|x_{t-1})=\mathcal N(x_t;\mu_t=\sqrt{1-\beta_t}x_{t-1},\Sigma_t=\beta_t\bm{I}) \end{equation} q(xtxt1)=N(xt;μt=1βt xt1,Σt=βtI)
在这里插入图片描述
x 0 x_0 x0是一张干净的没有噪声的图像,采样自真实的数据分布 q ( x ) ( x 0 ∼ q ( x ) ) q(x)(x_0\sim q(x)) q(x)(x0q(x)),在马尔科夫链的每一步我们将方差为 β t \beta_t βt的高斯噪声添加到 x t − 1 x_{t-1} xt1上,得到了一个新的含噪图像 x t x_t xt,其分布满足 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)。最终经过 T T T步后,得到了一个纯噪声图像 x T x_T xT。公式(1)中, I \bm I I是一个单位矩阵。我们注意到, q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)是一个由均值 μ t \mu_t μt和方差 Σ t \Sigma_t Σt定义的正太分布。
q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)可以推导出
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) \begin{equation} q(x_{1:T}|x_0)=\textstyle\prod_{t=1}^{T}q(x_t|x_{t-1}) \end{equation} q(x1:Tx0)=t=1Tq(xtxt1)
上式中的 t t t表示时间戳, q ( x 1 : T ∣ x 0 ) q(x_{1:T}|x_0) q(x1:Tx0)表示从1到 T T T,共应用 T T T q q q函数。那么;例如当 t = 500 < T t=500<T t=500<T时,我们需要应用 q q q函数500次,才能得到最终想要的 x T x_T xT,这个需要重复计算的次数太多了,且按照上面的方式,梯度是没有办法进行反向传播的,因此这里需要用到一个重参数的技巧。

重参数技巧就是将相邻的两个变量建模成一个线性关系:
x t = 1 − β t x t − 1 + β t ϵ t − 1 , 其中 ϵ t − 1 ∼ N ( 0 , I ) \begin{equation} x_t=\sqrt{1-\beta_t}x_{t-1}+\sqrt{\beta_t}\epsilon_{t-1}, 其中\epsilon_{t-1}\sim\mathcal N(0,\bm I) \end{equation} xt=1βt xt1+βt ϵt1,其中ϵt1N(0,I)
这里我们设 α t = 1 − β t \alpha_t=1-\beta_t αt=1βt,那么(3)式可写为:
x t = α t x t − 1 + 1 − α t ϵ t − 1 = α t ( α t − 1 x t − 2 + 1 − α t − 1 ϵ t − 2 ) + 1 − α t ϵ t − 1 = α t α t − 1 x t − 2 + α t ( 1 − α t − 1 ) ϵ t − 2 + 1 − α t ϵ t − 1 \begin{equation} \begin{split} x_t&=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}\epsilon_{t-1}\\ &=\sqrt{\alpha_t}(\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}\epsilon_{t-2})+\sqrt{1-\alpha_t}\epsilon_{t-1}\\ &=\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\sqrt{\alpha_t(1-\alpha_{t-1})}\epsilon_{t-2}+\sqrt{1-\alpha_t}\epsilon_{t-1} \end{split} \end{equation} xt=αt xt1+1αt ϵt1=αt (αt1 xt2+1αt1 ϵt2)+1αt ϵt1=αtαt1 xt2+αt(1αt1) ϵt2+1αt ϵt1
由于多个高斯分布相加,结果还是高斯分布,所以(4)式的后两项可以进行合并,合并过程如下:
N ( 0 , σ 1 2 I ) + N ( 0 , σ 2 2 I ) ∼ N ( 0 , ( σ 1 2 + σ 2 2 ) I ) 1 − α t ϵ t − 1 ∼ N ( 0 , ( 1 − α t ) I ) α t ( 1 − α t − 1 ) ϵ t − 2 ∼ N ( 0 , α t ( 1 − α t − 1 ) I ) α t ( 1 − α t − 1 ) ϵ t − 2 + 1 − α t ϵ t − 1 ∼ N ( 0 , [ α t ( 1 − α t − 1 ) + ( 1 − α t ) ] I ) = N ( 0 , ( 1 − α t α t − 1 ) I ) \begin{align*} \mathcal N(0,\sigma_1^2\bm{I})+\mathcal N(0,\sigma_2^2\bm{I})&\sim\mathcal N(0,(\sigma_1^2+\sigma_2^2)\bm{I}) \\ \sqrt{1-\alpha_t}\epsilon_{t-1}&\sim\mathcal{N}(0,(1-\alpha_t)\bm{I})\\ \sqrt{\alpha_t(1-\alpha_{t-1})}\epsilon_{t-2}&\sim\mathcal{N}(0,\alpha_t(1-\alpha_{t-1})\bm{I})\\ \sqrt{\alpha_t(1-\alpha_{t-1})}\epsilon_{t-2}+\sqrt{1-\alpha_t}\epsilon_{t-1}&\sim\mathcal{N}(0,[\alpha_t(1-\alpha_{t-1})+(1-\alpha_t)]\bm{I})=\mathcal{N}(0,(1-\alpha_t\alpha_{t-1})\bm{I}) \end{align*} N(0,σ12I)+N(0,σ22I)1αt ϵt1αt(1αt1) ϵt2αt(1αt1) ϵt2+1αt ϵt1N(0,(σ12+σ22)I)N(0,(1αt)I)N(0,αt(1αt1)I)N(0,[αt(1αt1)+(1αt)]I)=N(0,(1αtαt1)I)
那么经过合并后(4)式变为:
x t = α t α t − 1 x t − 2 + 1 − α t α t − 1 ϵ ‾ t − 2 , 其中 ϵ ‾ t − 2 ∼ N ( 0 , I ) \begin{equation} x_t=\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_t\alpha_{t-1}}{\overline \epsilon}_{t-2},其中 \overline\epsilon_{t-2}\sim\mathcal N(0,\bm I) \end{equation} xt=αtαt1 xt2+1αtαt1 ϵt2,其中ϵt2N(0,I)

以此类推,再将 x t − 2 = α t − 2 x t − 3 + 1 − α t − 2 ϵ t − 3 x_{t-2}=\sqrt{\alpha_{t-2}}x_{t-3}+\sqrt{1-\alpha_{t-2}}\epsilon_{t-3} xt2=αt2 xt3+1αt2 ϵt3继续带入,这样不断代入,最终我们可以得到
x t = α t α t − 1 . . . α 1 x 0 + 1 − α t α t − 1 . . . α 1 ϵ \begin{equation} x_t=\sqrt{\alpha_t\alpha_{t-1}...\alpha_1}x_0+\sqrt{1-\alpha_t\alpha_{t-1}...\alpha_1}\epsilon \end{equation} xt=αtαt1...α1 x0+1αtαt1...α1 ϵ
α ‾ t = α t α t − 1 . . . α 1 \overline \alpha_t=\alpha_t\alpha_{t-1}...\alpha_1 αt=αtαt1...α1,那么式(6)就会变成
x t = α ‾ t x 0 + 1 − α ‾ t ϵ = N ( x t ; α ‾ t x 0 , ( 1 − α ‾ t ) I ) \begin{equation} \begin{aligned} x_t&=\sqrt{\overline \alpha_t}x_0+\sqrt{1-\overline \alpha_t}\epsilon \\ &=\mathcal N(x_t;\sqrt{\overline \alpha_t}x_0,(1-\overline \alpha_t)\bm I) \end{aligned} \end{equation} xt=αt x0+1αt ϵ=N(xt;αt x0,(1αt)I)
其中 ϵ \epsilon ϵ依然为一标准高斯分布。可以知道,当 t t t趋于无穷时,由于 α t = 1 − β t < 1 \alpha_t=1-\beta_t<1 αt=1βt<1,因此 α ‾ t \overline \alpha_t αt趋近于0,此时 x t x_t xt趋向于一个标准的高斯分布,也就是纯噪声了。这也就是如此构造式(3)的原因。

逆向过程

在这里插入图片描述

逆向过程就是逐步去噪的过程。在前向过程中我们要计算的是 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1),那么在逆向过程中就是要计算 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt)。因为我们无法直接得到 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt),但是加上 x 0 x_0 x0的后验分布 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)是可以计算的。根据贝叶斯公式
q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) \begin{equation} q(x_{t-1}|x_t,x_0)=q(x_t|x_{t-1},x_0)\frac{q(x_{t-1}|x_0)}{q(x_t|x_0)} \end{equation} q(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0)
根据马尔科夫链特性,
q ( x t ∣ x t − 1 , x 0 ) = q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) (这里 x 0 是多余的) \begin{equation} q(x_t|x_{t-1},x_0)=q(x_t|x_{t-1})=\mathcal N(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t\bm I)(这里x_0是多余的) \end{equation} q(xtxt1,x0)=q(xtxt1)=N(xt;1βt xt1,βtI)(这里x0是多余的)
由公式(7)可以直接计算出 q ( x t − 1 ∣ x 0 ) q(x_{t-1}|x_0) q(xt1x0) q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0),即
q ( x t − 1 ∣ x 0 ) = N ( x t − 1 ; α ‾ t − 1 x 0 , ( 1 − α ‾ t − 1 ) I ) q ( x t ∣ x 0 ) = N ( x t ; α ‾ t x 0 , ( 1 − α ‾ t ) I ) \begin{equation} \begin{aligned} q(x_{t-1}|x_0)&=\mathcal N(x_{t-1};\sqrt{\overline \alpha_{t-1}}x_0,(1-\overline \alpha_{t-1})\bm I)\\ q(x_t|x_0)&=\mathcal N(x_t;\sqrt{\overline \alpha_t}x_0,(1-\overline \alpha_t)\bm I) \end{aligned} \end{equation} q(xt1x0)q(xtx0)=N(xt1;αt1 x0,(1αt1)I)=N(xt;αt x0,(1αt)I)
将公式(9),(10)代入公式(8)中,经过一系列推导(这里暂时省略),就可以得到 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)的均值和方差:
β ~ t = 1 − α ‾ t − 1 1 − α ‾ t β t μ ~ t ( x t , x 0 ) = α ‾ t − 1 β t 1 − α ‾ t x 0 + α t ( 1 − α ‾ t − 1 ) 1 − α ‾ t x t \begin{equation} \begin{aligned} \widetilde \beta_t&=\frac{1-\overline \alpha_{t-1}}{1-\overline \alpha_t}\beta_t \\ \widetilde \mu_t(x_t,x_0)&=\frac{\sqrt{\overline\alpha_{t-1}}\beta_t}{1-\overline\alpha_t}x_0+\frac{\sqrt{\alpha_t}(1-\overline\alpha_{t-1})}{1-\overline\alpha_t}x_t \end{aligned} \end{equation} β tμ t(xt,x0)=1αt1αt1βt=1αtαt1 βtx0+1αtαt (1αt1)xt
根据前向过程的式(7),可以知道:
x 0 = 1 α ‾ t ( x t − 1 − α ‾ t ϵ ) \begin{equation} x_0=\frac{1}{\sqrt{\overline\alpha_t}}(x_t-\sqrt{1-\overline\alpha_t}\epsilon) \end{equation} x0=αt 1(xt1αt ϵ)
将式(12)和 β t = 1 − α t \beta_t=1-\alpha_t βt=1αt代入式(11)中,那么
μ ~ t ( x t ) = α ‾ t − 1 β t 1 − α ‾ t 1 α ‾ t ( x t − 1 − α ‾ t ϵ ) + α t ( 1 − α ‾ t − 1 ) 1 − α ‾ t x t = α ‾ t − 1 β t 1 − α ‾ t 1 α ‾ t x t + α t ( 1 − α ‾ t − 1 ) 1 − α ‾ t x t − α ‾ t − 1 β t 1 − α ‾ t 1 − α ‾ t α ‾ t ϵ = β t 1 α t + α t − α t α ‾ t − 1 1 − α ‾ t x t − β t α t 1 − α ‾ t ϵ = β t + α t − α t α ‾ t − 1 α t ( 1 − α ‾ t ) x t − β t α t 1 − α ‾ t ϵ = 1 − α t + α t − α t α ‾ t − 1 α t ( 1 − α ‾ t ) x t − β t α t 1 − α ‾ t ϵ = 1 − α ‾ t α t ( 1 − α ‾ t ) x t − β t α t 1 − α ‾ t ϵ = 1 α t x t − β t α t 1 − α ‾ t ϵ = 1 α t ( x t − β t 1 − α ‾ t ϵ ) \begin{equation} \begin{aligned} \widetilde \mu_t(x_t)&=\frac{\sqrt{\overline\alpha_{t-1}}\beta_t}{1-\overline\alpha_t}\frac{1}{\sqrt{\overline\alpha_t}}(x_t-\sqrt{1-\overline\alpha_t}\epsilon)+\frac{\sqrt{\alpha_t}(1-\overline\alpha_{t-1})}{1-\overline\alpha_t}x_t\\ &=\frac{\sqrt{\overline\alpha_{t-1}}\beta_t}{1-\overline\alpha_t}\frac{1}{\sqrt{\overline\alpha_t}}x_t+\frac{\sqrt{\alpha_t}(1-\overline\alpha_{t-1})}{1-\overline\alpha_t}x_t-\frac{\sqrt{\overline\alpha_{t-1}}\beta_t}{1-\overline\alpha_t}\frac{\sqrt{1-\overline\alpha_t}}{\sqrt{\overline\alpha_t}}\epsilon\\ &=\frac{\beta_t\frac{1}{\sqrt\alpha_t}+\sqrt{\alpha_t}-\sqrt{\alpha_t}\overline\alpha_{t-1}}{1-\overline\alpha_t}x_t-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\overline\alpha_t}}\epsilon\\ &=\frac{\beta_t+\alpha_t-\alpha_t\overline\alpha_{t-1}}{\sqrt{\alpha_t}(1-\overline\alpha_t)}x_t-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\overline\alpha_t}}\epsilon\\ &=\frac{1-\alpha_t+\alpha_t-\alpha_t\overline\alpha_{t-1}}{\sqrt{\alpha_t}(1-\overline\alpha_t)}x_t-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\overline\alpha_t}}\epsilon\\ &=\frac{1-\overline\alpha_t}{\sqrt{\alpha_t}(1-\overline\alpha_t)}x_t-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\overline\alpha_t}}\epsilon\\ &=\frac{1}{\sqrt{\alpha_t}}x_t-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\overline\alpha_t}}\epsilon\\ &=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\overline\alpha_t}}\epsilon) \end{aligned} \end{equation} μ t(xt)=1αtαt1 βtαt 1(xt1αt ϵ)+1αtαt (1αt1)xt=1αtαt1 βtαt 1xt+1αtαt (1αt1)xt1αtαt1 βtαt 1αt ϵ=1αtβtα t1+αt αt αt1xtαt 1αt βtϵ=αt (1αt)βt+αtαtαt1xtαt 1αt βtϵ=αt (1αt)1αt+αtαtαt1xtαt 1αt βtϵ=αt (1αt)1αtxtαt 1αt βtϵ=αt 1xtαt 1αt βtϵ=αt 1(xt1αt βtϵ)
这个时候,我们就可以知道,在每一个时间戳都会有一个均值 μ ~ t ( x t ) \widetilde \mu_t(x_t) μ t(xt)依赖于 x t x_t xt ϵ \epsilon ϵ,这里 x t x_t xt是网络的输入,所以只要能够知道 ϵ \epsilon ϵ,那么我们就能得到 μ ~ t ( x t , x 0 ) \widetilde \mu_t(x_t,x_0) μ t(xt,x0),在DDPM论文中,作者为了简化优化过程,保持方差固定,仅仅让网络学习均值,在有了均值 μ ~ t ( x t , x 0 ) \widetilde \mu_t(x_t,x_0) μ t(xt,x0)和方差 β ~ t \widetilde\beta_t β t后,我们就可以得到 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0),那么一步逆向过程就完成了。因此损失函数为
L t = E x 0 , t , ϵ [ 1 2 ∣ ∣ Σ θ ( x t , t ) ∣ ∣ 2 2 ∣ ∣ μ ~ t − μ θ ( x t , t ) ∣ ∣ 2 2 ] = E x 0 , t , ϵ [ β t 2 2 α t ( 1 − α ‾ t ) ∣ ∣ Σ θ ∣ ∣ 2 2 ∣ ∣ ϵ t − ϵ θ ( α ‾ t x 0 + 1 − α ‾ t ϵ , t ) ∣ ∣ 2 ] \begin{equation} \begin{aligned} \bm L_t&=\mathbb E_{x_0,t,\epsilon}\left[\frac{1}{2||\Sigma_{\theta}(x_t,t)||_2^2}||\widetilde\mu_t-\mu_\theta(x_t,t)||_2^2\right] \\ &=\mathbb E_{x_0,t,\epsilon}\left[\frac{\beta_t^2}{2\alpha_t(1-\overline\alpha_t)||\Sigma_\theta||_2^2}||\epsilon_t-\epsilon_\theta(\sqrt{\overline\alpha_t}x_0+\sqrt{1-\overline\alpha_t}\epsilon,t)||^2\right] \end{aligned} \end{equation} Lt=Ex0,t,ϵ[2∣∣Σθ(xt,t)221∣∣μ tμθ(xt,t)22]=Ex0,t,ϵ[2αt(1αt)∣∣Σθ22βt2∣∣ϵtϵθ(αt x0+1αt ϵ,t)2]
式(14)等效于网络直接预测噪声 ϵ \epsilon ϵ,我们用神经网络 ϵ θ ( x t , t ) \epsilon_\theta(x_t,t) ϵθ(xt,t)来近似噪声 ϵ \epsilon ϵ,因此简化后的损失函数为:
L t s i m p l e = E x 0 , t , ϵ [ ∣ ∣ ϵ − ϵ θ ( α ‾ t x 0 + 1 − α ‾ t ϵ , t ) ∣ ∣ 2 ] \begin{equation} \bm L_t^{simple}=\mathbb E_{x_0,t,\epsilon}\left[||\epsilon-\epsilon_{\theta}(\sqrt{\overline\alpha_t}x_0+\sqrt{1-\overline\alpha_t}\epsilon,t)||^2\right] \end{equation} Ltsimple=Ex0,t,ϵ[∣∣ϵϵθ(αt x0+1αt ϵ,t)2]
下图是DDPM中训练和采样的整体过程
在这里插入图片描述
在训练过程中,DDPM的过程为:
1、取一张无噪声图像 x 0 x_0 x0,在 0 − T 0-T 0T范围内随机选择一个采样时间戳 t t t
2、采样一个标准高斯分布 ϵ \epsilon ϵ作为噪声,将噪声 ϵ \epsilon ϵ加到时间戳 t t t上,得到 x t x_t xt
3、2中采样的噪声为网络的目标输出, x t x_t xt为网络输入,计算网络预测噪声和目标噪声之间的loss和梯度

网络结构

前面我们说过,用来预测噪声的是一个神经网络(unet),unet的特点是输出与输入具有相同的形状,unet是一个encoder-decoder结构,encoder和decoder中间用skip connection相连。结构如下图:
在这里插入图片描述

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

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

相关文章

FPGA纯verilog实现 LZMA 数据压缩,提供工程源码和技术支持

目录 1、前言2、我这儿已有的FPGA压缩算法方案3、FPGA LZMA数据压缩功能和性能4、FPGA LZMA 数据压缩设计方案输入输出接口描述数据处理流程LZ检索器数据同步LZMA 压缩器 为输出LZMA压缩流添加文件头 5、vivado仿真6、福利&#xff1a;工程代码的获取 1、前言 说到FPGA的应用&…

stm32项目(4)——基于stm32的厨房安全检测系统

目录 1.功能介绍 2.硬件方案 1.单片机的选择 2.显示屏的选择 3.温湿度传感器 4.烟雾传感器 5.甲醛传感器 6.排气风扇 3.程序设计 1.接线方式 2.大致思路 1.功能介绍 本次设计的厨房安全检测系统的功能如下&#xff1a; 利用单片机、烟雾传感器、甲醛传感器、温湿度传感器…

LeetCode-Java(03)

9. 回文数 class Solution {public boolean isPalindrome(int x) {if (x < 0 || (x % 10 0 && x ! 0)) {return false;}int revertedNumber 0;while (x > revertedNumber) {revertedNumber revertedNumber * 10 x % 10;x / 10;}// 当长度为奇数时通过reverte…

现代C++中的从头开始深度学习:【5/8】卷积

一、说明 在上一个故事中&#xff0c;我们介绍了机器学习的一些最相关的编码方面&#xff0c;例如 functional 规划、矢量化和线性代数规划。 现在&#xff0c;让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…

【从零学习python 】04. Python编程基础:变量、数据类型与标识符

文章目录 变量以及数据类型一、变量的定义二、变量的类型三、查看数据类型 标识符和关键字标识符命名规则命名规范 关键字进阶案例 变量以及数据类型 一、变量的定义 对于重复使用&#xff0c;并且经常需要修改的数据&#xff0c;可以定义为变量&#xff0c;来提高编程效率。…

kubeasz在线安装K8S集群单master

1.基础系统配置 确保在干净的系统上开始安装&#xff0c;不能使用曾经装过kubeadm或其他k8s发行版的环境 系统是Ubuntu 或者CentOS 7 2.下载文件 2.1 下载工具脚本ezdown&#xff0c;举例使用kubeasz版本3.5.0 #此版本默认安装的是 K8S v1.26.0 export release3.5.0 wget h…

初遇C++之语法篇(完结)

&#x1f9c3;博客主页:阿博历练记 &#x1f4d6;文章专栏:c &#x1f68d;代码仓库:阿博编程日记 &#x1f361;欢迎关注:欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f36d;1.函数重载&#x1f4dc;1.1函数重载的概念&#x1f4e2;1.2函数重载三大误区&#x1f3…

Nacos单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

第十五章 定义 HL7 的 DTL 数据转换

文章目录 第十五章 定义 HL7 的 DTL 数据转换 第十五章 定义 HL7 的 DTL 数据转换 每个接口可能需要一定数量的数据转换。创建转换时&#xff0c;不要使用保留的包名称。 重要提示&#xff1a;请勿在数据转换中手动更改 HL7 转义序列&#xff1b;自动处理这些。 可以使用“数…

智能状态监测如何帮助设备管理团队转型升级?

制造业面临人才短缺和生产力提升的双重挑战。然而&#xff0c;全球市场对生产效率和产品质量的要求依然高企。这些挑战的核心在于&#xff0c;制造业需要在日益复杂的环境下&#xff0c;实时识别并应对生产过程中的异常情况&#xff0c;确保生产持续稳定。 一、传统状态监测的限…

Android 13 Hotseat定制化修改

一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher中,下面开始…

深度学习中的优化算法

文章目录 前言一、优化和深度学习1.1 优化的目标1.2 深度学习中的优化挑战1.2.1 局部最小值1.2.2 鞍点1.2.3 梯度消失 二、梯度下降2.1 一维梯度下降2.1.1 学习率 2.2 多元梯度下降2.3 自适应方法2.3.1 牛顿法2.3.2 其他自适应方法 三、随机梯度下降3.1 随机梯度更新3.2 动态学…

JS逆向之顶像滑块

本教程仅限于学术探讨&#xff0c;也没有专门针对某个网站而编写&#xff0c;禁止用于非法用途、商业活动、恶意滥用技术等&#xff0c;否则后果自负。观看则同意此约定。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目录 一、接口请求流程 二、C1包 三、ac 四…

HTTP协议学习笔记1

初识HTTP 输入网址进入网页过程发生了什么&#xff1f; DNS解析&#xff1a;浏览器会向本地DNS服务器发出域名解析请求&#xff0c;如果本地DNS服务器中没有对应的IP地址&#xff0c;则会向上级DNS服务器继续发出请求&#xff0c;直到找到正确的IP地址为止。 建立TCP连接&…

关于Log日志

日志常用的如Logback&#xff0c;方便查看日志和打印的SQL&#xff08;或配合idea的一些mybaits日志插件&#xff09;&#xff0c;简单讲讲。 Logback等级 ALL < TRACE < DEBUG < INFO < WARN < ERROR <FATAL <OFF 配置文件结构 configuration appender…

微信小程序读取本地json

首先在项目录下新建【server】文件夹&#xff0c;新建data.js文件&#xff0c;并定义好json数据格式。如下&#xff1a; pages/index/index.ts导入data.js并请求json pages/index/index.wxml页面展示数据

365. 水壶问题

365. 水壶问题 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 365. 水壶问题 https://leetcode.cn/problems/water-and-jug-problem/description/ 完成情况&#xff1a; 解题思路&#xff1a; /**在任意一个时刻…

[Web_Unagi]xxe注入过滤绕过

文章目录 [Web_Unagi]xxe注入过滤绕过 [Web_Unagi]xxe注入过滤绕过 提示我们需要上传文件&#xff0c;并且flag在根目录下&#xff0c; 上传文件的格式为&#xff1a; <users><user><username>alice</username><password>passwd1</password…

封装上传文件组件(axios,进度条onUploadProgress,取消请求)

目录 定时模拟进度条 方法 A.axios B.xhr 取消请求​​​​​​​ 完整代码 A.自定义上传组件 B.二次封装组件 情况 增加cancelToken不生效&#xff0c;刷新页面 进度条太快->设置浏览器网速 定时模拟进度条 startUpload() {if (!this.file) return;const totalS…