0基础学习diffusion_model扩散模型【易理解的公式推导】

news2024/9/8 23:42:55

0基础学习diffusion_model扩散模型【易理解的公式推导】

  • 一、概述
  • 二、扩散过程(已知X0求Xt)
  • 三、逆扩散过程(已知Xt求Xt-1)
    • 1。算法流程图
  • 四、结论
  • 五、损失函数
  • 六、心得体会(优缺点分析)

一、概述

在这里插入图片描述

DDPM论文链接:
Jonathan Ho_Denoising Diffusion Probabilistic Models(NeurIPS 2020)
去噪扩散概率模型。
项目地址:
https://github.com/hojonathanho/diffusion
本文是笔者在学习扩散模型时的一些笔记与心得,在公式推导过程中能够保证自己是一步一步去推导并且理解了的。概述是我认为比较重要的部分能够帮助理解公式的推导,具体的公式推导在每一小节中进行。

1、扩散过程:如上图所示,扩散过程为从右到左 X 0 → X T X_0 \rightarrow X_T X0XT的过程,表示对图片逐渐加噪,且 X t + 1 X_{t+1} Xt+1是在 X t X_{t} Xt加躁得到的,其只受 X t X_{t} Xt的影响,因此扩散过程是一个马尔科夫过程 X 0 X_0 X0表示从真实数据集中采样得到的一张图片,对 X 0 X_0 X0 添加T次噪声,图片逐渐变得模糊,当T足够大时, X T X_T XT标准正态分布。在训练过程中,每次添加的噪声是已知的, q ( X t ∣ X t − 1 ) q(X_t|X_{t-1}) q(XtXt1)是已知的,根据马尔科夫过程的性质,我们可以递归得到 q ( X t ∣ X 0 ) q(X_t|X_0) q(XtX0) q ( X t ∣ X 0 ) q(X_t|X_0) q(XtX0)是已知的。具体推导过程见本文的扩散过程。

2、逆扩散过程:如上图所示,逆扩散过程为从左到右 X T → X 0 X_T \rightarrow X_0 XTX0的过程,表示从噪声中逐渐复原出图片。如果我们能够在给定 X t X_t Xt条件下知道 X t − 1 X_{t-1} Xt1的分布,即如果我们可以知道 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),因此我们才会用 p Θ ( X t − 1 ∣ X t ) p_{Θ}(X_{t-1}|X_t) pΘ(Xt1Xt)来近似 q ( X t − 1 ∣ X t ) q(X_{t-1}|X_t) q(Xt1Xt) p Θ ( X t − 1 ∣ X t ) p_{Θ}(X_{t-1}|X_t) pΘ(Xt1Xt)就是我们要训练的网络,在原文中就是个U-Net。而很妙的是,虽然我们不知道 q ( X t − 1 ∣ X t ) q(X_{t-1}|X_t) q(Xt1Xt),但是 q ( X t − 1 ∣ X t X 0 ) q(X_{t-1}|X_tX_0) q(Xt1XtX0)却是可以用 q ( X t ∣ X 0 ) q(X_t|X_0) q(XtX0) q ( X t ∣ X t − 1 ) q(X_t|X_{t-1}) q(XtXt1)表示的, q ( X t − 1 ∣ X t X 0 ) q(X_{t-1}|X_tX_0) q(Xt1XtX0)是可知的,**因此我们可以用 q ( X t − 1 ∣ X t X 0 ) q(X_{t-1}|X_tX_0) q(Xt1XtX0)q来指导 p Θ ( X t − 1 ∣ X t ) p_{Θ}(X_{t-1}|X_t) pΘ(Xt1Xt)进行训练。**具体推导过程见本文的逆扩散过程。

二、扩散过程(已知X0求Xt)

在这里插入图片描述

  • 第一步其实就是不断往输入数据中加噪声,最后就快变成了个纯噪声。
  • 每一个时刻都要添加高斯噪声,后一时刻都是由前一刻是增加噪声得到。(马尔科夫过程)
  • 其实这个过程可以看作是不断构建标签 (噪声) 的过程,后续会用到。

