昇思Mindspore25天学习打卡Day21:Diffusion扩散模型

news2024/11/15 18:06:18

昇思Mindspore25天学习打卡Day21:Diffusion扩散模型

  • 1 模型简介
    • 1.1 什么是Diffusion
    • 1.2 扩散模型实现原理
      • 1.2.1 Diffusion前向过程
      • 1.2.2 Diffusion逆向过程
      • 1.2.3 U-Net神经网络预测噪声
  • 2 构建Diffusion模型
    • 2.1 位置向量
    • 2.2 ResNet/ConvNeXT块
    • 2.3 Attention模块
    • 2.4 组归一化
    • 2.5 条件U-Net
    • 2.6 正向扩散
  • 3 数据准备与处理
    • 3.1 采样
  • 4 训练过程
  • 5 推理过程(从模型中采样)
  • 6 总结
  • 参考

本文基于Link: Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了Link: 由浅入深了解Diffusion Model一文。

  • 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件,执行Python文件时,请确保执行环境安装了GUI界面。

关于扩散模型(Diffusion Models)有很多种理解,本文的介绍是基于denoising diffusion probabilistic model (DDPM),DDPM已经在(无)条件图像/音频/视频生成领域取得了较多显著的成果,现有的比较受欢迎的的例子包括由OpenAI主导的Link:GLIDE和Link:DALL-E 2、由海德堡大学主导的Link:潜在扩散和由Google Brain主导的Link:图像生成。

实际上生成模型的扩散概念已经在Link:(Sohl-Dickstein et al., 2015)中介绍过。然而,直到Link:(Song et al., 2019)(斯坦福大学)和Link:(Ho et al., 2020)(在Google Brain)才各自独立地改进了这种方法。

本文是在Phil WangLink:基于PyTorch框架的复现的基础上(而它本身又是基于Link:TensorFlow实现),迁移到MindSpore AI框架上实现的。
在这里插入图片描述
实验中我们采用离散时间(潜在变量模型)的观点,另外,读者也可以查看有关于扩散模型的其他Link:几个观点!

实验开始之前请确保安装并导入所需的库(假设您已经安装了Link:MindSpore、download、dataset、matplotlib以及tqdm)。
在这里插入图片描述

1 模型简介

1.1 什么是Diffusion

如果将Diffusion与其他生成模型(如Normalizing Flows、GAN或VAE)进行比较,它并没有那么复杂,它们都将噪声从一些简单分布转换为数据样本,Diffusion也是从纯噪声开始通过一个神经网络学习逐步去噪,最终得到一个实际图像。 Diffusion对于图像的处理包括以下两个过程:

  • 我们选择的固定(或预定义)正向扩散过程 q q q :它逐渐将高斯噪声添加到图像中,直到最终得到纯噪声
  • 一个学习的反向去噪的扩散过程 p θ p_θ pθ :通过训练神经网络从纯噪声开始逐渐对图像去噪,直到最终得到一个实际的图像- 在这里插入图片描述
  • t t t 索引的正向和反向过程都发生在某些有限时间步长 T T T(DDPM作者使用 T T T=1000)内。从 t t t=0开始,在数据分布中采样真实图像 X 0 X_0 X0(本文使用一张来自ImageNet的猫图像形象的展示了diffusion正向添加噪声的过程),正向过程在每个时间步长 t t t都从高斯分布中采样一些噪声,再添加到上一个时刻的图像中。假定给定一个足够大的 T T T 和一个在每个时间步长添加噪声的良好时间表,您最终会在 t = T t=T t=T通过渐进的过程得到所谓的各向同性的Link:高斯分布。

1.2 扩散模型实现原理

1.2.1 Diffusion前向过程

所谓前向过程,即向图片上加噪声的过程。虽然这个步骤无法做到图片生成,但这是理解diffusion model以及构建训练样本至关重要的一步。 首先我们需要一个可控的损失函数,并运用神经网络对其进行优化。

