# AutoencoderKL

Diederik P. Kingma 和 Max Welling 在 [Auto-Encoding Variational Bayes](https://huggingface.co/papers/1312.6114v11) 中引入了带有 KL 损失的变分自编码器（VAE）模型。在 🤗 Diffusers 中，该模型用于将图像编码为潜在表示，并将潜在表示解码为图像。

该论文的摘要如下：

*在存在具有不可解后验分布的连续隐变量以及大规模数据集的情况下，我们如何对有向概率模型执行高效的推理和学习？我们提出了一种随机变分推断和学习算法，该算法可扩展至大规模数据集，并且在某些温和的可微性条件下，即使在不可解的情况下也能正常工作。我们的贡献有两方面。首先，我们表明，对变分下界进行重参数化可以得到一个下界估计器，该估计器可以直接使用标准的随机梯度方法进行优化。其次，我们表明，对于每个数据点具有连续隐变量的独立同分布（i.i.d.）数据集，通过使用所提出的下界估计器，将近似推断模型（也称为识别模型）拟合到不可解的后验分布上，可以使后验推断变得特别高效。理论上的优势在实验结果中得到了体现。*

## 从原始格式加载

默认情况下，[AutoencoderKL](/docs/diffusers/v0.43.0/zh/api/models/autoencoderkl#diffusers.AutoencoderKL) 应使用 [from_pretrained()](/docs/diffusers/v0.43.0/zh/api/models/overview#diffusers.ModelMixin.from_pretrained) 加载，但也可以使用 `FromOriginalModelMixin.from_single_file` 从原始格式加载，方法如下：

```py
from diffusers import AutoencoderKL

url = "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/blob/main/vae-ft-mse-840000-ema-pruned.safetensors"  # can also be a local file
model = AutoencoderKL.from_single_file(url)
```

## AutoencoderKL[[diffusers.AutoencoderKL]]

#### diffusers.AutoencoderKL[[diffusers.AutoencoderKL]]

```python
diffusers.AutoencoderKL(in_channels: int = 3, out_channels: int = 3, down_block_types: tuple[str] = ('DownEncoderBlock2D',), up_block_types: tuple[str] = ('UpDecoderBlock2D',), block_out_channels: tuple[int] = (64,), layers_per_block: int = 1, act_fn: str = 'silu', latent_channels: int = 4, norm_num_groups: int = 32, sample_size: int = 32, scaling_factor: float = 0.18215, shift_factor: float | None = None, latents_mean: tuple[float] | None = None, latents_std: tuple[float] | None = None, force_upcast: bool = True, use_quant_conv: bool = True, use_post_quant_conv: bool = True, mid_block_add_attention: bool = True)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L36)

**参数：**

in_channels (int, *可选*，默认为 3)：输入图像的通道数。

out_channels (int, *可选*，默认为 3)：输出中的通道数。

down_block_types (`tuple[str]`，*可选*，默认为 `("DownEncoderBlock2D",)`)：下采样块类型的元组。

up_block_types (`tuple[str]`，*可选*，默认为 `("UpDecoderBlock2D",)`)：上采样块类型的元组。

block_out_channels (`tuple[int]`，*可选*，默认为 `(64,)`)：块输出通道的元组。

act_fn (`str`，*可选*，默认为 `"silu"`)：要使用的激活函数。

latent_channels (`int`，*可选*，默认为 4)：潜在空间中的通道数。

sample_size (`int`，*可选*，默认为 `32`)：采样输入大小。

scaling_factor (`float`, *可选*，默认为 0.18215)：使用训练集的第一个批次计算得出的训练后潜在空间的逐分量标准差。此值用于在训练扩散模型时将潜在空间缩放至单位方差。在传入扩散模型之前，潜在变量会按公式 `z = z * scaling_factor` 进行缩放。在解码时，潜在变量会按公式 `z = 1 / scaling_factor * z` 缩放回原始尺度。更多细节请参阅 [High-Resolution Image Synthesis with Latent Diffusion Models](https://huggingface.co/papers/2112.10752) 论文的 4.3.2 节和 D.1 节。

force_upcast (`bool`，*可选*，默认为 `True`)：如果启用，将强制 VAE 在 float32 下运行，适用于高分辨率图像流水线（例如 SD-XL）。如果 VAE 经过微调或训练，可以在较低精度范围内运行且不会损失太多精度，则可以将 `force_upcast` 设置为 `False` - 参见：https://huggingface.co/madebyollin/sdxl-vae-fp16-fix

mid_block_add_attention (`bool`，*可选*，默认为 `True`)：如果启用，Encoder 和 Decoder 的 mid_block 将包含注意力块。如果设置为 false，mid_block 将仅包含 resnet 块

一个带有 KL 损失的 VAE 模型，用于将图像编码为潜在表示，并将潜在表示解码为图像。

该模型继承自 [ModelMixin](/docs/diffusers/v0.43.0/zh/api/models/overview#diffusers.ModelMixin)。请查阅其父类文档，了解为所有模型实现的通用方法（例如下载或保存）。

#### decode[[diffusers.AutoencoderKL.decode]]

```python
decode(z: FloatTensor, return_dict: bool = True, generator = None)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L213)

**参数：**

z (`torch.Tensor`) : 输入的潜在向量批次。

return_dict (`bool`，*可选*，默认为 `True`)：是否返回 `~models.vae.DecoderOutput` 而不是普通元组。

**返回：** `~models.vae.DecoderOutput` 或 `tuple`

如果 return_dict 为 True，则返回 `~models.vae.DecoderOutput`，否则返回普通的 `tuple`。

解码一批图像。

#### encode[[diffusers.AutoencoderKL.encode]]

```python
encode(x: Tensor, return_dict: bool = True)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L170)

**参数：**

x (`torch.Tensor`) : 输入图像批次。

return_dict (`bool`，*可选*，默认为 `True`)：是否返回 `~models.autoencoder_kl.AutoencoderKLOutput` 而不是普通元组。

**返回值：**

编码图像的潜在表示。如果 `return_dict` 为 True，则返回 `~models.autoencoder_kl.AutoencoderKLOutput`，否则返回普通的 `tuple`。

将一批图像编码为潜在表示。

#### forward[[diffusers.AutoencoderKL.forward]]

```python
forward(sample: Tensor, sample_posterior: bool = False, return_dict: bool = True, generator: typing.Optional[torch.Generator] = None)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L413)

