# DDPMScheduler

[Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2006.11239) (DDPM) của Jonathan Ho, Ajay Jain và Pieter Abbeel đề xuất một mô hình dựa trên diffusion cùng tên. Trong ngữ cảnh của thư viện 🤗 Diffusers, DDPM đề cập đến cả bộ lập lịch khử nhiễu rời rạc trong bài báo lẫn pipeline.

Tóm tắt từ bài báo là:

*Chúng tôi trình bày các kết quả tổng hợp hình ảnh chất lượng cao sử dụng các mô hình xác suất khuếch tán, một lớp mô hình biến ẩn được lấy cảm hứng từ các cân nhắc về nhiệt động lực học phi cân bằng. Kết quả tốt nhất của chúng tôi đạt được bằng cách huấn luyện trên một cận biến phân có trọng số được thiết kế theo một kết nối mới giữa các mô hình xác suất khuếch tán và khớp điểm số khử nhiễu với động lực học Langevin, và các mô hình của chúng tôi tự nhiên chấp nhận một lược đồ giải nén mất mát tiến trình có thể được diễn giải như một tổng quát hóa của giải mã tự hồi quy. Trên tập dữ liệu CIFAR10 không điều kiện, chúng tôi đạt được điểm Inception là 9.46 và điểm FID tiên tiến nhất là 3.17. Trên LSUN 256x256, chúng tôi đạt được chất lượng mẫu tương tự ProgressiveGAN. Mã triển khai của chúng tôi có sẵn tại [đường dẫn URL này](https://github.com/hojonathanho/diffusion).*

## DDPMScheduler[[diffusers.DDPMScheduler]]

#### diffusers.DDPMScheduler[[diffusers.DDPMScheduler]]

```python
diffusers.DDPMScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2', 'sigmoid'] = 'linear', trained_betas: numpy.ndarray | list[float] | None = None, variance_type: typing.Literal['fixed_small', 'fixed_small_log', 'fixed_large', 'fixed_large_log', 'learned', 'learned_range'] = 'fixed_small', clip_sample: bool = True, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, clip_sample_range: float = 1.0, sample_max_value: float = 1.0, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'leading', steps_offset: int = 0, rescale_betas_zero_snr: bool = False)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L137)

**Tham số:**

num_train_timesteps (`int`, mặc định là `1000`) : Số bước khuếch tán để huấn luyện mô hình.

beta_start (`float`, mặc định là `0.0001`) : Giá trị `beta` ban đầu của suy luận.

beta_end (`float`, mặc định là `0.02`) : Giá trị `beta` cuối cùng.

beta_schedule (`"linear"`, `"scaled_linear"`, `"squaredcos_cap_v2"`, hoặc `"sigmoid"`, mặc định là `"linear"`) : Lịch trình beta, một ánh xạ từ một khoảng beta sang một chuỗi các beta để bước qua mô hình.

trained_betas (`np.ndarray`, *tùy chọn*) : Một mảng các beta để truyền trực tiếp vào bộ khởi tạo mà không sử dụng `beta_start` và `beta_end`.

variance_type (`"fixed_small"`, `"fixed_small_log"`, `"fixed_large"`, `"fixed_large_log"`, `"learned"`, hoặc `"learned_range"`, mặc định là `"fixed_small"`) : Cắt (clip) phương sai khi thêm nhiễu vào mẫu đã khử nhiễu.

clip_sample (`bool`, mặc định là `True`) : Cắt mẫu dự đoán để đảm bảo ổn định về mặt số học.

clip_sample_range (`float`, mặc định là `1.0`) : Độ lớn tối đa cho việc cắt mẫu. Chỉ hợp lệ khi `clip_sample=True`.

prediction_type (`"epsilon"`, `"sample"`, or `"v_prediction"`, defaults to `"epsilon"`) : Kiểu dự đoán của hàm scheduler; có thể là `epsilon` (dự đoán nhiễu của quá trình khuếch tán), `sample` (dự đoán trực tiếp mẫu nhiễu`) or `v_prediction` (xem mục 2.4 của bài báo [Imagen Video](https://huggingface.co/papers/2210.02303)).

thresholding (`bool`, mặc định là `False`) : Có sử dụng phương pháp "dynamic thresholding" hay không. Phương pháp này không phù hợp với các mô hình khuếch tán trong không gian ẩn như Stable Diffusion.

dynamic_thresholding_ratio (`float`, mặc định là `0.995`) : Tỷ lệ cho phương pháp ngưỡng động. Chỉ hợp lệ khi `thresholding=True`.

sample_max_value (`float`, mặc định là `1.0`) : Giá trị ngưỡng cho việc đặt ngưỡng động. Chỉ hợp lệ khi `thresholding=True`.

timestep_spacing (`"linspace"`, `"leading"`, hoặc `"trailing"`, mặc định là `"leading"`) : Cách các bước thời gian (timesteps) nên được điều chỉnh. Xem Bảng 2 trong [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) để biết thêm thông tin.

steps_offset (`int`, mặc định là `0`) : Một giá trị bù được cộng vào các bước suy luận, theo yêu cầu của một số họ mô hình.

rescale_betas_zero_snr (`bool`, mặc định là `False`) : Có nên điều chỉnh lại các hệ số beta để có SNR cuối bằng không hay không. Điều này cho phép mô hình tạo ra các mẫu rất sáng và rất tối thay vì giới hạn ở các mẫu có độ sáng trung bình. Liên quan lỏng lẻo đến [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506).

`DDPMScheduler` khám phá mối liên hệ giữa khớp điểm số khử nhiễu và lấy mẫu động học Langevin.

Mô hình này kế thừa từ [SchedulerMixin](/docs/diffusers/main/vi/api/schedulers/overview#diffusers.SchedulerMixin) và [ConfigMixin](/docs/diffusers/main/vi/api/configuration#diffusers.ConfigMixin). Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các scheduler, chẳng hạn như tải và lưu.

#### add_noise[[diffusers.DDPMScheduler.add_noise]]

```python
add_noise(original_samples: Tensor, noise: Tensor, timesteps: IntTensor)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L569)

**Tham số:**

original_samples (`torch.Tensor`) : Các mẫu gốc mà nhiễu sẽ được thêm vào.

noise (`torch.Tensor`) : Nhiễu cần thêm vào các mẫu.

timesteps (`torch.IntTensor`) : Các bước thời gian (timesteps) chỉ ra mức độ nhiễu cho từng mẫu.

**Trả về:** `torch.Tensor`

Các mẫu nhiễu.

Thêm nhiễu vào các mẫu gốc theo mức độ nhiễu tại mỗi bước thời gian (đây là quá trình khuếch tán thuận).

#### get_velocity[[diffusers.DDPMScheduler.get_velocity]]

```python
get_velocity(sample: Tensor, noise: Tensor, timesteps: IntTensor)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L611)

**Tham số:**

sample (`torch.Tensor`) : Mẫu đầu vào.

noise (`torch.Tensor`) : Tensor nhiễu.

timesteps (`torch.IntTensor`) : Các bước thời gian (timesteps) cho việc tính toán vận tốc.

**Trả về:** `torch.Tensor`

Tốc độ đã được tính toán.

Tính dự đoán vận tốc từ mẫu và nhiễu theo công thức vận tốc.

#### previous_timestep[[diffusers.DDPMScheduler.previous_timestep]]

```python
previous_timestep(timestep: int)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L648)

**Tham số:**

timestep (`int`) : Bước thời gian hiện tại.

**Trả về:** `int` hoặc `torch.Tensor`

Bước thời gian trước đó.

Tính bước thời gian trước đó trong chuỗi khuếch tán.

#### scale_model_input[[diffusers.DDPMScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: int | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L257)

**Tham số:**

sample (`torch.Tensor`) : Mẫu đầu vào.

timestep (`int`, *tùy chọn*) : Bước thời gian hiện tại trong chuỗi khuếch tán.

**Trả về:** `torch.Tensor`

Một mẫu đầu vào đã được chuẩn hóa.

Đảm bảo khả năng hoán đổi với các trình lập lịch cần mở rộng đầu vào của mô hình khử nhiễu tùy thuộc vào bước thời gian hiện tại.

#### set_timesteps[[diffusers.DDPMScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: int = None, device: typing.Union[str, torch.device] = None, timesteps: list[int] | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L274)

**Tham số:**

num_inference_steps (`int`, *optional*) : Số bước khuếch tán được sử dụng khi tạo mẫu bằng một mô hình đã được huấn luyện trước. Nếu được sử dụng, `timesteps` phải là `None`.

device (`str` hoặc `torch.device`, *tuỳ chọn*) : Thiết bị mà các bước thời gian (timesteps) sẽ được chuyển đến. Nếu là `None`, các bước thời gian sẽ không được chuyển.

timesteps (`list[int]`, *optional*) : Các bước thời gian tùy chỉnh được sử dụng để hỗ trợ khoảng cách tùy ý giữa các bước thời gian. Nếu là `None`, chiến lược khoảng cách bước thời gian mặc định với khoảng cách đều giữa các bước thời gian sẽ được sử dụng. Nếu `timesteps` được truyền vào, `num_inference_steps` phải là `None`.

Đặt các bước thời gian rời rạc được sử dụng cho chuỗi khuếch tán (cần chạy trước khi suy luận).

#### bước[[diffusers.DDPMScheduler.step]]

```python
step(model_output: Tensor, timestep: int, sample: Tensor, generator: typing.Optional[torch.Generator] = None, return_dict: bool = True)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L461)

**Tham số:**

model_output (`torch.Tensor`) : Đầu ra trực tiếp từ mô hình khuếch tán đã học.

timestep (`int`) : Bước thời gian rời rạc hiện tại trong chuỗi khuếch tán.

sample (`torch.Tensor`) : Một bản sao mẫu hiện tại được tạo ra bởi quá trình khuếch tán.

generator (`torch.Generator`, *tùy chọn*) : Bộ tạo số ngẫu nhiên.

return_dict (`bool`, mặc định là `True`) : Có nên trả về [DDPMSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/ddpm#diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput) hay `tuple` hay không.

**Trả về:** [DDPMSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/ddpm#diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput) hoặc `tuple`

If return_dict is `True`, [DDPMSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/ddpm#diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput) is returned, otherwise a tuple is returned where the first element is the sample tensor.

Dự đoán mẫu từ bước thời gian trước đó bằng cách đảo ngược SDE. Hàm này lan truyền quá trình khuếch tán từ các đầu ra của mô hình đã học (thường nhất là nhiễu được dự đoán).

## DDPMSchedulerOutput[[diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput]]

#### diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput[[diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput]]

```python
diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput(prev_sample: Tensor, pred_original_sample: typing.Optional[torch.Tensor] = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L31)

**Tham số:**

prev_sample (`torch.Tensor` có shape `(batch_size, num_channels, height, width)` đối với ảnh) : Mẫu `(x_{t-1})` đã tính của bước thời gian trước đó. `prev_sample` nên được dùng làm đầu vào mô hình tiếp theo trong vòng lặp khử nhiễu.

pred_original_sample (`torch.Tensor` có shape `(batch_size, num_channels, height, width)` đối với ảnh) : Mẫu khử nhiễu dự đoán `(x_{0})` dựa trên đầu ra của mô hình tại bước thời gian hiện tại. `pred_original_sample` có thể được dùng để xem trước tiến độ hoặc cho guidance.

Lớp đầu ra cho kết quả của hàm `step` của trình lập lịch.

