Diffusers 文档

VQDiffusionScheduler

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

VQDiffusionScheduler

VQDiffusionScheduler 将 Transformer 模型的输出转换为前一个扩散时间步未去噪图像的样本。它由 Shuyang Gu、Dong Chen、Jianmin Bao、Fang Wen、Bo Zhang、Dongdong Chen、Lu Yuan 和 Baining Guo 在 用于文本到图像合成的矢量量化扩散模型 中引入。

论文摘要如下:

我们提出了一种用于文本到图像生成的矢量量化扩散(VQ-Diffusion)模型。该方法基于矢量量化变分自动编码器(VQ-VAE),其潜在空间由最近开发的去噪扩散概率模型(DDPM)的条件变体建模。我们发现这种潜在空间方法非常适合文本到图像生成任务,因为它不仅消除了现有方法的单向偏差,而且还允许我们采用掩蔽和替换扩散策略,以避免误差累积,这是现有方法中一个严重的问题。我们的实验表明,与参数数量相似的传统自回归(AR)模型相比,VQ-Diffusion 生成的文本到图像结果显著更好。与之前的基于 GAN 的文本到图像方法相比,我们的 VQ-Diffusion 可以处理更复杂的场景,并大幅提高合成图像的质量。最后,我们展示了通过重参数化,我们方法中的图像生成计算可以变得高效。对于传统的 AR 方法,文本到图像生成时间随输出图像分辨率线性增加,即使对于普通大小的图像也相当耗时。VQ-Diffusion 允许我们在质量和速度之间取得更好的平衡。我们的实验表明,经过重参数化的 VQ-Diffusion 模型比传统的 AR 方法快十五倍,同时实现了更好的图像质量。

VQDiffusionScheduler

class diffusers.VQDiffusionScheduler

< >

( num_vec_classes: int num_train_timesteps: int = 100 alpha_cum_start: float = 0.99999 alpha_cum_end: float = 9e-06 gamma_cum_start: float = 9e-06 gamma_cum_end: float = 0.99999 )

参数

  • num_vec_classes (int) — 潜在像素向量嵌入的类别数量。包括掩码潜在像素的类别。
  • num_train_timesteps (int, 默认为 100) — 训练模型的扩散步数。
  • alpha_cum_start (float, 默认为 0.99999) — 起始累积 alpha 值。
  • alpha_cum_end (float, 默认为 0.00009) — 结束累积 alpha 值。
  • gamma_cum_start (float, 默认为 0.00009) — 起始累积 gamma 值。
  • gamma_cum_end (float, 默认为 0.99999) — 结束累积 gamma 值。

一种用于矢量量化扩散的调度器。

此模型继承自 SchedulerMixinConfigMixin。查看超类文档以了解库为所有调度器实现的通用方法,例如加载和保存。

log_Q_t_transitioning_to_known_class

< >

( t: torch.int32 x_t: LongTensor log_onehot_x_t: Tensor cumulative: bool ) torch.Tensor 形状为 (batch size, num classes - 1, num latent pixels)

参数

  • t (torch.Long) — 决定使用哪个转换矩阵的时间步。
  • x_t (torch.LongTensor 形状为 (batch size, num latent pixels)) — 在时间 t 时每个潜在像素的类别。
  • log_onehot_x_t (torch.Tensor 形状为 (batch size, num classes, num latent pixels)) — x_t 的对数 one-hot 向量。
  • cumulative (bool) — 如果 cumulativeFalse,则使用单步转换矩阵 t-1->t。如果 cumulativeTrue,则使用累积转换矩阵 0->t

返回

torch.Tensor 形状为 (batch size, num classes - 1, num latent pixels)

返回矩阵的每个*列*是完整概率转换矩阵的*行*的对数概率。

当非累积时,返回 self.num_classes - 1 行,因为初始潜在像素不能被掩码。

其中:

  • q_n 是第 n 个潜在像素前向过程的概率分布。
  • C_0 是潜在像素嵌入的一个类别
  • C_k 是掩码潜在像素的类别

非累积结果(省略对数)

_0(x_t | x_{t-1\} = C_0) ... q_n(x_t | x_{t-1\} = C_0) . . . . . . . . . q_0(x_t | x_{t-1\} = C_k) ... q_n(x_t | x_{t-1\} = C_k)`} wrap={false} />

累积结果(省略对数)

_0_cumulative(x_t | x_0 = C_0) ... q_n_cumulative(x_t | x_0 = C_0) . . . . . . . . . q_0_cumulative(x_t | x_0 = C_{k-1\}) ... q_n_cumulative(x_t | x_0 = C_{k-1\})`} wrap={false} />

计算 x_t 中每个潜在像素的(累积或非累积)转换矩阵行的对数概率。

q_posterior

< >

( log_p_x_0 x_t t ) torch.Tensor 形状为 (batch size, num classes, num latent pixels)

参数

  • log_p_x_0 (torch.Tensor 形状为 (batch size, num classes - 1, num latent pixels)) — 初始潜在像素预测类别的对数概率。不包括对掩码类别的预测,因为初始未去噪图像不能被掩码。
  • x_t (torch.LongTensor 形状为 (batch size, num latent pixels)) — 在时间 t 时每个潜在像素的类别。
  • t (torch.Long) — 决定使用哪个转换矩阵的时间步。

返回

torch.Tensor 形状为 (batch size, num classes, num latent pixels)

图像在时间步 t-1 预测类别的对数概率。

计算图像在时间步 t-1 预测类别的对数概率。

p(x_{t-1} | x_t) = sum( q(x_t | x_{t-1}) * q(x_{t-1} | x_0) * p(x_0) / q(x_t | x_0) )

set_timesteps

< >

( num_inference_steps: int device: typing.Union[str, torch.device] = None )

参数

  • num_inference_steps (int) — 使用预训练模型生成样本时使用的扩散步数。
  • device (strtorch.device, 可选) — 时间步和扩散过程参数(alpha、beta、gamma)应移动到的设备。

设置用于扩散链的离散时间步(在推理之前运行)。

步骤

< >

( model_output: Tensor timestep: torch.int64 sample: LongTensor generator: typing.Optional[torch._C.Generator] = None return_dict: bool = True ) VQDiffusionSchedulerOutputtuple

参数

  • log_p_x_0 — (torch.Tensor 形状为 (batch size, num classes - 1, num latent pixels)): 初始潜在像素预测类别的对数概率。不包括对掩码类别的预测,因为初始未去噪图像不能被掩码。
  • t (torch.long) — 决定使用哪个转换矩阵的时间步。
  • x_t (torch.LongTensor 形状为 (batch size, num latent pixels)) — 在时间 t 时每个潜在像素的类别。
  • generator (torch.Generator, 或 None) — 在从 p(x_{t-1} | x_t) 采样之前应用于其噪声的随机数生成器。
  • return_dict (bool, 可选, 默认为 True) — 是否返回 VQDiffusionSchedulerOutputtuple

返回

VQDiffusionSchedulerOutputtuple

如果 return_dictTrue,则返回 VQDiffusionSchedulerOutput,否则返回一个元组,其中第一个元素是样本张量。

通过逆向转换分布预测前一个时间步的样本。有关如何计算分布的更多详细信息,请参见 q_posterior()

VQDiffusionSchedulerOutput

class diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput

< >

( prev_sample: LongTensor )

参数

  • prev_sample (torch.LongTensor,形状为 (批次大小, 潜在像素数量)) — 上一个时间步计算出的样本 x_{t-1}。prev_sample 应作为去噪循环中的下一个模型输入。

调度器步进函数输出的输出类。

< > 在 GitHub 上更新