q ( x 0 ) q(x_0) q(x0) 是真实数据分布,由于 x 0 ∼ q ( x 0 ) x_0∼q(x_0) x0q(x0) ,所以我们可以从这个分布中采样以获得图像 x 0 x_0 x0 。接下来我们定义前向扩散过程 q ( x t ∣ x t − 1 ) q(x_t|x_{t−1}) q(xtxt1) ,在前向过程中我们会根据已知的方差 0 < β 1 < β 2 < . . . < β r < 1 0<β_1<β_2<...<β_r<1 0<β1<β2<...<βr<1 在每个时间步长 t t t 添加高斯噪声,由于前向过程的每个时刻 t t t 只与时刻 t − 1 t-1 t1 有关,所以也可以看做马尔科夫过程:

q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) 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}) q(xtxt1)=N(xt;1βt xt1,βtI)

回想一下,正态分布(也称为高斯分布)由两个参数定义:平均值 μ μ μ 和方差 σ 2 ≥ 0 σ^2≥0 σ20 。基本上,在每个时间步长 t t t 处的产生的每个新的(轻微噪声)图像都是从条件高斯分布中绘制的,其中

q ( μ t ) = 1 − β t x t − 1 q(\mathbf{\mu}_t) = \sqrt{1 - \beta_t} \mathbf{x}_{t-1} q(μt)=1βt xt1

我们可以通过采样 ϵ ∼ N ( 0 , I ) ϵ∼\mathcal{N}(0,I) ϵN(0,I) 然后设置

q ( x t ) = 1 − β t x t − 1 + β t ϵ q(\mathbf{x}_t) = \sqrt{1 - \beta_t} \mathbf{x}_{t-1} + \sqrt{\beta_t} \mathbf{\epsilon} q(xt)=1βt xt1+βt ϵ

请注意, β t β_t βt 在每个时间步长 t _t t (因此是下标)不是恒定的:事实上,我们定义了一个所谓的“动态方差”的方法,使得每个时间步长的 β t β_t βt 可以是线性的、二次的、余弦的等(有点像动态学习率方法)。

因此,如果我们适当设置时间表,从 X 0 X_0 X0 开始,我们最终得到 x 1 , . . . , x t , . . . , x T x_1,...,x_t,...,x_T x1,...,xt,...,xT,即随着 t t t 的增大 x t x_t xt 会越来越接近纯噪声,而 x T x_T xT就是纯高斯噪声。

那么,如果我们知道条件概率分布 p ( x t − i ∣ x t ) p(x_t−i|x_t) p(xtixt) ,我们就可以反向运行这个过程:通过采样一些随机高斯噪声 x T x_T xT,然后逐渐去噪它,最终得到真实分布 x 0 \mathbf{x}_0 x0中的样本。但是,我们不知道条件概率分布 p ( x t − 1 ∣ x t ) p(\mathbf{x}_{t-1} | \mathbf{x}_t) p(xt1xt)。这很棘手,因为需要知道所有可能图像的分布,才能计算这个条件概率。

1.2.2 Diffusion逆向过程

为了解决上述问题,我们将利用神经网络来近似(学习)这个条件概率分布 p θ ( x t − 1 ∣ x t ) p_\theta (\mathbf{x}_{t-1} | \mathbf{x}_t) pθ(xt1xt),其中 θ \theta θ是神经网络的参数。如果说前向过程(forward)是加噪的过程,那么逆向过程(reverse)就是diffusion的去噪推断过程,而通过神经网络学习并表示 p θ ( x t − 1 ∣ x t ) p_\theta (\mathbf{x}_{t-1} | \mathbf{x}_t) pθ(xt1xt) 的过程就是Diffusion 逆向去噪的核心。

现在,我们知道了需要一个神经网络来学习逆向过程的(条件)概率分布。我们假设这个反向过程也是高斯的,任何高斯分布都由2个参数定义:

  • μ θ μ_θ μθ 参数化的平均值

  • μ θ μ_θ μθ 参数化的方差

