# Metinsel Tersine Çevirme

[Textual Inversion](https://hf.co/papers/2208.01618), öğrenmesini istediğiniz şeyin birkaç örnek görseliyle görüntü üretim modellerini kişiselleştirmek için kullanılan bir eğitim tekniğidir. Bu teknik, sağladığınız örnek görsellerle eşleşecek şekilde metin gömme değerlerini (yeni gömme değerler, istemde kullanmanız gereken özel bir kelimeye bağlanır) öğrenerek ve güncelleyerek çalışır.

Eğitilmiş gömme (embedding) ile çıkarım için bkz. [Metinsel tersine çevirme çıkarımı](../using-diffusers/legacy_adapters#textual-inversion).

Sınırlı vRAM'a sahip bir GPU üzerinde eğitim yapıyorsanız, eğitim komutunda `gradient_checkpointing` ve `mixed_precision` parametrelerini etkinleştirmeyi denemelisiniz. Ayrıca [xFormers](../optimization/attention_backends) ile bellek verimli dikkat (attention) kullanarak bellek ayak izinizi azaltabilirsiniz.

Bu kılavuz, [textual_inversion.py](https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py) betiğini inceleyerek onu daha yakından tanımanıza ve kendi kullanım senaryonuza nasıl uyarlayabileceğinize yardımcı olacaktır.

Betik çalıştırmadan önce, kütüphanenin kaynak kodundan yüklendiğinden emin olun:

```bash
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
```

Eğitim betiği içeren örnek klasörüne gidin ve kullandığınız betiğin gerektirdiği bağımlılıkları yükleyin:

```bash
cd examples/textual_inversion
pip install -r requirements.txt
```
> [!TIP]
> 🤗 Accelerate, birden fazla GPU/TPU ile veya karma hassasiyetle eğitim yapmanıza yardımcı olmak için tasarlanmış bir kütüphanedir. Donanımınıza ve ortamınıza göre eğitim kurulumunuzu otomatik olarak yapılandırır. Daha fazla bilgi edinmek için 🤗 Accelerate [Hızlı tur](https://huggingface.co/docs/accelerate/quicktour) sayfasına göz atın.

Bir 🤗 Accelerate ortamı başlatın:

```bash
accelerate config
```

Herhangi bir yapılandırma seçmeden varsayılan bir 🤗 Accelerate ortamı kurmak için:

```bash
accelerate config default
```

Ya da ortamınız, bir notebook gibi, etkileşimli bir kabuğu desteklemiyorsa, şunu kullanabilirsiniz:

```py
from accelerate.utils import write_basic_config

write_basic_config()
```

Son olarak, kendi veri setiniz üzerinde bir model eğitmek istiyorsanız, eğitim scriptiyle uyumlu bir veri seti oluşturma yöntemini öğrenmek için [Eğitim için veri seti oluşturma](create_dataset) kılavuzuna göz atın.

> [!TIP]
> Aşağıdaki bölümler, betiğin nasıl değiştirileceğini anlamak için önemli olan eğitim betiğinin kısımlarını vurgular, ancak betiğin her yönünü ayrıntılı olarak kapsamaz. Daha fazla bilgi edinmek isterseniz, [betiği](https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py) okumaktan çekinmeyin ve herhangi bir sorunuz veya endişeniz varsa bize bildirin.

## Betik parametreleri

Eğitim betiği, eğitim çalışmasını ihtiyaçlarınıza göre özelleştirmenize yardımcı olmak için birçok parametreye sahiptir. Tüm parametreler ve açıklamaları [`parse_args()`](https://github.com/huggingface/diffusers/blob/839c2a5ece0af4e75530cb520d77bc7ed8acf474/examples/textual_inversion/textual_inversion.py#L176) fonksiyonunda listelenmiştir. Uygulanabilir durumlarda Diffusers, eğitim batch boyutu ve öğrenme oranı gibi her parametre için varsayılan değerler sağlar, ancak isterseniz bu değerleri eğitim komutunda değiştirmekten çekinmeyin.

Örneğin, gradyan biriktirme adım sayısını 1 olan varsayılan değerin üzerine çıkarmak için:

```bash
accelerate launch textual_inversion.py \
  --gradient_accumulation_steps=4
```

Belirtilmesi gereken diğer bazı temel ve önemli parametreler şunlardır:

- `--pretrained_model_name_or_path`: Hub'daki modelin adı veya önceden eğitilmiş modele yerel bir yol
- `--train_data_dir`: eğitim veri setini (örnek görüntüler) içeren klasöre giden yol
- `--output_dir`: eğitilen modelin kaydedileceği yer
- `--push_to_hub`: eğitilen modelin Hub'a gönderilip gönderilmeyeceği
- `--checkpointing_steps`: modelin eğitim sırasında checkpoint kaydetme sıklığı; eğitim herhangi bir nedenle yarıda kesilirse, eğitim komutunuza `--resume_from_checkpoint` ekleyerek bu checkpoint'ten eğitim devam ettirebilirsiniz
- `--num_vectors`: gömme öğrenmek için kullanılacak vektör sayısı; bu parametrenin artırılması modelin daha iyi öğrenmesine yardımcı olur ancak eğitim maliyetlerini artırır
- `--placeholder_token`: öğrenilen gömme (embedding)leri bağlamak için kullanılan özel kelime (çıkarsama sırasında istemcinizde bu kelimeyi kullanmanız gerekir)
- `--initializer_token`: eğitilmeye çalışılan nesneyi veya stili kabaca tanımlayan tek bir kelime
- `--learnable_property`: modelin yeni bir "stil" (örneğin Van Gogh'un resim stili) mi yoksa "nesne" (örneğin köpeğiniz) mi öğrenmesi için eğitildiğini belirtir

## Eğitim betiği

Diğer eğitim betiklerinden farklı olarak, textual_inversion.py bir veri seti oluşturmak için özel bir veri seti sınıfına, [`TextualInversionDataset`](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L487) sahiptir. Görsel boyutunu, yer tutucu belirteci, interpolasyon yöntemini, görselin kırpılıp kırpılmayacağını ve daha fazlasını özelleştirebilirsiniz. Veri setinin oluşturulma şeklini değiştirmeniz gerekiyorsa, `TextualInversionDataset` sınıfını düzenleyebilirsiniz.

Ardından, veri seti ön işleme kodunu ve eğitim döngüsünü [`main()`](https://github.com/huggingface/diffusers/blob/839c2a5ece0af4e75530cb520d77bc7ed8acf474/examples/textual_inversion/textual_inversion.py#L573) işlevinde bulacaksınız.

Betik, [tokenizer](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L616), [scheduler ve modeli](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L622) yükleyerek başlar:

```py
# Load tokenizer
if args.tokenizer_name:
    tokenizer = CLIPTokenizer.from_pretrained(args.tokenizer_name)
elif args.pretrained_model_name_or_path:
    tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_model_name_or_path, subfolder="tokenizer")

# Load scheduler and models
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
text_encoder = CLIPTextModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
)
vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
unet = UNet2DConditionModel.from_pretrained(
    args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
)
```

Özel [yer tutucu belirteci](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L632), belirteç ayrıştırıcının yanına eklenir ve yeni belirteci hesaba katmak için gömme yeniden ayarlanır.

Ardından, betik `TextualInversionDataset` üzerinden [bir veri seti oluşturur](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L716):

```py
train_dataset = TextualInversionDataset(
    data_root=args.train_data_dir,
    tokenizer=tokenizer,
    size=args.resolution,
    placeholder_token=(" ".join(tokenizer.convert_ids_to_tokens(placeholder_token_ids))),
    repeats=args.repeats,
    learnable_property=args.learnable_property,
    center_crop=args.center_crop,
    set="train",
)
train_dataloader = torch.utils.data.DataLoader(
    train_dataset, batch_size=args.train_batch_size, shuffle=True, num_workers=args.dataloader_num_workers
)
```

Son olarak, [eğitim döngüsü](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L784), gürültülü kalanı tahmin etmekten özel yer tutucu token'ın gömme ağırlıklarını güncellemeye kadar her şeyi ele alır.

Eğitim döngüsünün nasıl çalıştığı hakkında daha fazla bilgi edinmek isterseniz, gürültü azaltma sürecinin temel kalıbını açıklayan [Understanding pipelines, models and schedulers](../using-diffusers/write_own_pipeline) eğitim materyaline göz atın.

## Betik başlat

Tüm değişikliklerinizi yaptıysanız veya varsayılan yapılandırmayla sorununuz yoksa, eğitim betiğini başlatmaya hazırsınız! 🚀

Bu kılavuz için bir [kedi oyuncağı](https://huggingface.co/datasets/diffusers/cat_toy_example)na ait bazı görüntüleri indirip bir dizinde saklayacaksınız. Ancak isterseniz kendi veri setinizi oluşturup kullanabilirsiniz ([Eğitim için veri seti oluşturma](create_dataset) kılavuzuna bakın).

```py
from huggingface_hub import snapshot_download

local_dir = "./cat"
snapshot_download(
    "diffusers/cat_toy_example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes"
)
```

Ortam değişkeni `MODEL_NAME`'i Hub'daki bir model kimliğine veya yerel bir modele giden yola, `DATA_DIR`'i ise az önce kedi görsellerini indirdiğiniz konuma ayarlayın. Betik, aşağıdaki dosyaları oluşturur ve bunları repozitorunuza kaydeder:

- `learned_embeds.bin`: örnek görüntülerinize karşılık gelen öğrenilen gömme vektörleri
- `token_identifier.txt`: özel yer tutucu belirteç
- `type_of_concept.txt`: eğitim yaptığınız kavramın türü ("object" veya "style")

> [!WARNING]
> Tam bir eğitim çalışması, tek bir V100 GPU üzerinde yaklaşık 1 saat sürer.

Betik başlatmadan önce bir şey daha. Eğitim sürecini takip etmeye ilginiz varsa, eğitim ilerledikçe üretilen görüntüleri periyodik olarak kaydedebilirsiniz. Eğitim komutuna aşağıdaki parametreleri ekleyin:

```bash
--validation_prompt="A <cat-toy> train"
--num_validation_images=4
--validation_steps=100
```

```bash
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export DATA_DIR="./cat"

accelerate launch textual_inversion.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --train_data_dir=$DATA_DIR \
  --learnable_property="object" \
  --placeholder_token="<cat-toy>" \
  --initializer_token="toy" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=3000 \
  --learning_rate=5.0e-04 \
  --scale_lr \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --output_dir="textual_inversion_cat" \
  --push_to_hub
```

Eğitim tamamlandıktan sonra, yeni eğittiğiniz modeli çıkarım için şu şekilde kullanabilirsiniz:

```py
from diffusers import StableDiffusionPipeline
import torch

pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion("sd-concepts-library/cat-toy")
image = pipeline("A <cat-toy> train", num_inference_steps=50).images[0]
image.save("cat-train.png")
```

## Sonraki adımlar

Kendi Textual Inversion modelinizi eğittiğiniz için tebrikler! 🎉 Yeni modelinizi nasıl kullanacağınızı öğrenmek için aşağıdaki kılavuzlar size yardımcı olabilir:

- [Textual Inversion gömme değerlerini](../using-diffusers/legacy_adapters#textual-inversion) nasıl yükleyeceğinizi ve bunları negatif gömme değerleri olarak nasıl kullanacağınızı öğrenin.

