# DDIMScheduler

Jiaming Song, Chenlin Meng ve Stefano Ermon tarafından [Denoising Diffusion Implicit Models](https://huggingface.co/papers/2010.02502) (DDIM).

Makalenin özeti şudur:

*Gürültü azaltma difüzyon olasılıksal modelleri (DDPM), adversarial eğitim gerektirmeden yüksek kaliteli görüntü üretimi sağlamış olmakla birlikte, bir örnek oluşturmak için Markov zincirinin birçok adım boyunca simüle edilmesini gerektirir. Örnekleme hızını artırmak için, DDPM'lerle aynı eğitim prosedürüne sahip, daha verimli bir iteratif implisit olasılıksal model sınıfı olan gürültü azaltma difüzyon implisit modellerini (DDIM) sunuyoruz. DDPM'lerde üretici süreç, Markovian difüzyon sürecinin tersi olarak tanımlanır. Aynı eğitim hedefine yol açan, ancak ters sürecinden örnek almak çok daha hızlı olabilecek bir Markov olmayan difüzyon süreci sınıfı oluşturuyoruz. DDIM'lerin, DDPM'lere kıyasla duvar saati süresi açısından 10× ile 50× daha hızlı yüksek kaliteli örnekler üretebildiğini, hesaplama ile örnek kalitesi arasında ödünleşim yapmamıza olanak tanıdığını ve gizli uzayda doğrudan anlamlı görüntü interpolasyonu gerçekleştirebildiğini deneysel olarak gösteriyoruz.*

Bu makalenin orijinal kod tabanı [ermongroup/ddim](https://github.com/ermongroup/ddim) adresinde bulunabilir ve yazarla [tsong.me](https://tsong.me/) üzerinden iletişime geçebilirsiniz.

## İpuçları

[Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) makalesi, Stable Diffusion için eğitim ve çıkarım ayarları arasındaki uyumsuzluğun, çıkarım sırasında suboptimal üretim sonuçlarına yol açtığını iddia etmektedir. Bunu düzeltmek için yazarlar şunu önermektedir:

> [!WARNING]
> 🧪 Bu deneysel bir özelliktir!

1. sıfır son sinyal-gürültü oranını (SNR) uygulamak için gürültü zamanlamasını yeniden ölçekleyin

```py
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, rescale_betas_zero_snr=True)
```

2. `v_prediction` ile bir model eğitin ([train_text_to_image.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) veya [train_text_to_image_lora.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py) betiklerine aşağıdaki argümanı ekleyin)

```bash
--prediction_type="v_prediction"
```

3. örnekleme birimini her zaman son zaman adımından başlatacak şekilde değiştirin

```py
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
```

4. aşırı pozlanmayı önlemek için classifier-free guidance'ı yeniden ölçekle

```py
image = pipe(prompt, guidance_rescale=0.7).images[0]
```

Örneğin:

```py
from diffusers import DiffusionPipeline, DDIMScheduler
import torch

pipe = DiffusionPipeline.from_pretrained("ptx0/pseudo-journey-v2", dtype=torch.float16)
pipe.scheduler = DDIMScheduler.from_config(
    pipe.scheduler.config, rescale_betas_zero_snr=True, timestep_spacing="trailing"
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A lion in galaxies, spirals, nebulae, stars, smoke, iridescent, intricate detail, octane render, 8k"
image = pipe(prompt, guidance_rescale=0.7).images[0]
image
```

## DDIMScheduler[[diffusers.DDIMScheduler]]

#### diffusers.DDIMScheduler[[diffusers.DDIMScheduler]]

```python
diffusers.DDIMScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: str = 'linear', trained_betas: numpy.ndarray | list[float] | None = None, clip_sample: bool = True, set_alpha_to_one: bool = True, steps_offset: int = 0, 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['leading', 'trailing', 'linspace'] = 'leading', rescale_betas_zero_snr: bool = False)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L139)

**Parametreler:**

num_train_timesteps (`int`, varsayılan 1000) : Modelin eğitileceği difüzyon adım sayısı.

beta_start (`float`, varsayılan 0.0001) : Çıkarımın başlangıç `beta` değeri.

beta_end (`float`, varsayılan 0.02) : Son `beta` değeri.

beta_schedule (`Literal["linear", "scaled_linear", "squaredcos_cap_v2"]`, varsayılan `"linear"`) : Beta zamanlaması, modelin adım atması için beta aralığını beta dizisine eşleyen bir haritalamadır. `"linear"`, `"scaled_linear"` veya `"squaredcos_cap_v2"` değerlerinden biri olmalıdır.

trained_betas (`np.ndarray`, *isteğe bağlı*) : `beta_start` ve `beta_end` parametrelerini atlamak için beta dizisini doğrudan yapılandırıcıya iletin.

clip_sample (`bool`, varsayılan `True`) : Sayısal kararlılık için tahmini örneği kırpın.

clip_sample_range (`float`, varsayılan 1.0) : Örnek kırpma için maksimum büyüklük. Yalnızca `clip_sample=True` olduğunda geçerlidir.

set_alpha_to_one (`bool`, varsayılan `True`) : Her difüzyon adımı, o adımdaki ve bir önceki adımdaki alfa çarpım değerini kullanır. Son adım için bir önceki alfa yoktur. Bu seçenek `True` olduğunda bir önceki alfa çarpımı `1` olarak sabitlenir, aksi takdirde 0. adımdaki alfa değeri kullanılır.

steps_offset (`int`, varsayılan 0) : Bazı model ailelerinin gerektirdiği gibi, çıkarım adımlarına eklenen bir ofset.

prediction_type (`Literal["epsilon", "sample", "v_prediction"]`, varsayılan `"epsilon"`) : Zamanlayıcı işlevinin tahmin türü. `"epsilon"` (difüzyon sürecinin gürültüsünü tahmin eder), `"sample"` (gürültülü örneği doğrudan tahmin eder) veya `"v_prediction"` ([Imagen Video](https://huggingface.co/papers/2210.02303) makalesinin 2.4 bölümüne bakın) değerlerinden biri olmalıdır.

thresholding (`bool`, varsayılan `False`) : "Dinik eşikleme" yönteminin kullanılıp kullanılmayacağını belirtir. Bu, Stable Diffusion gibi gizli uzay difüzyon modelleri için uygun değildir.

dynamic_thresholding_ratio (`float`, varsayılan 0.995) : Dinamik eşikleme yöntemi için oran. Yalnızca `thresholding=True` olduğunda geçerlidir.

sample_max_value (`float`, varsayılan 1.0) : Dinamik eşikleme için eşik değeri. Yalnızca `thresholding=True` olduğunda geçerlidir.

timestep_spacing (`Literal["leading", "trailing", "linspace"]`, varsayılan olarak `"leading"`) : Zaman adımlarının ölçeklendirilme yöntemi. `"leading"`, `"trailing"` veya `"linspace"` değerlerinden biri olmalıdır. Daha fazla bilgi için [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) makalesindeki Tablo 2'ye bakın.

rescale_betas_zero_snr (`bool`, varsayılan `False`) : Betaların sıfır terminal SNR'ye sahip olacak şekilde yeniden ölçeklenip ölçeklenmeyeceğini belirtir. Bu, modelin orta parlaklıktaki örneklerle sınırlı kalmak yerine çok parlak ve karanlık örnekler üretmesini sağlar. [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506) ile gevşek bir şekilde ilişkilidir.

`DDIMScheduler`, gürültü azaltma difüzyon olasılıksal modellerinde (DDPM) tanıtılan gürültü azaltma işlemini, Markov olmayan yönlendirme ile genişletir.

Bu model [SchedulerMixin](/docs/diffusers/main/tr/api/schedulers/overview#diffusers.SchedulerMixin) ve [ConfigMixin](/docs/diffusers/main/tr/api/configuration#diffusers.ConfigMixin) sınıflarından devralır. Kütüphanenin tüm zamanlayıcılar için yükleme ve kaydetme gibi genel yöntemleri uyguladığı üst sınıf belgelendirmesini kontrol edin.

#### add_noise[[diffusers.DDIMScheduler.add_noise]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L517)

**Parametreler:**

original_samples (`torch.Tensor`) : Gürültü eklenecek orijinal örnekler.

noise (`torch.Tensor`) : Örneklere eklenecek gürültü.

timesteps (`torch.IntTensor`) : Her örnek için gürültü seviyesini gösteren zaman adımları.

**Dönüş:** `torch.Tensor`

Gürültülü örnekler.

Her zaman adımındaki gürültü büyüklüğüne göre orijinal örneklerin gürültü ekleyin (bu, ileri difüzyon sürecidir).

#### get_velocity[[diffusers.DDIMScheduler.get_velocity]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L560)

**Parametreler:**

sample (`torch.Tensor`) : Girdi örneği.

noise (`torch.Tensor`) : Gürültü tensörü.

timesteps (`torch.IntTensor`) : Hız hesaplama için zaman adımları.

**Dönüş:** `torch.Tensor`

Hesaplanan hız.

Hız formülüne göre örnek ve gürültüden hız tahminini hesaplayın.

#### scale_model_input[[diffusers.DDIMScheduler.scale_model_input]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L245)

**Parametreler:**

sample (`torch.Tensor`) : Girdi örneği.

timestep (`int`, *isteğe bağlı*) : Difüzyon zincirindeki mevcut zaman adımı.

**Dönüş:** `torch.Tensor`

Ölçeklendirilmiş bir girdi örneği.

Gürültüden arındırma modelinin girdisinin mevcut zaman adımına bağlı olarak ölçeklenmesi gereken zamanlayıcılarla değiştirilebilirliği sağlar.

#### set_timesteps[[diffusers.DDIMScheduler.set_timesteps]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L334)

**Parametreler:**

num_inference_steps (`int`) : Ön eğitilmiş bir modelle örnekler oluşturulurken kullanılan difüzyon adım sayısı.

device (`str | torch.device`, *isteğe bağlı*) : Zaman adımları için kullanılacak cihaz.

**Yükselen:** ``ValueError``

- ``ValueError`` -- `num_inference_steps`, `self.config.num_train_timesteps`'ten büyükse.

Difüzyon zinciri için kullanılan ayrık zaman adımlarını ayarlar (çalıştırılmadan önce çıkarım yapılmalıdır).

#### adım[[diffusers.DDIMScheduler.step]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L384)

**Parametreler:**

model_output (`torch.Tensor`) : Öğrenen difüzyon modelinden gelen doğrudan çıktı.

timestep (`int`) : Difüzyon zincirindeki mevcut ayrık zaman adımı.

sample (`torch.Tensor`) : Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.

eta (`float`, *opsiyonel*, varsayılan 0.0) : Difüzyon adımında eklenen gürültünün ağırlığı. 0 değeri DDIM'e (deterministik) ve 1 değeri DDPM'ye (tam olarak stokastik) karşılık gelir.

use_clipped_model_output (`bool`, *isteğe bağlı*, varsayılan `False`) : `True` ise, kırpılmış tahmini orijinal örnekten "düzeltilmiş" `model_output` hesaplanır. `self.config.clip_sample` `True` olduğunda tahmini orijinal örnek [-1, 1] aralığına kırpıldığı için bu işlem gereklidir. Kırpma işlemi gerçekleşmediyse, "düzeltilmiş" `model_output` girdi olarak sağlananla aynı olur ve `use_clipped_model_output` hiçbir etki göstermez.

generator (`torch.Generator`, *isteğe bağlı*) : Yeniden üretilebilir örneklemeler için rastgele sayı üreteci.

variance_noise (`torch.Tensor`, *isteğe bağlı*) : `generator` ile gürültü üretmek yerine, varyans için gürültüyü doğrudan sağlayarak bunu yapmanın alternatifi. `CycleDiffusion` gibi yöntemler için faydalıdır.

return_dict (`bool`, *isteğe bağlı*, varsayılan `True`) : [DDIMSchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ddim#diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput) mu yoksa `tuple` mu döndürüleceğini belirtir.

**Dönüş:** [DDIMSchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ddim#diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput) veya `tuple`

return_dict `True` ise [DDIMSchedulerOutput](/docs/diffusers/main/tr/api/schedulers/ddim#diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput) döndürülür, aksi halde ilk öğesi örnek tensörü olan bir tuple döndürülür.

Önceki zaman adımındaki örneği SDE'yi tersine çevirerek tahmin edin. Bu işlev, öğrenilen model çıktılarını (en sık tahmin edilen gürültüyü) kullanarak difüzyon sürecini ilerletir.

## DDIMSchedulerOutput[[diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput]]

#### diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput[[diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput]]

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddim.py#L33)

**Parametreler:**

prev_sample (`torch.Tensor`, görüntüler için `(batch_size, num_channels, height, width)` boyutunda) : Önceki zaman adımının hesaplanan `(x_{t-1})` örneği. `prev_sample`, gürültü azaltma döngüsünde bir sonraki model girdisi olarak kullanılmalıdır.

pred_original_sample (`torch.Tensor`, görüntüler için `(batch_size, num_channels, height, width)` boyutunda) : Mevcut zaman adımındaki model çıktısına dayalı olarak tahmin edilen gürültüsü azaltılmış örnek `(x_{0})`. `pred_original_sample`, ilerlemeyi önizlemek veya yönlendirme için kullanılabilir.

Zamanlayıcının `step` işlevi çıktısı için çıktı sınıfı.