综上,我们可以将逆向过程公式化为

p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta (\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1};\mu_\theta(\mathbf{x}_{t},t), \Sigma_\theta (\mathbf{x}_{t},t)) pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))

其中平均值和方差也取决于噪声水平 t t t ,神经网络需要通过学习来表示这些均值和方差。

  • 注意,DDPM的作者决定保持方差固定,让神经网络只学习(表示)这个条件概率分布的平均值 μ θ μ_θ μθ
  • 本文我们同样假设神经网络只需要学习(表示)这个条件概率分布的平均值 μ θ μ_θ μθ

为了导出一个目标函数来学习反向过程的平均值,作者观察到 q q q p θ p_θ pθ 的组合可以被视为变分自动编码器(VAE)。因此,变分下界(也称为ELBO)可用于最小化真值数据样本 x 0 x_0 x0 的似然负对数(有关ELBO的详细信息,请参阅VAE论文Link:(Kingma等人,2013年)),该过程的ELBO是每个时间步长的损失之和 L=L0+L1+…+LT ,其中,每项的损失 Lt (除了 L0 )实际上是2个高斯分布之间的KL发散,可以明确地写为相对于均值的L2-loss!

如Sohl-Dickstein等人所示,构建Diffusion正向过程的直接结果是我们可以在条件是 x0 (因为高斯和也是高斯)的情况下,在任意噪声水平上采样 xt ,而不需要重复应用 q 去采样 xt ,这非常方便。使用
α t : = 1 − β t α_t:=1−β_t αt:=1βt α ˉ t : = Π t s = 1 α s \bar{\alpha}t:=Π{^t}_{s=1}α_s αˉt:=Πts=1αs
我们就有
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(x_t|x_0)=\mathcal{N}(x_t;\sqrt{\bar{\alpha}_t}x_0,(1−\bar{\alpha}_t)I) q(xtx0)=N(xt;αˉt x0,(1αˉt)I)
这意味着我们可以采样高斯噪声并适当地缩放它,然后将其添加到 x 0 x_0 x0 中,直接获得 x t x_t xt

请注意, α ˉ t \bar{\alpha}_t αˉt 是已知 β t β_t βt 方差计划的函数,因此也是已知的,可以预先计算。这允许我们在训练期间优化损失函数 L L L 的随机项。或者换句话说,在训练期间随机采样 t t t 并优化 L t L_t Lt

正如Ho等人所展示的那样,这种性质的另一个优点是可以重新参数化平均值,使神经网络学习(预测)构成损失的KL项中噪声的附加噪声。这意味着我们的神经网络变成了噪声预测器,而不是(直接)均值预测器。其中,平均值可以按如下方式计算:

μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , t ) ) \mathbf{\mu}_\theta(\mathbf{x}_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \frac{\beta_t}{\sqrt{1- \bar{\alpha}_t}} \mathbf{\epsilon}_\theta(\mathbf{x}_t, t) \right) μθ(xt,t)=αt 1(xt1αˉt βtϵθ(xt,t))

最终的目标函数 L t L_t Lt 如下 (随机步长 t t t ( ϵ ∼ N ( 0 , I ) ) (ϵ∼\mathcal{N}(0,I)) (ϵN(0,I)) 给定):

∣ ∣ ϵ − ϵ θ ( x t , t ) ∣ ∣ 2 = ∣ ∣ ϵ − ϵ θ ( α ˉ t x 0 + ( 1 − α ˉ t ) ϵ , t ) ∣ ∣ 2 || \mathbf{\epsilon} - \mathbf{\epsilon}_\theta(\mathbf{x}_t, t) ||^2 = || \mathbf{\epsilon} - \mathbf{\epsilon}_\theta( \sqrt{\bar{\alpha}_t} \mathbf{x}_0 + \sqrt{(1- \bar{\alpha}_t) } \mathbf{\epsilon}, t) ||^2 ∣∣ϵϵθ(xt,t)2=∣∣ϵϵθ(αˉt x0+(1αˉt) ϵ,t)2