α t = 1 − β t \alpha_{t}=1-\beta_{t} αt=1βt β \beta β要越来越大,论文中 β \beta β是从0.0001 到 0.002 ,从而 α \alpha α 也就是要越来越小。
x t = a t x t − 1 + 1 − α t z 1 (1) x_{t}=\sqrt{a_{t}} x_{t-1}+\sqrt{1-\alpha_{t}} z_{1} \tag{1} xt=at xt1+1αt z1(1)
一开始加点噪就有效果,越往后得加噪越多才行。
但是现在咱们只能知道后一时刻分布是由前一时刻加噪得到的,但是整个序列咋算?
如果一个个来计算,那也太慢了吧,能不能直接Xt由X0直接就能算出来呢?咱们来试试看:
x t − 1 = a t − 1 x t − 2 + 1 − α t − 1 z 2 x_{t-1}=\sqrt{a_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t-1}} z_{2} xt1=at1 xt2+1αt1 z2一步步来,再往前一时刻咱们也能算。继续代入公式(1):

x t = a t ( a t − 1 x t − 2 + 1 − α t − 1 z 2 ) + 1 − α t z 1 x_{t}=\sqrt{a_{t}}\left(\sqrt{a_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t-1}} z_{2}\right)+\sqrt{1-\alpha_{t}} z_{1} xt=at (at1 xt2+1αt1 z2)+1αt z1

其中每次加入的噪声都服从高斯分布 z 1 , z 2 , … ∼ N ( 0 , I ) z_{1}, z_{2}, \ldots \sim \mathcal{N}(0, \mathbf{I}) z1,z2,N(0,I)
= a t a t − 1 x t − 2 + ( a t ( 1 − α t − 1 ) z 2 + 1 − α t z 1 ) =\sqrt{a_{t} a_{t-1}} x_{t-2}+\left(\sqrt{a_{t}\left(1-\alpha_{t-1}\right)} z_{2}+\sqrt{1-\alpha_{t}} z_{1}\right) =atat1 xt2+(at(1αt1) z2+1αt z1) 这步就展开而已。
= a t a t − 1 x t − 2 + 1 − α t α t − 1 z ˉ 2 =\sqrt{a_{t} a_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t} \alpha_{t-1}} \bar{z}_{2} =atat1 xt2+1αtαt1 zˉ2 Z1与Z2都服从高斯分布,分别: N ( 0 , 1 − α t ) N ( 0 , a t ( 1 − α t − 1 ) ) \begin{array}{l} \mathcal{N}\left(0,1-\alpha_{t}\right) \\ \mathcal{N}\left(0, a_{t}\left(1-\alpha_{t-1}\right)\right) \end{array} N(0,1αt)N(0,at(1αt1))
这里就是相加后仍服从高斯做了化简
N ( 0 , σ 1 2 I ) + N ( 0 , σ 2 2 I ) ∼ N ( 0 , ( σ 1 2 + σ 2 2 ) I ) \mathcal{N}\left(0, \sigma_{1}^{2} \mathbf{I}\right)+\mathcal{N}\left(0, \sigma_{2}^{2} \mathbf{I}\right) \sim \mathcal{N}\left(0,\left(\sigma_{1}^{2}+\sigma_{2}^{2}\right) \mathbf{I}\right) N(0,σ12I)+N(0,σ22I)N(0,(σ12+σ22)I)
不断迭代:令 α ˉ t = ∏ i = 1 t α i \bar{\alpha}_{t}=\prod_{i=1}^{t} \alpha_{i} αˉt=i=1tαi
x t = α ‾ t x 0 x_t=\sqrt {\overline{\alpha}_ {t}}x_ {0} xt=αt x0 + 1 − α ‾ t \sqrt {1-\overline {\alpha} }_ {t} 1α t z ‾ t \overline {z}_t zt
规律是任意时刻的分布都可以直接通过X0的初始状态算出来。
加噪过程已知,后面便是去噪生成。

