speechbrain.nnet.diffusion 模块
去噪扩散的实现
https://arxiv.org/pdf/2006.11239.pdf
某些部分借鉴自 / 灵感来源于 denoising-diffusion-pytorch https://github.com/lucidrains/denoising-diffusion-pytorch
- Authors
阿尔乔姆·普洛日尼科夫 2022
摘要
类:
经典去噪扩散概率模型(DDPM)的实现 |
|
一个基础的扩散实现 |
|
添加普通高斯噪声 |
|
一个潜在扩散包装器。 |
|
应用于填充样本的高斯噪声。 |
函数:
返回一个随机的时间步样本作为一维张量(仅一个维度) |
参考
- class speechbrain.nnet.diffusion.Diffuser(model, timesteps, noise=None)[source]
基础:
Module一个基础的扩散实现
- Parameters:
- distort(x, timesteps=None)[source]
向一批数据添加噪声
- Parameters:
x (torch.Tensor) – 原始数据样本
timesteps (torch.Tensor) – 一个长度为x中批次数的1-D整数张量,其中每个条目对应于批次的timestep编号。如果省略,timesteps将被随机采样
- train_sample(x, timesteps=None, condition=None, **kwargs)[source]
为训练循环创建一个带有相应目标的样本
- Parameters:
x (torch.Tensor) – 原始数据样本
timesteps (torch.Tensor) – 一个长度为x中批次数的1-D整数张量,其中每个条目对应于批次的timestep编号。如果省略,timesteps将被随机采样
condition (torch.Tensor) – 用于条件生成的condition 在无条件生成时应省略
**kwargs (dict) – 传递给底层模型的参数。
- Returns:
pred (torch.Tensor) – 模型输出的预测噪声
noise (torch.Tensor) – 被应用的噪声
noisy_sample (torch.Tensor) – 应用了噪声的样本
- class speechbrain.nnet.diffusion.DenoisingDiffusion(model, timesteps=None, noise=None, beta_start=None, beta_end=None, sample_min=None, sample_max=None, show_progress=False)[source]
基础类:
Diffuser经典去噪扩散概率模型(DDPM)的实现
- Parameters:
Example
>>> from speechbrain.nnet.unet import UNetModel >>> unet = UNetModel( ... in_channels=1, ... model_channels=16, ... norm_num_groups=4, ... out_channels=1, ... num_res_blocks=1, ... attention_resolutions=[] ... ) >>> diff = DenoisingDiffusion( ... model=unet, ... timesteps=5 ... ) >>> x = torch.randn(4, 1, 64, 64) >>> pred, noise, noisy_sample = diff.train_sample(x) >>> pred.shape torch.Size([4, 1, 64, 64]) >>> noise.shape torch.Size([4, 1, 64, 64]) >>> noisy_sample.shape torch.Size([4, 1, 64, 64]) >>> sample = diff.sample((2, 1, 64, 64)) >>> sample.shape torch.Size([2, 1, 64, 64])
- distort(x, noise=None, timesteps=None, **kwargs)[source]
在前向扩散过程中向样本添加噪声,
- Parameters:
x (torch.Tensor) – 一个2维或更高维的数据样本,其中第一个维度表示批次
噪声 (torch.Tensor) – 要添加的噪声
timesteps (torch.Tensor) – 一个长度为x中批次数的1-D整数张量,其中每个条目对应于批次的timestep编号。如果省略,timesteps将被随机采样
**kwargs (dict) – 传递给底层模型的参数。
- Returns:
result – 一个与x维度相同的张量
- Return type:
torch.Tensor
- class speechbrain.nnet.diffusion.LatentDiffusion(autoencoder, diffusion, latent_downsample_factor=None, latent_pad_dim=1)[source]
基础:
Module一个潜在扩散包装器。潜在扩散是将去噪扩散应用于潜在空间而不是原始数据空间。
- Parameters:
autoencoder (speechbrain.nnet.autoencoders.Autoencoder) – 一个将原始空间转换为潜在空间的自动编码器
扩散 (speechbrain.nnet.diffusion.Diffuser) – 一个扩散包装器
latent_downsample_factor (int) – 潜在空间维度需要被整除的因子。如果扩散包装器的基础模型基于类似UNet的架构,其中输入逐渐被下采样和上采样,因子为二,这将非常有用。
Example
>>> import torch >>> from torch import nn >>> from speechbrain.nnet.CNN import Conv2d >>> from speechbrain.nnet.autoencoders import NormalizingAutoencoder >>> from speechbrain.nnet.unet import UNetModel
设置一个简单的自动编码器(一个真正的自动编码器将是一个深度神经网络)
>>> ae_enc = Conv2d( ... kernel_size=3, ... stride=4, ... in_channels=1, ... out_channels=1, ... skip_transpose=True, ... ) >>> ae_dec = nn.ConvTranspose2d( ... kernel_size=3, ... stride=4, ... in_channels=1, ... out_channels=1, ... output_padding=1 ... ) >>> ae = NormalizingAutoencoder( ... encoder=ae_enc, ... decoder=ae_dec, ... )
使用UNet架构构建扩散模型
>>> unet = UNetModel( ... in_channels=1, ... model_channels=16, ... norm_num_groups=4, ... out_channels=1, ... num_res_blocks=1, ... attention_resolutions=[] ... ) >>> diff = DenoisingDiffusion( ... model=unet, ... timesteps=5 ... ) >>> latent_diff = LatentDiffusion( ... autoencoder=ae, ... diffusion=diff, ... latent_downsample_factor=4, ... latent_pad_dim=2 ... ) >>> x = torch.randn(4, 1, 64, 64) >>> latent_sample = latent_diff.train_sample_latent(x) >>> diff_sample, ae_sample = latent_sample >>> pred, noise, noisy_sample = diff_sample >>> pred.shape torch.Size([4, 1, 16, 16]) >>> noise.shape torch.Size([4, 1, 16, 16]) >>> noisy_sample.shape torch.Size([4, 1, 16, 16]) >>> ae_sample.latent.shape torch.Size([4, 1, 16, 16])
创建一些样本(给定的形状应该是潜在空间的形状)
>>> sample = latent_diff.sample((2, 1, 16, 16)) >>> sample.shape torch.Size([2, 1, 64, 64])
- train_sample(x, **kwargs)[source]
为训练循环创建一个带有相应目标的样本
- Parameters:
x (torch.Tensor) – 原始数据样本
**kwargs (dict) – 传递给底层模型的参数。
- Returns:
pred (torch.Tensor) – 模型输出的预测噪声
noise (torch.Tensor) – 被应用的噪声
noisy_sample – 应用了噪声的样本
- train_sample_latent(x, **kwargs)[source]
返回一个带有自动编码器输出的训练样本 - 可用于联合训练扩散模型和自动编码器
- Parameters:
x (torch.Tensor) – 原始数据样本
**kwargs (dict) – 传递给底层模型的参数。
- Returns:
训练样本。
- Return type:
- speechbrain.nnet.diffusion.sample_timesteps(x, num_timesteps)[source]
返回一个随机的时间步样本作为一维张量 (仅一个维度)
- Parameters:
x (torch.Tensor) – 任意维度的样本张量
num_timesteps (int) – 总的时间步数
- Return type:
时间戳的随机样本。
- class speechbrain.nnet.diffusion.LengthMaskedGaussianNoise(length_dim=1)[source]
基础:
Module对填充样本应用高斯噪声。不会对作为填充部分的位置添加噪声。
- Parameters:
length_dim (int) – 应用长度的时间维度。