# Ön işleme

Veri kümelerini yüklemenin yanı sıra, 🤗 Datasets'in diğer ana hedefi, veri kümesini makine öğrenimi çerçevenizle eğitim için uygun bir formata getirmek üzere çeşitli ön işleme işlevleri sunmaktır.

Bir veri setini ön işlemeye hazırlamanın birçok olası yolu vardır ve tümü, özel veri setinize bağlıdır. Bazen bir sütunu yeniden adlandırmanız, bazen de iç içe geçmiş alanları düzleştirmeniz gerekebilir. 🤗 Datasets, bu işlemlerin çoğunu yapmanın bir yolunu sunar. Ancak veri setinizin modalitesine bağlı olarak, neredeyse tüm ön işleme senaryolarında şunları yapmanız gerekecektir:

- Bir metin veri setini belirteçleştirin.
- Bir ses veri setini yeniden örnekleyin.
- Bir görüntü veri setine dönüştürme uygulamaları uygulayın.

Son ön işleme adımı, veri seti biçiminizi makine öğrenimi çerçevenizin beklediği girdi biçimiyle uyumlu hale getirmektir.

Bu öğreticide, 🤗 Transformers kütüphanesini de yüklemeniz gerekir:

```bash
pip install transformers
```

İstediğiniz bir veri setini alın ve adım adım ilerleyin!

## Metni belirteçlere ayır

Modeller ham metni işleyemez, bu nedenle metni sayılara dönüştürmeniz gerekir. _token_ adı verilen bireysel kelimelere bölerek bunu yapmanın bir yolunu sağlar. Token'lar sonunda sayılara dönüştürülür.