三、逆扩散过程(已知Xt求Xt-1)

在这里插入图片描述
首先看 X − t − 1 X-{t-1} Xt1的推导公式。
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 ) (2) q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}, \mathbf{x}_{0}\right)=q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}, \mathbf{x}_{0}\right) \frac{q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{0}\right)}{q\left(\mathbf{x}_{t} \mid \mathbf{x}_{0}\right)}\tag{2} q(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0)(2)对于这个公式其实就是一个贝叶斯公式。
q ( x t − 1 ∣ x t ) = q ( x t x t − 1 ) q ( x t ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ) q ( x t ) q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}\right)=\frac{q\left(\mathbf{x}_{t} \mathbf{x}_{t-1}\right)}{q(\mathbf{x}_{t})}=q(\mathbf{x}_{t}\mid\mathbf{x}_{t-1})\frac{q(\mathbf{x}_{t-1})}{q(\mathbf{x}_{t})} q(xt1xt)=q(xt)q(xtxt1)=q(xtxt1)q(xt)q(xt1)
然后在已知X0的情况下加一个X0就是公式(2)。

然后令 α ˉ t = ∏ i = 1 t α i \bar{\alpha}_{t}=\prod_{i=1}^{t} \alpha_{i} αˉt=i=1tαi
q ( x t − 1 ∣ x 0 ) = a ‾ t − 1 x 0 + 1 − a ˉ t − 1 z ∼ N ( a ‾ t − 1 x 0 , 1 − a ˉ t − 1 ) q ( x t ∣ x 0 ) = α ˉ t x 0 + 1 − α ˉ t z ∼ N ( α ˉ t x 0 , 1 − α ˉ t ) q ( x t ∣ x t − 1 , x 0 ) = a t x t − 1 + 1 − α t z ∼ N ( a t x t − 1 , 1 − α t ) \begin{array}{l} q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{0}\right)=\sqrt{\overline{a}_{t-1}} x_{0}+\sqrt{1-\bar{a}_{t-1}} z\sim \mathcal{N}\left(\sqrt{\overline{a}_{t-1}}x_{0}, 1-\bar{a}_{t-1}\right) \\ q\left(\mathbf{x}_{t} \mid \mathbf{x}_{0}\right)=\sqrt{\bar{\alpha}_{t}} x_{0}+\sqrt{1-\bar{\alpha}_{t}} z\sim \mathcal{N}\left(\sqrt{\bar{\alpha}_{t}} x_{0}, 1-\bar{\alpha}_{t}\right) \\ q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}, \mathbf{x}_{0}\right)=\sqrt{a_{t}} x_{t-1}+\sqrt{1-\alpha_{t}} z\sim \mathcal{N}\left(\sqrt{a_{t}} x_{t-1}, 1-\alpha_{t}\right) \end{array} q(xt1x0)=at1 x0+1aˉt1 zN(at1 x0,1aˉt1)q(xtx0)=αˉt x0+1αˉt zN(αˉt x0,1αˉt)q(xtxt1,x0)=at xt1+1αt zN(at xt1,1αt)
可见这三项都是已知的,分布也已经知道了。
然后 q ( x t − 1 ∣ x t , x 0 ) q\left(\mathbf{x}_{t-1} \mid \mathbf{x}_{t}, \mathbf{x}_{0}\right) q(xt1xt,x0)的分布也就是:
∝ exp ⁡ ( − 1 2 ( ( x t − α t x t − 1 ) 2 β t + ( x t − 1 − α ˉ t − 1 x 0 ) 2 1 − α ˉ t − 1 − ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) ) \propto \exp \left(-\frac{1}{2}\left(\frac{\left(\mathbf{x}_{t}-\sqrt{\alpha_{t}} \mathbf{x}_{t-1}\right)^{2}}{\beta_{t}}+\frac{\left(\mathbf{x}_{t-1}-\sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_{0}\right)^{2}}{1-\bar{\alpha}_{t-1}}-\frac{\left(\mathbf{x}_{t}-\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}\right)^{2}}{1-\bar{\alpha}_{t}}\right)\right) exp(21(βt(xtαt xt1)2+1αˉt1(xt1αˉt1 x0)21αˉt(xtαˉt x0)2))
把标准的正太分布展开后也就是一个e的指数函数,乘法和除法分别对应指数的加法和减法。
然后继续化简:(因为只关心 X t − 1 X_{t-1} Xt1所以将含有 X t − 1 X_{t-1} Xt1的项开方并化简, X t 与 X 0 X_{t}与X_{0} XtX0当常数)
= exp ⁡ ( − 1 2 ( x t 2 − 2 α t x t x t − 1 + α t x t − 1 2 β t + x t − 1 2 − 2 α ˉ t − 1 x 0 x t − 1 + α ˉ t − 1 x 0 2 1 − α ˉ t − 1 − ( x t − α ˉ t x 0 ) 2 1 − α ˉ t ) ) =\exp \left(-\frac{1}{2}\left(\frac{\mathbf{x}_{t}^{2}-2 \sqrt{\alpha_{t}} \mathbf{x}_{t} \mathbf{x}_{t-1}+\alpha_{t} \mathbf{x}_{t-1}^{2}}{\beta_{t}}+\frac{\mathbf{x}_{t-1}^{2}-2 \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_{0} \mathbf{x}_{t-1}+\bar{\alpha}_{t-1} \mathbf{x}_{0}^{2}}{1-\bar{\alpha}_{t-1}}-\frac{\left(\mathbf{x}_{t}-\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}\right)^{2}}{1-\bar{\alpha}_{t}}\right)\right) =exp(21(βtxt22αt xtxt1+αtxt12+1αˉt1xt122αˉt1 x0xt1+αˉt1x021αˉt(xtαˉt x0)2))
= exp ⁡ ( − 1 2 ( ( α t β t + 1 1 − α ˉ t − 1 ) x t − 1 2 − ( 2 α t β t x t + 2 α ˉ t − 1 1 − α ˉ t − 1 x 0 ) x t − 1 + C ( x t , x 0 ) ) ) =\exp \left(-\frac{1}{2}\left(\left(\frac{\alpha_{t}}{\beta_{t}}+\frac{1}{1-\bar{\alpha}_{t-1}}\right) \mathbf{x}_{t-1}^{2}-\left(\frac{2 \sqrt{\alpha_{t}}}{\beta_{t}} \mathbf{x}_{t}+\frac{2 \sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}} \mathbf{x}_{0}\right) \mathbf{x}_{t-1}+C\left(\mathbf{x}_{t}, \mathbf{x}_{0}\right)\right)\right) =exp(21((βtαt+1αˉt11)xt12(βt2αt xt+1αˉt12αˉt1 x0)xt1+C(xt,x0)))
其中C是常数项。
类似于:
exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) = exp ⁡ ( − 1 2 ( 1 σ 2 x 2 − 2 μ σ 2 x + μ 2 σ 2 ) ) \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)=\exp \left(-\frac{1}{2}\left(\frac{1}{\sigma^{2}} x^{2}-\frac{2 \mu}{\sigma^{2}} x+\frac{\mu^{2}}{\sigma^{2}}\right)\right) exp(2σ2(xμ)2)=exp(21(σ21x2σ22μx+σ2μ2))
可以求得期望和方差。
其实:
q ( X t − 1 ∣ X t X 0 ) = 1 2 π 1 − α ˉ t − 1 1 − α ˉ t β t exp ⁡ ( − 1 2 1 − α ˉ t − 1 1 − α ˉ t β t ( X t − 1 2 − 2 ( ( 1 − α ˉ t − 1 ) α t X t 1 − α ˉ t + β t α ˉ t − 1 X 0 1 − α ˉ t ) X t − 1 + C ( X 0 , X t ) q\left(X_{t-1} \mid X_{t} X_{0}\right)=\frac{1}{\sqrt{2 \pi \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}} \beta_{t}}} \exp \left(-\frac{1}{2 \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}} \beta_{t}}\left(X_{t-1}^{2}-2\left(\frac{\left(1-\bar{\alpha}_{t-1}\right) \sqrt{\alpha_{t}} X_{t}}{1-\bar{\alpha}_{t}}+\frac{\beta_{t} \sqrt{\bar{\alpha}_{t-1}} X_{0}}{1-\bar{\alpha}_{t}}\right) X_{t-1}\right.\right.+C(X_0,X_t) q(Xt1XtX0)=2π1αˉt1αˉt1βt 1exp(21αˉt1αˉt1βt1(Xt122(1αˉt(1αˉt1)αt Xt+1αˉtβtαˉt1 X0)Xt1+C(X0Xt)
即:
q ( X t − 1 ∣ X t X 0 ) = N ( X t − 1 ; ( 1 − α ˉ t − 1 ) α t X t 1 − α ˉ t + β t α ˉ t − 1 X 0 1 − α ˉ t , 1 − α ˉ t − 1 1 − α ˉ t β t ) q\left(X_{t-1} \mid X_{t} X_{0}\right)=N\left(X_{t-1} ; \frac{\left(1-\bar{\alpha}_{t-1}\right) \sqrt{\alpha_{t}} X_{t}}{1-\bar{\alpha}_{t}}+\frac{\beta_{t} \sqrt{\bar{\alpha}_{t-1}} X_{0}}{1-\bar{\alpha}_{t}}, \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}} \beta_{t}\right) q(Xt1XtX0)=N(Xt1;1αˉt(1αˉt1)αt Xt+1αˉtβtαˉt1 X0,1αˉt1αˉt1βt)
但是现在的问题是没有 X 0 X_0 X0,我们需要用 X t X_t Xt来替换它。
即:
x 0 = 1 α ˉ t ( x t − 1 − α ˉ t z t ) , z t 是标准的正太分布。 \mathbf{x}_{0}=\frac{1}{\sqrt{\bar{\alpha}_{t}}}\left(\mathbf{x}_{t}-\sqrt{1-\bar{\alpha}_{t}} \mathbf{z}_{t}\right),z_t是标准的正太分布。 x0=αˉt 1(xt1αˉt zt),zt是标准的正太分布。
代入化简,很巧妙的是:
q ( X t − 1 ∣ X t X 0 ) = N ( X t − 1 ; 1 α t X t − β t α t ( 1 − α ˉ t ) Z , 1 − α ˉ t − 1 1 − α ˉ t β t ) , Z ∼ N ( 0 , I ) q\left(X_{t-1} \mid X_{t} X_{0}\right)=N\left(X_{t-1} ; \frac{1}{\sqrt{\alpha_t}} X_{t}-\frac{\beta_{t}}{\sqrt{\alpha_{t}\left(1-\bar{\alpha}_{t}\right)}} Z, \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}} \beta_{t}\right), Z \sim N(0, I) q(Xt1XtX0)=N(Xt1;αt 1Xtαt(1αˉt) βtZ,1αˉt1αˉt1βt),ZN(0,I)
其中 z t z_t zt是每一时刻的噪音。

  • 用模型来计算,论文里用Unet来玩,模型的输入有两个,分别是当前时刻的分布和时刻t

