Datasets documentation
Pra-pemrosesan
Pra-pemrosesan
Selain memuat dataset, tujuan utama lain dari π€ Datasets adalah menyediakan beragam fungsi pra-pemrosesan untuk menyiapkan dataset ke dalam format yang sesuai untuk pelatihan dengan framework machine learning Anda.
Ada banyak cara untuk mempreproses dataset, dan semuanya bergantung pada dataset spesifik Anda. Terkadang Anda mungkin perlu mengganti nama kolom, dan di lain waktu Anda mungkin perlu meratakan (unflatten) field yang bersarang. π€ Datasets menyediakan cara untuk melakukan sebagian besar hal tersebut. Namun, dalam hampir semua kasus preproses, tergantung pada modalitas dataset Anda, Anda akan perlu:
- Tokenisasi dataset teks.
- Resample dataset audio.
- Terapkan transformasi ke dataset gambar.
Langkah pra-pemrosesan terakhir biasanya adalah mengatur format dataset Anda agar kompatibel dengan format input yang diharapkan oleh framework machine learning Anda.
Pada tutorial ini, Anda juga perlu menginstal pustaka π€ Transformers:
pip install transformers
Ambil dataset pilihan Anda dan ikuti langkah-langkahnya!
Tokenisasi teks
Model tidak dapat memproses teks mentah, sehingga Anda perlu mengonversi teks menjadi angka. Tokenisasi menyediakan cara untuk melakukan hal ini dengan membagi teks menjadi kata-kata individual yang disebut token. Token kemudian dikonversi menjadi angka.
Lihat bagian Tokenizers di Bab 2 kursus Hugging Face untuk mempelajari lebih lanjut tentang tokenisasi dan berbagai algoritma tokenisasi.
1. Mulailah dengan memuat dataset rotten_tomatoes dan tokenizer yang sesuai dengan model BERT pretrained. Menggunakan tokenizer yang sama dengan model pretrained sangat penting karena Anda ingin memastikan teks dipecah dengan cara yang sama.
>>> 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. Panggil tokenizer Anda pada baris pertama text dalam dataset:
>>> 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]}Tokenizer mengembalikan kamus dengan tiga item:
input_ids: angka-angka yang mewakili token dalam teks.token_type_ids: menunjukkan urutan mana yang dimiliki oleh token jika terdapat lebih dari satu urutan.attention_mask: menunjukkan apakah sebuah token harus di-mask atau tidak.
Nilai-nilai ini sebenarnya adalah input model.
3. Cara tercepat untuk melakukan tokenisasi seluruh dataset Anda adalah dengan menggunakan fungsi map(). Fungsi ini mempercepat tokenisasi dengan menerapkan tokenizer pada batch contoh, bukan pada contoh individual. Atur parameter batched menjadi True:
>>> def tokenization(example):
... return tokenizer(example["text"])
>>> dataset = dataset.map(tokenization, batched=True)4. Atur format dataset Anda agar kompatibel dengan framework machine learning Anda:
Gunakan fungsi set_format() untuk mengatur format dataset agar kompatibel dengan PyTorch:
>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'Gunakan fungsi to_tf_dataset() untuk mengatur format dataset agar kompatibel dengan TensorFlow. Anda juga perlu mengimpor data collator dari π€ Transformers untuk menggabungkan panjang sekuens yang bervariasi menjadi satu batch dengan panjang yang sama:
>>> 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. Dataset sekarang siap untuk pelatihan dengan framework machine learning Anda!
Resample sinyal audio
Input audio, seperti dataset teks, perlu dibagi menjadi titik data diskrit. Hal ini dikenal sebagai sampling; laju sampling memberi tahu Anda berapa banyak sinyal ucapan yang ditangkap per detik. Penting untuk memastikan bahwa laju sampling dataset Anda sesuai dengan laju sampling data yang digunakan untuk pra-pelatihan model yang Anda gunakan. Jika laju samplingnya berbeda, model pra-terlatih mungkin akan berkinerja buruk pada dataset Anda karena tidak mengenali perbedaan dalam laju sampling.
1. Mulailah dengan memuat dataset MInDS-14, fitur Audio, dan feature extractor yang sesuai dengan model Wav2Vec2 pretrained:
>>> 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. Indeks ke baris pertama dataset. Saat Anda memanggil kolom audio dari dataset, kolom tersebut otomatis didekode dan diresampel:
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
80003. Membaca dataset card sangat berguna dan dapat memberikan banyak informasi tentang dataset. Sekilas pada dataset card MInDS-14 menunjukkan bahwa sampling rate-nya adalah 8kHz. Demikian pula, Anda dapat memperoleh banyak detail tentang model dari model card-nya. Model card Wav2Vec2 menyatakan bahwa model tersebut disampel pada audio ucapan 16kHz. Ini berarti Anda perlu melakukan upsample pada dataset MInDS-14 agar sesuai dengan sampling rate model.
Gunakan fungsi cast_column() dan atur parameter sampling_rate pada fitur Audio untuk melakukan upsample pada sinyal audio. Saat Anda memanggil kolom audio sekarang, sinyal tersebut akan didekode dan diresample ke 16kHz:
>>> 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
160004. Gunakan fungsi map() untuk melakukan resampling seluruh dataset ke 16kHz. Fungsi ini mempercepat resampling dengan menerapkan feature extractor pada batch contoh, bukan pada contoh individual. Atur parameter batched ke True:
>>> 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. Dataset sekarang siap untuk pelatihan dengan framework machine learning Anda!
Terapkan augmentasi data
Preprocessing yang paling umum Anda lakukan pada dataset gambar adalah data augmentation, yaitu proses yang memperkenalkan variasi acak pada gambar tanpa mengubah makna datanya. Ini bisa berarti mengubah properti warna gambar atau memotong gambar secara acak. Anda bebas menggunakan pustaka data augmentation apa pun yang Anda sukai, dan π€ Datasets akan membantu Anda menerapkan data augmentation Anda ke dataset Anda.
1. Mulailah dengan memuat dataset Beans, fitur Image, dan feature extractor yang sesuai dengan model ViT pretrained:
>>> 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. Indeks ke baris pertama dataset. Saat Anda memanggil kolom image dari dataset, objek PIL yang mendasarinya otomatis didekode menjadi gambar.
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x7FE5A047CC70>Sebagian besar model gambar mengharapkan gambar dalam mode RGB. Gambar Beans sudah dalam mode RGB, tetapi jika dataset Anda berisi gambar dalam mode lain, Anda dapat menggunakan fungsi cast_column() untuk mengatur mode ke RGB:
>>> dataset = dataset.cast_column("image", Image(mode="RGB"))3. Sekarang, mari terapkan augmentasi data pada gambar Anda. π€ Datasets bekerja dengan pustaka augmentasi apa pun, dan dalam contoh ini kita akan menggunakan Albumentations.
Albumentations adalah pustaka augmentasi gambar yang populer dan menyediakan kumpulan transformasi yang kaya, termasuk transformasi tingkat spasial, transformasi tingkat piksel, dan transformasi tingkat pencampuran.
Install Albumentations:
pip install albumentations
4. Buat pipeline augmentasi yang umum dengan Albumentations:
>>> 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. Karena π€ Datasets menggunakan gambar PIL tetapi Albumentations mengharapkan array NumPy, Anda perlu mengonversi antara format:
>>> 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 examples6. Terapkan transformasi menggunakan with_transform():
>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]Poin penting saat menggunakan Albumentations dengan π€ Datasets:
- Konversi gambar PIL menjadi array NumPy sebelum menerapkan transformasi
- Albumentations mengembalikan kamus dengan gambar yang telah ditransformasi di bawah kunci βimageβ
- Konversi hasil kembali ke format PIL setelah transformasi
7. Dataset sekarang siap untuk pelatihan dengan framework machine learning Anda!
Update on GitHub