> [!TIP]
> Tokenizasyon ve farklı tokenizasyon algoritmaları hakkında daha fazla bilgi edinmek için Hugging Face kursunun 2. bölümündeki [Tokenizers](https://huggingface.co/course/chapter2/4?fw=pt) bölümüne göz atın.

**1**. [rotten_tomatoes](https://huggingface.co/datasets/rotten_tomatoes) veri setini ve önceden eğitilmiş bir [BERT](https://huggingface.co/bert-base-uncased) modeline karşılık gelen tokenizer'ı yükleyerek başlayın. Metnin aynı şekilde bölündüğünden emin olmak istediğiniz için, önceden eğitilmiş modelle aynı tokenizer'ı kullanmak önemlidir.

```py
>>> from transformers import AutoTokenizer
>>> from datasets import load_dataset

>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
>>> dataset = load_dataset("cornell-movie-review-data/rotten_tomatoes", split="train")
```

**2**. Veri setindeki `text` sütununun ilk satırında tokenizer'ınızı çağırın:

```py
>>> tokenizer(dataset[0]["text"])
{'input_ids': [101, 1103, 2067, 1110, 17348, 1106, 1129, 1103, 6880, 1432, 112, 188, 1207, 107, 14255, 1389, 107, 1105, 1115, 1119, 112, 188, 1280, 1106, 1294, 170, 24194, 1256, 3407, 1190, 170, 11791, 5253, 188, 1732, 7200, 10947, 12606, 2895, 117, 179, 7766, 118, 172, 15554, 1181, 3498, 6961, 3263, 1137, 188, 1566, 7912, 14516, 6997, 119, 102],
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
```

Tokenizör üç öğe içeren bir sözlük döndürür:

- `input_ids`: metindeki token'ları temsil eden sayılar.
- `token_type_ids`: birden fazla dizi varsa, bir token'ın hangi dizeye ait olduğunu belirtir.
- `attention_mask`: bir token'ın maskelenip maskelenmeyeceğini belirtir.

Bu değerler aslında model girdileridir.

**3**. Veri setinizin tamamını en hızlı şekilde belirteçlemenin yolu [map()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.map) işlevini kullanmaktır. Bu işlev, belirteçleyiciyi tekil örnekler yerine örnek gruplarına uygulayarak belirteçlemeyi hızlandırır. `batched` parametresini `True` olarak ayarlayın:

```py
>>> def tokenization(example):
...     return tokenizer(example["text"])

>>> dataset = dataset.map(tokenization, batched=True)
```

**4**. Veri setinizin biçimini, makine öğrenimi çerçevenizle uyumlu olacak şekilde ayarlayın:

PyTorch ile uyumlu olacak şekilde veri seti biçimini ayarlamak için [set_format()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.set_format) fonksiyonunu kullanın:

```py
>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'
```

Veri seti biçimini TensorFlow ile uyumlu olacak şekilde ayarlamak için [to_tf_dataset()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.to_tf_dataset) işlevini kullanın. Değişken uzunluktaki dizileri eşit uzunlukta tek bir partiye birleştirmek için 🤗 Transformers'tan bir [data collator](https://huggingface.co/docs/transformers/main_classes/data_collator#transformers.DataCollatorWithPadding) içe aktarmanız da gerekecektir:

```py
>>> from transformers import DataCollatorWithPadding

>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf")
>>> tf_dataset = dataset.to_tf_dataset(
...     columns=["input_ids", "token_type_ids", "attention_mask"],
...     label_cols=["label"],
...     batch_size=2,
...     collate_fn=data_collator,
...     shuffle=True
... )
```

**5**. Veri seti artık makine öğrenimi çerçevenizle eğitim için hazır!

## Ses sinyallerini yeniden örnekleyin

Metin veri setleri gibi ses girişleri de ayrık veri noktalarına bölünmelidir. Buna _örnekleme_ denir; örneklem hızı, saniyede ses sinyalinden ne kadarının yakalandığını belirtir. Kullandığınız modelin ön eğitimi için kullanılan verilerin örneklem hızıyla veri setinizin örneklem hızının eşleştiğinden emin olmak önemlidir. Örneklem hızları farklıysa, ön eğitilmiş model, örneklem hızındaki farkları tanıyamadığı için veri setinizde düşük performans gösterebilir.

**1**. [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) veri setini, [Audio](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Audio) özelliğini ve önceden eğitilmiş bir [Wav2Vec2](https://huggingface.co/facebook/wav2vec2-base-960h) modeline karşılık gelen özellik çıkarıcıyı yükleyerek başlayın:

```py
>>> from transformers import AutoFeatureExtractor
>>> from datasets import load_dataset, Audio

>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base-960h")
>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train")
```

**2**. Veri setinin ilk satırına indeksleme yapın. Veri setinin `audio` sütununu çağırdığınızda, otomatik olarak çözümlenir ve yeniden örneklenir:

```py
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
8000
```

**3**. Bir veri seti kartını okumak son derece faydalıdır ve veri seti hakkında çok fazla bilgi verebilir. MInDS-14 veri seti kartına hızlıca bakıldığında örneklem hızının 8kHz olduğu görülür. Benzer şekilde, bir model hakkında da model kartından birçok ayrıntı elde edebilirsiniz. Wav2Vec2 model kartı, modelin 16kHz konuşma sesinde örneklem alındığını belirtir. Bu, modelin örneklem hızıyla eşleşmesi için MInDS-14 veri setini yeniden örneklemeye (upsample) ihtiyacınız olduğu anlamına gelir.

[cast_column()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.cast_column) fonksiyonunu kullanın ve [Audio](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Audio) özelliğindeki `sampling_rate` parametresini ayarlayarak ses sinyalini örneklem artırın. Şimdi `audio` sütununu çağırdığınızda, çözümlenir ve 16 kHz'e yeniden örneklenir:

```py
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000))
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
16000
```

**4**. Tüm veri setini 16kHz'e yeniden örneklemek için [map()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.map) fonksiyonunu kullanın. Bu fonksiyon, özellik çıkarıcısını bireysel örnekler yerine örnek gruplarına uygulayarak yeniden örnekleme işlemini hızlandırır. `batched` parametresini `True` olarak ayarlayın:

```py
>>> def preprocess_function(examples):
...     audio_arrays = [x.get_all_samples().data[0].numpy() for x in examples["audio"]]
...     inputs = feature_extractor(
...         audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True, padding="max_length"
...     )
...     return inputs

>>> dataset = dataset.map(preprocess_function, batched=True)
```

**5**. Veri seti artık makine öğrenimi çerçevenizle eğitim için hazır!

## Veri artırma uygulamaları

Görsel veri setleriyle yapacağınız en yaygın ön işleme, verinin anlamını değiştirmeden bir görselde rastgele varyasyonlar oluşturan _veri artırma_ işlemidir. Bu, bir görselin renk özelliklerini değiştirmek veya bir görseli rastgele kırpma işlemi yapmak anlamına gelebilir. İstediğiniz herhangi bir veri artırma kütüphanesini kullanma özgürlüğünüz vardır ve 🤗 Datasets, veri artırma işlemlerinizi veri setinize uygulamanıza yardımcı olacaktır.

**1**. [Beans](https://huggingface.co/datasets/AI-Lab-Makerere/beans) veri setini, `Image` özelliğini ve önceden eğitilmiş bir [ViT](https://huggingface.co/google/vit-base-patch16-224-in21k) modeline karşılık gelen özellik çıkarıcıyı yükleyerek başlayın:

```py
>>> from transformers import AutoImageProcessor
>>> from datasets import load_dataset, Image

>>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224-in21k")
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")
```

**2**. Veri setinin ilk satırına indeksleme yapın. Veri setinin `image` sütununu çağırdığınızda, altta yatan PIL nesnesi otomatik olarak bir görüntüye çözümlenir.

```py
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x7FE5A047CC70>
```

Çoğu görüntü modeli, görüntünün RGB modunda olmasını bekler. Beans görüntüleri zaten RGB modundadır, ancak veri setiniz farklı bir modda görüntüler içeriyorsa, modu RGB olarak ayarlamak için [cast_column()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.cast_column) işlevini kullanabilirsiniz:

```py
>>> dataset = dataset.cast_column("image", Image(mode="RGB"))
```

**3**. Şimdi görsellerinize veri artırma (data augmentation) uygulamaları uygulayalım. 🤗 Datasets, herhangi bir artırma kütüphanesiyle çalışır ve bu örnekte Albumentations kullanacağız.

[Albumentations](https://albumentations.ai), uzay seviyesi, piksel seviyesi ve karıştırma seviyesi dönüşümlerini de içeren [zengin bir dönüşüm seti](https://albumentations.ai/docs/reference/supported-targets-by-transform/) sunan popüler bir görüntü artırma kütüphanesidir.

Albumentations'ı yükleyin:

```bash
pip install albumentations
```

**4**. Albumentations ile tipik bir artırma (augmentation) hattı oluşturun:

```py
>>> import albumentations as A
>>> import numpy as np
>>> from PIL import Image

>>> transform = A.Compose([
...     A.RandomCrop(height=256, width=256, pad_if_needed=True, p=1),
...     A.HorizontalFlip(p=0.5),
...     A.ColorJitter(p=0.5)
... ])
```

**5**. 🤗 Datasets PIL görüntüleri kullanırken Albumentations NumPy dizileri beklediği için formatlar arasında dönüştürme yapmanız gerekir:

```py
>>> def albumentations_transforms(examples):
...     # Apply Albumentations transforms
...     transformed_images = []
...     for image in examples["image"]:
...         # Convert PIL to numpy array (OpenCV format)
...         image_np = np.array(image.convert("RGB"))
...         
...         # Apply Albumentations transforms
...         transformed_image = transform(image=image_np)["image"]
...         
...         # Convert back to PIL Image
...         pil_image = Image.fromarray(transformed_image)
...         transformed_images.append(pil_image)
...     
...     examples["pixel_values"] = transformed_images
...     return examples
```

**6**. Dönüşümü [with_transform()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.with_transform) kullanarak uygulayın:

```py
>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]
```

**🤗 Datasets ile Albumentations kullanırken dikkat edilmesi gereken önemli noktalar:**
- Dönüşümleri uygulamadan önce PIL görüntülerini NumPy dizilerine dönüştürün
- Albumentations, dönüştürülen görüntüyü "image" anahtarı altında içeren bir sözlük döndürür
- Dönüşümün ardından sonucu tekrar PIL biçimine çevirin

**7**. Veri seti artık makine öğrenimi çerçevenizle eğitim için hazır!