1。算法流程图

在这里插入图片描述
核心是两个公式:
x t = α ‾ t x 0 + 1 − α ‾ t z ‾ t (a) x_t=\sqrt {\overline{\alpha}_ {t}}x_ {0} + \sqrt {1-\overline {\alpha} }_ {t}\overline {z}_t\tag{a} xt=αt x0+1α tzt(a)
x t − 1 = μ t + σ t x t (b) x_{t-1}=\mu_t+\sigma_tx_t\tag{b} xt1=μt+σtxt(b)
其中的一些参数均能求出。

四、结论

简单的说,扩散模型的目的是希望学习出一个 p Θ ( X t − 1 ∣ X t ) p_{Θ}(X_{t-1}|X_t) pΘ(Xt1Xt),即能够从噪声图恢复出原图。
为了达到这一个目的,我们使用 q ( X t − 1 ∣ X t X 0 ) q(X_{t-1}|X_tX_0) q(Xt1XtX0)来监督 p Θ ( X t − 1 ∣ X t ) p_{Θ}(X_{t-1}|X_t) pΘ(Xt1Xt)进行训练, q ( X t − 1 ∣ X t X 0 ) q(X_{t-1}|X_tX_0) q(Xt1XtX0)是可以用 q ( X t ∣ X 0 ) q(X_t|X_0) q(XtX0) q ( X t ∣ X t − 1 ) q(X_t|X_{t-1}) q(XtXt1)表示的,即 q ( X t − 1 ∣ X t X 0 ) q(X_{t-1}|X_tX_0) q(Xt1XtX0)是已知的。