在这里, x 0 \mathbf{x}_0 x0是初始(真实,未损坏)图像, ϵ \mathbf{\epsilon} ϵ是在时间步长 t t t采样的纯噪声, ϵ θ ( x t , t ) \mathbf{\epsilon}_\theta (\mathbf{x}_t, t) ϵθ(xt,t)是我们的神经网络。神经网络是基于真实噪声和预测高斯噪声之间的简单均方误差(MSE)进行优化的。

训练算法现在如下所示:
在这里插入图片描述
换句话说:

  • 我们从真实未知和可能复杂的数据分布中随机抽取一个样本 q ( x 0 ) q(\mathbf{x}_0) q(x0)
  • 我们均匀地采样 1 1 1 T T T之间的噪声水平 t t t(即,随机时间步长)
  • 我们从高斯分布中采样一些噪声,并使用上面定义的属性在 t t t 时间步上破坏输入
  • 神经网络被训练以基于损坏的图像 x t \mathbf{x}_t xt 来预测这种噪声,即基于已知的时间表 x t \mathbf{x}_t xt 上施加的噪声

实际上,所有这些都是在批数据上使用随机梯度下降来优化神经网络完成的。

1.2.3 U-Net神经网络预测噪声

神经网络需要在特定时间步长接收带噪声的图像,并返回预测的噪声。请注意,预测噪声是与输入图像具有相同大小/分辨率的张量。因此,从技术上讲,网络接受并输出相同形状的张量。那么我们可以用什么类型的神经网络来实现呢?

这里通常使用的是非常相似的Link:自动编码器,您可能还记得典型的"深度学习入门"教程。自动编码器在编码器和解码器之间有一个所谓"bottleneck"层。编码器首先将图像编码为一个称为"bottleneck"的较小的隐藏表示,然后解码器将该隐藏表示解码回实际图像。这迫使网络只保留bottleneck层中最重要的信息。

在模型结构方面,DDPM的作者选择了U-Net,出自Link:(Ronneberger et al.,2015)(当时,它在医学图像分割方面取得了最先进的结果)。这个网络就像任何自动编码器一样,在中间由一个bottleneck组成,确保网络只学习最重要的信息。重要的是,它在编码器和解码器之间引入了残差连接,极大地改善了梯度流(灵感来自于Linki:(He et al., 2015))。
在这里插入图片描述
可以看出,U-Net模型首先对输入进行下采样(即,在空间分辨率方面使输入更小),之后执行上采样。

2 构建Diffusion模型

下面,我们逐步构建Diffusion模型。
首先,我们定义了一些帮助函数和类,这些函数和类将在实现神经网络时使用。
在这里插入图片描述
我们还定义了上采样和下采样操作的别名。
在这里插入图片描述

2.1 位置向量

由于神经网络的参数在时间(噪声水平)上共享,作者使用正弦位置嵌入来编码 t t t,灵感来自Transformer(Link:Vaswani et al., 2017)。对于批处理中的每一张图像,神经网络"知道"它在哪个特定时间步长(噪声水平)上运行。

SinusoidalPositionEmbeddings模块采用(batch_size, 1)形状的张量作为输入(即批处理中几个有噪声图像的噪声水平),并将其转换为(batch_size, dim)形状的张量,其中dim是位置嵌入的尺寸。然后,我们将其添加到每个剩余块中。
在这里插入图片描述

2.2 ResNet/ConvNeXT块

接下来,我们定义U-Net模型的核心构建块。DDPM作者使用了一个Wide ResNet块Link:(Zagoruyko et al., 2016),但Phil Wang决定添加Link:ConvNeXT(Liu et al., 2022)替换ResNet,因为后者在图像领域取得了巨大成功。

在最终的U-Net架构中,可以选择其中一个或另一个,本文选择ConvNeXT块构建U-Net模型。
在这里插入图片描述
在这里插入图片描述

2.3 Attention模块