**参数：**

sample (`torch.Tensor`) : 输入样本。

sample_posterior (`bool`，*可选*，默认为 `False`)：是否从后验分布中采样。

return_dict (`bool`，*可选*，默认为 `True`)：是否返回 `DecoderOutput` 而不是普通元组。

generator (`torch.Generator`，*可选*)：一个 [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html)，用于使采样过程具有确定性。

**返回：** `~models.vae.DecoderOutput` 或 `tuple`

如果 `return_dict` 为 True，则返回 `~models.vae.DecoderOutput`，否则返回普通的 `tuple`。

#### fuse_qkv_projections[[diffusers.AutoencoderKL.fuse_qkv_projections]]

```python
fuse_qkv_projections()
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L450)

启用融合的 QKV 投影。对于自注意力模块，所有投影矩阵（即 query、key、value）均会被融合。对于交叉注意力模块，key 和 value 投影矩阵会被融合。

> [!WARNING] > 此 API 处于 🧪 实验阶段。

#### set_default_attn_processor[[diffusers.AutoencoderKL.set_default_attn_processor]]

```python
set_default_attn_processor()
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L143)

禁用自定义注意力处理器并设置默认的注意力实现。

#### tiled_decode[[diffusers.AutoencoderKL.tiled_decode]]

```python
tiled_decode(z: Tensor, return_dict: bool = True)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L364)

**参数：**

z (`torch.Tensor`) : 输入的潜在向量批次。

return_dict (`bool`，*可选*，默认为 `True`)：是否返回 `~models.vae.DecoderOutput` 而不是普通元组。

**返回：** `~models.vae.DecoderOutput` 或 `tuple`

如果 return_dict 为 True，则返回 `~models.vae.DecoderOutput`，否则返回普通的 `tuple`。

使用分块解码器解码一批图像。

#### tiled_encode[[diffusers.AutoencoderKL.tiled_encode]]

```python
tiled_encode(x: Tensor, return_dict: bool = True)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L302)

**参数：**

x (`torch.Tensor`) : 输入图像批次。

return_dict (`bool`，*可选*，默认为 `True`)：是否返回 `~models.autoencoder_kl.AutoencoderKLOutput` 而不是普通元组。

**返回：** `~models.autoencoder_kl.AutoencoderKLOutput` 或 `tuple`

If return_dict is True, a `~models.autoencoder_kl.AutoencoderKLOutput` is returned, otherwise a plain `tuple` is returned.

使用分块编码器对一批图像进行编码。

启用此选项后，VAE 会将输入张量拆分为多个图块，分步计算编码。这有助于保持内存占用恒定，而不受图像尺寸的影响。由于每个图块使用不同的编码器，分块编码的最终结果与非分块编码有所不同。为避免分块伪影，图块之间会重叠并混合，以形成平滑的输出。输出中可能仍会出现图块大小的变化，但这些变化应会明显减弱。

#### unfuse_qkv_projections[[diffusers.AutoencoderKL.unfuse_qkv_projections]]

```python
unfuse_qkv_projections()
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_kl.py#L472)

如果已启用，则禁用融合的 QKV 投影。

> [!WARNING] > 此 API 处于 🧪 实验阶段。

## AutoencoderKLOutput[[diffusers.models.modeling_outputs.AutoencoderKLOutput]]

#### diffusers.models.modeling_outputs.AutoencoderKLOutput[[diffusers.models.modeling_outputs.AutoencoderKLOutput]]

```python
diffusers.models.modeling_outputs.AutoencoderKLOutput(latent_dist: DiagonalGaussianDistribution)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/modeling_outputs.py#L7)

**参数：**

latent_dist (`DiagonalGaussianDistribution`)：`Encoder` 的编码输出，表示为 `DiagonalGaussianDistribution` 的均值和 logvar。`DiagonalGaussianDistribution` 允许从该分布中采样潜在变量。

AutoencoderKL 编码方法的输出。

## DecoderOutput[[diffusers.models.autoencoders.vae.DecoderOutput]]

#### diffusers.models.autoencoders.vae.DecoderOutput[[diffusers.models.autoencoders.vae.DecoderOutput]]

```python
diffusers.models.autoencoders.vae.DecoderOutput(sample: Tensor, commit_loss: typing.Optional[torch.FloatTensor] = None)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/vae.py#L49)

**参数：**

sample (`torch.Tensor`，形状为 `(batch_size, num_channels, height, width)`)：模型最后一层解码后的输出样本。

解码方法的输出。

