# TCDScheduler

Jianbin Zheng, Minghui Hu, Zhongyi Fan, Chaoyue Wang, Changxing Ding, Dacheng Tao ve Tat-Jen Cham tarafından tanıtılan [Trajectory Consistency Distillation](https://huggingface.co/papers/2402.19159), az sayıda adımda iyi örnekler üretebilen Strategic Stochastic Sampling (Algorithm 4) yöntemini ortaya koymuştur. [Consistency Models](https://huggingface.co/papers/2303.01469) içindeki çok adımlı zamanlayıcının (Algorithm 1) gelişmiş bir tekrarı olarak ayırt edilen Strategic Stochastic Sampling, özellikle yörünge tutarlılık fonksiyonu için tasarlanmıştır.

Makalenin özeti şudur:

*Latent Consistency Model (LCM), Consistency Model'i latent uzaya genişletir ve metinden görüntüye sentezin hızlandırılmasında etkileyici performans elde etmek için yönlendirilmiş tutarlılık damıtma tekniğinden yararlanır. Ancak, LCM'nin hem netlik hem de detaylı incelik içeren görüntüler üretmekte zorlandığını gözlemledik. Bu sınırlamayı ele almak için öncelikle altta yatan nedenleri inceleyip açıklıyoruz. Araştırmamız, ana sorunun üç ayrı alandaki hatalardan kaynaklandığını belirlemiştir. Sonuç olarak, yörünge tutarlılık fonksiyonunu ve stratejik stokastik örnekleme yöntemini kapsayan Trajectory Consistency Distillation (TCD)'yi tanıttık. Yörünge tutarlılık fonksiyonu, kendi tutarlılık sınır koşulunun kapsamını genişleterik damıtma hatalarını azaltır ve TCD'ye Probability Flow ODE'nin tüm yörüngesini doğru bir şekilde izleme yeteneği kazandırır. Ayrıca, stratejik stokastik örnekleme, çok adımlı tutarlılık örneklemede içkin olan birikmiş hataları aşmak için özellikle tasarlanmış ve TCD modelini tamamlamak için özenle uyarlanmıştır. Deneyler, TCD'nin düşük NFE'lerde görüntü kalitesini önemli ölçüde artırdığını ve yüksek NFE'lerde öğretmen modele kıyasla daha detaylı sonuçlar ürettiğini göstermektedir.*

Orijinal kod tabanı [jabir-zheng/TCD](https://github.com/jabir-zheng/TCD) adresinde bulunabilir.

## TCDScheduler[[diffusers.TCDScheduler]]

#### diffusers.TCDScheduler[[diffusers.TCDScheduler]]

```python
diffusers.TCDScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.00085, beta_end: float = 0.012, beta_schedule: str = 'scaled_linear', trained_betas: numpy.ndarray | list[float] | None = None, original_inference_steps: int = 50, clip_sample: bool = False, clip_sample_range: float = 1.0, set_alpha_to_one: bool = True, steps_offset: int = 0, prediction_type: str = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, sample_max_value: float = 1.0, timestep_spacing: str = 'leading', timestep_scaling: float = 10.0, rescale_betas_zero_snr: bool = False)
```

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

**Parametreler:**

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

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

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

beta_schedule (`str`, varsayılan `"scaled_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` seçeneklerinden birini seçin.

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

original_inference_steps (`int`, varsayılan `50`) : Doğrusal aralıklı bir zaman adımı zaman çizelgesi oluşturmak için kullanılan varsayılan çıkarım adımı sayısıdır. Bu çizelgeden nihai zaman adımı zaman çizelgesini oluşturmak için `num_inference_steps` eşit aralıklı zaman adımı alınacaktır.

clip_sample (`bool`, varsayılan `False`) : 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 (`str`, defaults to `"epsilon"`) : Prediction type of the scheduler function; can be `epsilon` (predicts the noise of the diffusion process), `sample` (directly predicts the noisy sample`) or `v_prediction` (see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper).

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 (`str`, varsayılan `"leading"`) : Zaman adımlarının ölçeklendirilme yöntemi. 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.

timestep_scaling (`float`, varsayılan `10.0`) : Tutarlılık modeli sınır koşulları `c_skip` ve `c_out` hesaplanırken zaman adımlarının çarpılacağı katsayı. Bu değeri artırmak, yaklaşık hatayı azaltır (ancak varsayılan `10.0` değeri için yaklaşık hata zaten oldukça küçüktür).

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.

`TCDScheduler`, `Trajectory Consistency Distillation` makalesi tarafından tanıtılan `Strategic Stochastic Sampling` yöntemini içine alır ve özgürce yörünge gezinmesine olanak tanımak için orijinal Multistep Consistency Sampling'i genişletir.

Bu kod, TCD'nin resmi deposuna (https://github.com/jabir-zheng/TCD) dayanmaktadır.

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. [~ConfigMixin](/docs/diffusers/main/tr/api/configuration#diffusers.ConfigMixin), zamanlayıcının `__init__` fonksiyonuna iletilen `num_train_timesteps` gibi tüm yapılandırma özniteliklerini saklamaktan sorumludur. Bunlara `scheduler.config.num_train_timesteps` yoluyla erişilebilir. [SchedulerMixin](/docs/diffusers/main/tr/api/schedulers/overview#diffusers.SchedulerMixin), [SchedulerMixin.save_pretrained()](/docs/diffusers/main/tr/api/schedulers/overview#diffusers.SchedulerMixin.save_pretrained) ve [from_pretrained()](/docs/diffusers/main/tr/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained) fonksiyonları aracılığıyla genel yükleme ve kaydetme işlevselliği sağlar.

#### add_noise[[diffusers.TCDScheduler.add_noise]]

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

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

**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.TCDScheduler.get_velocity]]

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

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

**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.

#### index_for_timestep[[diffusers.TCDScheduler.index_for_timestep]]

```python
index_for_timestep(timestep: typing.Union[float, torch.Tensor], schedule_timesteps: typing.Optional[torch.Tensor] = None)
```

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

**Parametreler:**

timestep (`float` veya `torch.Tensor`) : Zamanlamada bulunacak timestep değeri.

schedule_timesteps (`torch.Tensor`, *isteğe bağlı*) : Aranacak zaman adımı zamanlaması. `None` ise `self.timesteps` kullanılır.

**Dönüş:** `int`

Zaman adımı planındaki zaman adımının indeksi. Çok eşleşme varsa, planın ortasından başlanırken (örneğin, görüntüden görüntüye) bir sigmanın atlanmaması için çok eşleşme durumunda ikinci indeksi döndürür.

Verilen zaman adımının zaman adımı zaman çizelgesindeki indeksini bulun.

#### previous_timestep[[diffusers.TCDScheduler.previous_timestep]]

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

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

**Parametreler:**

timestep (`int`) : Güncel zaman adımı.

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

Önceki zaman adımı.

Difüzyon zincirindeki bir önceki zaman adımını hesaplayın.

#### scale_model_input[[diffusers.TCDScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: typing.Union[int, torch.Tensor, NoneType] = None)
```

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

**Parametreler:**

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

timestep (`int` veya `torch.Tensor`, *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_begin_index[[diffusers.TCDScheduler.set_begin_index]]

```python
set_begin_index(begin_index: int = 0)
```

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

**Parametreler:**

begin_index (`int`, varsayılan `0`) : Zamanlayıcının başlangıç indeksi.

Zamanlayıcının başlangıç indeksini ayarlar. Bu işlev, çıkarım (inference) öncesinde pipeline'dan çalıştırılmalıdır.

#### set_timesteps[[diffusers.TCDScheduler.set_timesteps]]

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

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

**Parametreler:**

num_inference_steps (`int`, *isteğe bağlı*) : Ön eğitilmiş bir modelle örnekler oluşturulurken kullanılan difüzyon adım sayısı. Kullanılırsa, `timesteps` `None` olmalıdır.

device (`str` veya `torch.device`, *opsiyonel*) : Timestep'lerin taşınacağı cihaz. `None` ise timestep'ler taşınmaz.

original_inference_steps (`int`, *opsiyonel*) : Doğrusal aralıklı bir zaman adımı planı oluşturmak için kullanılacak olan orijinal çıkarım adımı sayısı (standart `diffusers` uygulamasından farklıdır). Ardından bu plandan, indeksler açısından eşit aralıklı olacak şekilde `num_inference_steps` zaman adımı seçer ve bunu nihai zaman adımı planımız olarak kullanırız. Ayarlanmazsa, bu değer `original_inference_steps` özniteliğine varsayılan olarak ayarlanır.

timesteps (`list[int]`, *isteğe bağlı*) : Timestep'ler arasında keyfi aralıklara destek sağlamak için kullanılan özel timestep'ler. `None` ise, eğitim/distilasyon timestep zaman çizelgesinde timestep'ler arasında eşit aralıklı varsayılan timestep aralıklandırma stratejisi kullanılır. `timesteps` geçirilirse, `num_inference_steps` `None` olmalıdır.

strength (`float`, varsayılan `1.0`) : img2img, inpaint vb. kullanılırken çıkarım için kullanılan zaman adımı sayısını belirlemek için kullanılır.

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.TCDScheduler.step]]

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

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

**Parametreler:**

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

timestep (`int` veya `torch.Tensor`) : 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`, varsayılan `0.3`) : Her adımdaki stokastikliği kontrol etmek için kullanılan stokastik bir parametre (makalede `gamma` olarak adlandırılır). eta = 0 olduğunda deterministik örneklemeyi, eta = 1 olduğunda ise tam stokastik örneklemeyi temsil eder.

generator (`torch.Generator`, *isteğe bağlı*) : Rastgele sayı üreteci.

return_dict (`bool`, varsayılan `True`) : [TCDSchedulerOutput](/docs/diffusers/main/tr/api/schedulers/tcd#diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput) mu yoksa `tuple` mu döndürüleceğini belirtir.

**Dönüş:** [TCDSchedulerOutput](/docs/diffusers/main/tr/api/schedulers/tcd#diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput) veya `tuple[torch.Tensor, torch.Tensor]`

return_dict `True` ise [TCDSchedulerOutput](/docs/diffusers/main/tr/api/schedulers/tcd#diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput) döndürülür, aksi halde önceki örnek ve tahmin edilen gürültülü örneği içeren 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.

## TCDSchedulerOutput[[diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput]]

#### diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput[[diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput]]

```python
diffusers.schedulers.scheduling_tcd.TCDSchedulerOutput(prev_sample: Tensor, pred_noised_sample: typing.Optional[torch.Tensor] = None)
```

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

**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_noised_sample (`torch.Tensor`, görüntüler için `(batch_size, num_channels, height, width)` boyutunda, *opsiyonel*) : Mevcut zaman adımındaki model çıktısına dayalı olarak tahmin edilen gürültülü örnek `(x_{s})`.

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