接下来,我们定义Attention模块,DDPM作者将其添加到卷积块之间。Attention是著名的ransformer架构(Link:Vaswani et al., 2017),在人工智能的各个领域都取得了巨大的成功,从NLP到Link:蛋白质折叠。Phil Wang使用了两种注意力变体:一种是常规的multi-head self-attention(如Transformer中使用的),另一种是Link:LinearAttentionLink:(Shen et al., 2018),其时间和内存要求在序列长度上线性缩放,而不是在常规注意力中缩放。 要想对Attention机制进行深入的了解,请参照Jay Allamar的Link:精彩的博文。
在这里插入图片描述
在这里插入图片描述

2.4 组归一化

DDPM作者将U-Net的卷积/注意层与群归一化Link:(Wu et al., 2018)。下面,我们定义一个PreNorm类,将用于在注意层之前应用groupnorm。
在这里插入图片描述

2.5 条件U-Net

我们已经定义了所有的构建块(位置嵌入、ResNet/ConvNeXT块、Attention和组归一化),现在需要定义整个神经网络了。请记住,网络 ϵ θ ( x t , t ) ϵ_θ(\mathbf{x}_t,t) ϵθ(xt,t) 的工作是接收一批噪声图像+噪声水平,并输出添加到输入中的噪声。

更具体的: 网络获取了一批(batch_size, num_channels, height, width)形状的噪声图像和一批(batch_size, 1)形状的噪音水平作为输入,并返回(batch_size, num_channels, height, width)形状的张量。

网络构建过程如下:

  • 首先,将卷积层应用于噪声图像批上,并计算噪声水平的位置

  • 接下来,应用一系列下采样级。每个下采样阶段由2个ResNet/ConvNeXT块 + groupnorm + attention + 残差连接 + 一个下采样操作组成

  • 在网络的中间,再次应用ResNet或ConvNeXT块,并与attention交织

  • 接下来,应用一系列上采样级。每个上采样级由2个ResNet/ConvNeXT块+ groupnorm + attention + 残差连接 + 一个上采样操作组成

  • 最后,应用ResNet/ConvNeXT块,然后应用卷积层

最终,神经网络将层堆叠起来,就像它们是乐高积木一样Link:(但重要的是了解它们是如何工作的)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6 正向扩散

我们已经知道正向扩散过程在多个时间步长 T T T中,从实际分布逐渐向图像添加噪声,根据差异计划进行正向扩散。最初的DDPM作者采用了线性时间表:

  • 我们将正向过程方差设置为常数,从 β t = 1 0 − 4 β_t=10^{−4} βt=104- 线性增加到 β T = 0.02 β_T=0.02 βT=0.02

  • 但是,它在(Link:Nichol et al., 2021)中表明,当使用余弦调度时,可以获得更好的结果。

下面,我们定义了 T T T时间步的时间表。
在这里插入图片描述
首先,让我们使用 T T T=200 时间步长的线性计划,并定义我们需要的 β t β_t βt 中的各种变量,例如方差 α ˉ t \bar{\alpha}t αˉt
的累积乘积。下面的每个变量都只是一维张量,存储从 t t t T T T 的值。重要的是,我们还定义了extract函数,它将允许我们提取一批适当的 t t t 索引。
在这里插入图片描述
我们将用猫图像说明如何在扩散过程的每个时间步骤中添加噪音。
在这里插入图片描述
噪声被添加到mindspore张量中,而不是Pillow图像。我们将首先定义图像转换,允许我们从PIL图像转换到mindspore张量(我们可以在其上添加噪声),反之亦然。

这些转换相当简单:我们首先通过除以255来标准化图像(使它们在 [0,1] 范围内),然后确保它们在 [−1,1] 范围内。PPM论文中有介绍到:

  • 假设图像数据由 {0,1,…,255} 中的整数组成,线性缩放为 [−1,1] , 这确保了神经网络反向过程在从标准正常先验 p ( x T ) p(\mathbf{x}_T) p(xT)开始的一致缩放输入上运行。
    在这里插入图片描述
    我们还定义了反向变换,它接收一个包含 [−1,1] 中的张量,并将它们转回 PIL 图像:
    在这里插入图片描述
    让我们验证一下:
    在这里插入图片描述
    我们现在可以定义前向扩散过程,如本文所示:

在这里插入图片描述
让我们在特定的时间步长上测试它:
在这里插入图片描述
让我们为不同的时间步骤可视化此情况:

在这里插入图片描述
这意味着我们现在可以定义给定模型的损失函数,如下所示:
在这里插入图片描述
denoise_model将是我们上面定义的U-Net。我们将在真实噪声和预测噪声之间使用Huber损失。

3 数据准备与处理

在这里我们定义一个正则数据集。数据集可以来自简单的真实数据集的图像组成,如Fashion-MNIST、CIFAR-10或ImageNet,其中线性缩放为 [−1,1]

每个图像的大小都会调整为相同的大小。有趣的是,图像也是随机水平翻转的。根据论文内容:我们在CIFAR10的训练中使用了随机水平翻转;我们尝试了有翻转和没有翻转的训练,并发现翻转可以稍微提高样本质量。

本实验我们选用Fashion_MNIST数据集,我们使用download下载并解压Fashion_MNIST数据集到指定路径。此数据集由已经具有相同分辨率的图像组成,即28x28。
在这里插入图片描述
接下来,我们定义一个transform操作,将在整个数据集上动态应用该操作。该操作应用一些基本的图像预处理:随机水平翻转、重新调整,最后使它们的值在 [−1,1] 范围内。
在这里插入图片描述

3.1 采样

由于我们将在训练期间从模型中采样(以便跟踪进度),我们定义了下面的代码。采样在本文中总结为算法2:
在这里插入图片描述
从扩散模型生成新图像是通过反转扩散过程来实现的:我们从 T T T开始,我们从高斯分布中采样纯噪声,然后使用我们的神经网络逐渐去噪(使用它所学习的条件概率),直到我们最终在时间步 t t t=0结束。如上图所示,我们可以通过使用我们的噪声预测器插入平均值的重新参数化,导出一个降噪程度较低的图像 KaTeX parse error: Undefined control sequence: \segmat at position 1: \̲s̲e̲g̲m̲a̲t̲_t−1。请注意,方差是提前知道的。

理想情况下,我们最终会得到一个看起来像是来自真实数据分布的图像。

下面的代码实现了这一点。
在这里插入图片描述
请注意,上面的代码是原始实现的简化版本。

4 训练过程

下面,我们开始训练吧!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 推理过程(从模型中采样)

要从模型中采样,我们可以只使用上面定义的采样函数:
在这里插入图片描述
可以看到这个模型能产生一件衣服!

请注意,我们训练的数据集分辨率相当低(28x28)。

我们还可以创建去噪过程的gif:
在这里插入图片描述

6 总结

请注意,DDPM论文表明扩散模型是(非)条件图像有希望生成的方向。自那以后,diffusion得到了(极大的)改进,最明显的是文本条件图像生成。下面,我们列出了一些重要的(但远非详尽无遗的)后续工作:

改进的去噪扩散概率模型(Nichol et al., 2021):发现学习条件分布的方差(除平均值外)有助于提高性能