五、损失函数

打算后面再写一篇文章作为补充。

六、心得体会(优缺点分析)

扩散模型可以与许多CV方向的任务结合,是最新的生成模型。对于GAN而言需要训练两个网络,难度较大,不容易收敛,多样性较差,重点是骗过鉴别器。
扩散模型的优点:

  1. 训练稳定
  2. 更逼真
  3. 更具有可控性。

参考链接:

  1. https://www.bilibili.com/video/BV1B8411G7sV/?vd_source=5413f4289a5882463411525768a1ee27
  2. https://blog.csdn.net/Little_White_9/article/details/124435560?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167677401216782425144637%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167677401216782425144637&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-124435560-null-null.142v73control,201v4add_ask,239v2insert_chatgpt&utm_term=diffusion%20model&spm=1018.2226.3001.4187

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

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

相关文章

Android入门第64天-MVVM下瀑布流界面的完美实现-使用RecyclerView

前言 网上充满着不完善的基于RecyclerView的瀑布流实现,要么根本是错的、要么就是只知其一不知其二、要么就是一充诉了一堆无用代码、要么用的是古老的MVC设计模式。 一个真正的、用户体验类似于淘宝、抖音的瀑布流怎么实现目前基本为无解。因为本人正好自己空闲时也…

32岁,薪水被应届生倒挂,裸辞了