用于高保真图像生成的级联扩散模型([Ho et al., 2021):引入级联扩散,它包括多个扩散模型的流水线,这些模型生成分辨率提高的图像,用于高保真图像合成

扩散模型在图像合成上击败了GANs(Dhariwal et al., 2021):表明扩散模型通过改进U-Net体系结构以及引入分类器指导,可以获得优于当前最先进的生成模型的图像样本质量

无分类器扩散指南([Ho et al., 2021):表明通过使用单个神经网络联合训练条件和无条件扩散模型,不需要分类器来指导扩散模型

具有CLIP Latents (DALL-E 2) 的分层文本条件图像生成 (Ramesh et al., 2022):在将文本标题转换为CLIP图像嵌入之前使用,然后扩散模型将其解码为图像

具有深度语言理解的真实文本到图像扩散模型(ImageGen)(Saharia et al., 2022):表明将大型预训练语言模型(例如T5)与级联扩散结合起来,对于文本到图像的合成很有效

请注意,此列表仅包括在撰写本文,即2022年6月7日之前的重要作品。

目前,扩散模型的主要(也许唯一)缺点是它们需要多次正向传递来生成图像(对于像GAN这样的生成模型来说,情况并非如此)。然而,有正在进行中的研究表明只需要10个去噪步骤就能实现高保真生成。

参考

  1. Link:The Annotated Diffusion Model

  2. Link:由浅入深了解Diffusion Model

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

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

相关文章

JVM原理(二三):JVM虚拟机线程安全的实现方法

1. 互斥同步 互斥同步(MutualExclusion&Synchronization)是一种最常见也是最主要的并发正确性保障手段。同步是指在多个线程并发访问共享数据时&#xff0c;保证共享数据在同一个时刻只被一条(或者是一些&#xff0c;当使用信号量的时候)线程使用。而互斥是实现同步的一种…

防御---001

一、实验拓扑二、要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00 - 18:00)可以访问&#xff0c;生产区的的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMZ…

数据结构(Java):集合类LinkedList集合类Stack

1、集合类LinkedList 1.1 什么是LinkedList LinkedList的底层是一个双向链表的结构&#xff08;故不支持随机访问&#xff09;&#xff1a; 在LinkedList中&#xff0c;定义了first和last&#xff0c;分别指向链表的首节点和尾结点。 每个节点中有一个成员用来存储数据&…

第十一篇——兵势篇:部下强不强,责任在领导

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 领导力的体现&#xff0c;也是要通过区分不同层次程度的内容来体现最终的…

Bash ——shell

Bash作为用户与操作系统之间的接口&#xff0c;让用户通过命令行输入各种指令来控制和操作计算机系统。 shell的两种解释&#xff1a; 1.linux命令解释器 Terminal 终端 ——》shell命令 ——》 Linux kernel &#xff08;内核&#xff09; Linux内核的作用&#xff1a; 1.…

Java中实现一维数组逆序交换的完整解决方案

引言 ❤❤点个关注吧~~编程梦想家&#xff08;大学生版&#xff09;-CSDN博客 在日常编程中&#xff0c;处理数组时经常会遇到需要逆序交换数组元素的情况。逆序交换即是将数组的第一个元素与最后一个元素交换&#xff0c;第二个元素与倒数第二个元素交换&#xff0c;依此类推…

Internet Download Manager6.42最新下载器互联网冲浪小能手们!

今天我要来种草一个超级棒的宝贝——Internet Download Manager&#xff08;简称 IDM&#xff09;。这个小家伙简直是下载界的“速度与激情”代言人&#xff0c;让我彻底告别了等待的日子。&#x1f389; IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 …

【最强八股文 -- 计算机网络】【快速版】TCP 与 UDP 头部格式

目标端口和源端口: 应该把报文发给哪个进程包长度: UDP 首部的长度跟数据的长度之和校验和: 为了提供可靠的 UDP 首部和数据而设计&#xff0c;接收方使用检验和来检查该报文段中是否出现差错 源端口号和目的端口号: 用于多路复用/分解来自或送到上层应用的数据。告诉主机报文段…

自动气象站的主要功能优势

在科技日新月异的今天&#xff0c;我们生活的方方面面都受到了科技的影响。其中&#xff0c;自动气象站作为气象观测领域的重要一环&#xff0c;不仅提升了气象数据的准确性和时效性&#xff0c;还为我们的日常生活、农业生产、灾害预防等提供了重要的数据支持。 自动气象站概述…

【GIS开发小课堂】WebGIS开发必学开源框架Openlayers,附赠视频教程、电子书、笔记源码

WebGIS开发之Openlayers 当前&#xff0c;WebGIS开发热门程度越来越高&#xff0c;市场招聘供需比处于较为紧张的状态。 常见的WebGIS开源框架有&#xff1a;OpenLayers、Leaflet、MapBox、MapFish、GeoServer、GeoEXT、MapInfo等。公司最希望求职者具备至少一种框架开发技能…

数字信号处理及MATLAB仿真(5)——z变换

采样的其他概念咱们后面再慢慢的讲述吧&#xff0c;先把z变换的程序给大家展示一下&#xff0c;总的来说呢&#xff0c;就用一个函数——ztran就行了。在 MATLAB 中&#xff0c;可以使用 ztrans 函数来进行 Z 变换。ztrans 函数用于对离散时间信号或系统进行 Z 变换&#xff0c…

MySQL Undo Log

总结自bojiangzhou undo log称为撤销日志或回滚日志。在一个事务中进行增删改操作时&#xff0c;都会记录对应的 undo log。在对数据库进行修改前&#xff0c;会先记录对应的 undo log&#xff0c;然后在事务失败或回滚的时候&#xff0c;就可以用这些 undo log 来将数据回滚到…

java 实现Comparable接口和实现Comparator接口排序的区别

Comparable接口 作用&#xff1a; Comparable接口是在类的内部实现的&#xff0c;用于指定类的默认比较规则。当一个类实现了Comparable接口时&#xff0c;它必须实现compareTo方法&#xff0c;该方法用于定义对象之间的自然顺序。 实现方式&#xff1a; 实现Comparable接口的…

【Go系列】 Go语言的入门

为什么要学习Go 从今天起&#xff0c;我们将一同启程探索 Go 语言的奥秘。我会用简单明了的方式&#xff0c;逐一讲解 Go 语言的各个知识点&#xff0c;帮助你从基础做起&#xff0c;一步步深化理解。不论你之前是否有过 Go 语言的接触经验&#xff0c;这个系列文章都将助你收获…

农业采摘--RGBD数据转point cloud

一、RGBD图像转点云数据的步骤 将RGBD图像转点云数据常包含五个步骤&#xff1a; 1. 图像采集&#xff1a; 使用RGBD相机同时捕获颜色&#xff08;RGB&#xff09;和深度&#xff08;Depth&#xff09;信息。颜色记录了场景的彩色视觉信息&#xff0c;而深度图像记录了场景中每…

个人面试总结

写在前面&#xff1a;以下是自己在拟录用后回顾总结的了一下当时面试题目&#xff0c;把标答写了出来&#xff0c;供以后复习所使用&#xff0c;希望大家理性食用~~ 预祝大家都能找到心仪的工作 笔试题目&#xff1a; 1.1. java中Collection和Collections的区别 Collection…

Ae After Effects2024 for Mac 视频处理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、Anticc简化版安装1.1双击运行软件&#xff0c;安装1.2 解决来源身份不明的开发者问题1.3 再次运行软件&#xff0c;即可进行AntiCC安装 2. Ae2024安装2.1 打开 Ae 2024 安装包组2.2 将 Ae 安装包拖至桌面2.3 安装 Ae2024 &…

0708,LINUX目录相关操作

主要是冷气太足感冒了&#xff0c;加上少吃药抗药性差&#xff0c;全天昏迷&#xff0c;学傻了学傻了 cat t_chdir.c #include <stdio.h> #include <unistd.h> #include <error.h> #include <errno.h> #include <sys/stat.h>int main(int argc…

PyTorch实现BERT预训练模型转化指南

huggingface官方的介绍&#xff1a; https://huggingface.co/transformers/converting_tensorflow_models.html 直接用命令行 把箭头处路径改为自己放原有tf版本预训练模型的路径 回车后会有一大堆提示&#xff0c;然后发现路径下多了一个bin文件&#xff0c;加上原本的config…

【C++深度学习】多态(概念虚函数抽象类)

✨ 疏影横斜水清浅&#xff0c;暗香浮动月黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…