今年 32 岁,我从公司离职了,是裸辞。 前段时间,我有一件事情一直憋在心里很难受,想了很久也没找到合适的人倾诉,就借着今天写出来。 我一个十几年开发经验,八年 软件测试 经验的职场老人,我慢…

markdown常用语法--花括号(超详细)

💌 所属专栏:【Markdown常用语法】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#x1…

2023年,自动化测试岗位有这么吃香吗

测试人员需要具备自动化测试或者测试开发能力,已经成为测试行业内容的一种显在趋势,而且这种趋势呈放大态势,其发展前景是十分明朗的。 2022疫情期间,就业大环境不是很理想,目前呢,企业倾向于招自动化测试…

易基因项目文章| 组蛋白ChIP-seq揭示烟粉虱含菌细胞共生菌调控宿主生殖的新机制

喜报:易基因组蛋白ChIP-seq研究成果见刊《Cell Reports》2023年02月10日,沈阳农业大学植物保护学院博士研究生姚亚林为第一作者、栾军波教授为论文通讯作者在《Cell Reports》杂志以“A bacteriocyte symbiont determines whitefly sex ratio by regulat…

④ 链表

24. 两两交换链表中的节点 题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/ 注意点: 遍历链表的时候什么时候截止(避免空指针异常或无限死循环的问题)? 节点数量为偶数或链表为空时,cur.ne…

关于欧拉角你需要知道几个点

基础理解,参照:https://www.cnblogs.com/Estranged-Tech/p/16903025.html 欧拉角、万向节死锁(锁死)理解 一、欧拉角理解 举例讲解 欧拉角用三次独立的绕确定的轴旋转角度来表示姿态。如下图所示 经过三次旋转,旋…

原创不易,坚持更难

早上CSDN发消息,今天是创作满三年的纪念日,邀请写一篇博文,谈谈感受 开博原因 2020年是一个特殊的年份,疫情刚爆发第一年,也是第一次居家办公,从过完年就一直居家办公,一直居家了38天。2020年…

宗教生活污水处理项目的设计原则

我国的历史源远流长,许多传统文化都延续了上千年以上。同时,我国也是宗教信仰自由的国家,儒释道文化相互影响,交相辉映。游人穿过山间小道,走到寺院庄严礼拜,游客和信众的增多,使教堂、寺庙等宗…

机器学习笔记之谱聚类(一)k-Means聚类算法介绍

机器学习笔记之谱聚类——K-Means聚类算法介绍引言回顾:高斯混合模型聚类任务基本介绍距离计算k-Means\text{k-Means}k-Means算法介绍k-Means\text{k-Means}k-Means算法示例k-Means\text{k-Means}k-Means算法与高斯混合模型的关系k-Means\text{k-Means}k-Means算法的…

CTFer成长之路之CTF中的SQL注入

CTF中的SQL注入CTF SQL注入 SQL注入-1 题目描述: 暂无 docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-sql-1:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{union_select_is_so_cool} Wri…

PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)

目录 一、打开数据库表 1. 写打开数据库的槽函数 2. 运行后发现数据库可以打开了 3. ODBC配通了,数据库还是打不开 4. 写在tableView上显示数据库表的函数 5. 运行后发现表可以显示了 6. 代码分析 7. 添加列名称 8. 根据内容调整列宽 9. 备注:…

Kaggle系列之CIFAR-10图像识别分类(残差网络模型ResNet-18)

CIFAR-10数据集在计算机视觉领域是一个很重要的数据集,很有必要去熟悉它,我们来到Kaggle站点,进入到比赛页面:https://www.kaggle.com/competitions/cifar-10CIFAR-10是8000万小图像数据集的一个子集,由60000张32x32彩…

spring cloud gateway集成sentinel并扩展支持restful api进行url粒度的流量治理

sentinel集成网关支持restful接口进行url粒度的流量治理前言使用网关进行总体流量治理(sentinel版本:1.8.6)1、cloud gateway添加依赖:2、sentinel配置3、网关类型项目配置4、通过zk事件监听刷新上报api分组信息1、非网关项目上报api分组信息…

I.MX6ULL_Linux_系统篇(16) uboot分析-启动流程

原文链接:I.MX6ULL_系统篇(16) uboot分析-启动流程 – WSY Personal Blog (cpolar.cn) 前面我们详细的分析了 uboot 的顶层 Makefile,了解了 uboot 的编译流程。本章我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。通过对 …

虹科资讯| 虹科AR荣获汽车后市场“20佳”维修工具评委会提名奖!

2022 虹科荣获20佳维修工具 评委会提名奖 特大喜讯,在2月16日《汽车维修与保养》杂志主办的第十八届汽车后市场“20佳”评选活动中,虹科的产品“M400智能AR眼镜”凭借在AR领域的专业实力,通过层层筛选,在102款入围产品中脱颖而出…

GIT:【基础三】Git工作核心原理

目录 一、Git本地四个工作区域 二、Git提交文件流程 一、Git本地四个工作区域 工作目录(Working Directory):电脑上存放开发代码的地方。暂存区(Stage/Index):用于l临时存放改动的文件,本质上只是一个文件,保存即将提交到文件列…

[ 对比学习篇 ] 经典网络模型 —— Contrastive Learning

🤵 Author :Horizon Max ✨ 编程技巧篇:各种操作小结 🏆 神经网络篇:经典网络模型 💻 算法篇:再忙也别忘了 LeetCode [ 对比学习篇 ] 经典网络模型 —— Contrastive Learning🚀 …

MongoDB介绍及使用教程

文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装(Windows)2.MongoDB Conpass简单使用(选学)3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…

JVM11 垃圾回收

1.1GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 Java不同版本新特性 语法层面:Lambda表达式、switch、自动拆箱装箱、enumAPI层面…