Datasets documentation
المعالجة المسبقة
المعالجة المسبقة
بالإضافة إلى تحميل مجموعات البيانات، فإن الهدف الرئيسي الآخر لـ 🤗 Datasets هو تقديم مجموعة متنوعة من دوال المعالجة المسبقة لجعل مجموعة البيانات في صيغة مناسبة للتدريب باستخدام إطار عمل تعلم الآلة الخاص بك.
توجد طرق عديدة محتملة لمعالجة مجموعة بيانات مسبقًا، ويعتمد الأمر كله على مجموعة البيانات الخاصة بك. في بعض الأحيان قد تحتاج إلى إعادة تسمية عمود، وفي أحيان أخرى قد تحتاج إلى فك تخطيط الحقول المتداخلة. يوفر 🤗 Datasets طريقة للقيام بمعظم هذه المهام. لكن في حالات المعالجة المسبقة تقريبًا جميعها، اعتمادًا على نمط مجموعة البيانات الخاصة بك، ستحتاج إلى:
- قم بتجزئة مجموعة بيانات نصية.
- إعادة أخذ عينات من مجموعة بيانات صوتية.
- تطبيق التحويلات على مجموعة بيانات الصور.
عادةً ما يكون آخر خطوة في المعالجة المسبقة هو ضبط صيغة مجموعة البيانات لتكون متوافقة مع صيغة الإدخال المتوقعة من إطار عمل تعلم الآلة الخاص بك.
في هذا الشرح التعليمي، ستحتاج أيضًا إلى تثبيت مكتبة 🤗 Transformers:
pip install transformers
احصل على مجموعة بيانات من اختيارك وتابع الخطوات!
تجزئة النص
لا تستطيع النماذج معالجة النص الخام، لذا ستحتاج إلى تحويل النص إلى أرقام. يوفر التقطيع (Tokenization) طريقة للقيام بذلك من خلال تقسيم النص إلى كلمات فردية تسمى رموزًا. يتم تحويل الرموز في النهاية إلى أرقام.
اطّلع على قسم Tokenizers في الفصل الثاني من دورة Hugging Face لمعرفة المزيد حول الترميز (Tokenization) والخوارزميات المختلفة للترميز.
1. ابدأ بتحميل مجموعة بيانات rotten_tomatoes ومُقسِّم النص (tokenizer) المقابل لنموذج BERT مُدرَّب مسبقًا. من المهم استخدام مُقسِّم النص نفسه المستخدم في النموذج المُدرَّب مسبقًا، لأنك تريد التأكد من تقسيم النص بالطريقة ذاتها.
>>> 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. استدعِ مُجزّئ النص على الصف الأول من text في مجموعة البيانات:
>>> 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) قاموسًا يحتوي على ثلاثة عناصر:
input_ids: الأرقام التي تمثل الرموز في النص.token_type_ids: يُحدد إلى أي تسلسل ينتمي الرمز إذا كان هناك أكثر من تسلسل واحد.attention_mask: يحدد ما إذا كان يجب إخفاء الرمز (token) أم لا.
هذه القيم هي في الواقع مدخلات النموذج.
3. أسرع طريقة لتجزئة مجموعة البيانات بأكملها هي استخدام دالة map(). تسرّع هذه الدالة عملية التجزئة من خلال تطبيق المجزّئ على دفعات من الأمثلة بدلاً من الأمثلة الفردية. اضبط معامل batched على True:
>>> def tokenization(example):
... return tokenizer(example["text"])
>>> dataset = dataset.map(tokenization, batched=True)4. اضبط تنسيق مجموعة البيانات الخاصة بك لتكون متوافقة مع إطار عمل تعلم الآلة الخاص بك:
استخدم دالة set_format() لضبط تنسيق مجموعة البيانات بحيث تكون متوافقة مع PyTorch:
>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'استخدم دالة to_tf_dataset() لضبط صيغة مجموعة البيانات بحيث تكون متوافقة مع TensorFlow. كما ستحتاج إلى استيراد data collator من 🤗 Transformers لدمج أطوال التسلسلات المتغيرة في دفعة واحدة بأطوال متساوية:
>>> 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. أصبح مجموعة البيانات الآن جاهزة للتدريب باستخدام إطار عمل تعلم الآلة الخاص بك!
إعادة أخذ عينات إشارات الصوت
تحتاج مدخلات الصوت، مثل مجموعات البيانات النصية، إلى التقسيم إلى نقاط بيانات منفصلة. يُعرف هذا الإجراء بـ الاستيفاء؛ حيث يخبرك معدل الاستيفاء عن مقدار إشارة الكلام التي يتم التقاطها في الثانية الواحدة. من المهم التأكد من تطابق معدل الاستيفاء في مجموعة بياناتك مع معدل الاستيفاء للبيانات المستخدمة في التدريب المسبق للنموذج الذي تستخدمه. إذا اختلفت معدلات الاستيفاء، فقد يؤدي النموذج المدرب مسبقًا أداءً ضعيفًا على مجموعة بياناتك لأنه لا يتعرف على الفروق في معدل الاستيفاء.
1. ابدأ بتحميل مجموعة بيانات MInDS-14، وخاصية Audio، ومستخرج الميزات المقابل لنموذج Wav2Vec2 مُسبق التدريب:
>>> 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. الوصول إلى الصف الأول من مجموعة البيانات. عند استدعاء عمود audio في مجموعة البيانات، يتم فك ترميزه وإعادة عينة تلقائيًا:
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
80003. قراءة بطاقة مجموعة البيانات مفيدة للغاية ويمكن أن تمنحك الكثير من المعلومات حولها. فإلقاء نظرة سريعة على بطاقة مجموعة بيانات MInDS-14 تُظهر أن معدل أخذ العينات هو 8kHz. وبالمثل، يمكنك الحصول على العديد من التفاصيل حول النموذج من بطاقة النموذج الخاصة به. وتقول بطاقة نموذج Wav2Vec2 إنه تم أخذ عينات من صوت كلام بمعدل 16kHz. وهذا يعني أنك ستحتاج إلى رفع معدل أخذ العينات لمجموعة بيانات MInDS-14 لتطابق معدل أخذ العينات للنموذج.
استخدم دالة cast_column() وقم بتعيين معامل sampling_rate في ميزة Audio لرفع معدل أخذ العينات للإشارة الصوتية. عند استدعاء عمود audio الآن، يتم فك ترميزه وإعادة أخذ عيناته بمعدل 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. استخدم دالة map() لإعادة أخذ عينات مجموعة البيانات بأكملها إلى 16kHz. تسرّع هذه الدالة عملية إعادة أخذ العينات من خلال تطبيق مستخرج الميزات على دفعات من الأمثلة بدلاً من الأمثلة الفردية. اضبط معامل batched على 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. أصبح مجموعة البيانات الآن جاهزة للتدريب باستخدام إطار عمل تعلم الآلة الخاص بك!
تطبيق عمليات زيادة البيانات
أكثر عمليات المعالجة المسبقة شيوعًا التي ستقوم بها مع مجموعات بيانات الصور هي تعزيز البيانات، وهي عملية تُدخل تغييرات عشوائية على الصورة دون تغيير معنى البيانات. وقد يعني ذلك تغيير خصائص اللون في الصورة أو قص جزء منها بشكل عشوائي. يمكنك استخدام أي مكتبة لتعزيز البيانات تفضلها، وسيساعدك 🤗 Datasets في تطبيق عمليات تعزيز البيانات الخاصة بك على مجموعة البيانات.
1. ابدأ بتحميل مجموعة بيانات Beans، وخاصية Image، ومستخرج الميزات المقابل لنموذج ViT مُدرَّب مسبقًا:
>>> 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. الوصول إلى الصف الأول من مجموعة البيانات. عند استدعاء عمود image في مجموعة البيانات، يتم فك ترميز كائن PIL الأساسي تلقائيًا إلى صورة.
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x7FE5A047CC70>تتوقع معظم نماذج الصور أن تكون الصورة في وضع RGB. صور Beans موجودة بالفعل في وضع RGB، لكن إذا كانت مجموعة البيانات الخاصة بك تحتوي على صور في وضع مختلف، يمكنك استخدام دالة cast_column() لضبط الوضع إلى RGB:
>>> dataset = dataset.cast_column("image", Image(mode="RGB"))3. الآن لنطبّق تقنيات زيادة البيانات على صورك. 🤗 يعمل Datasets مع أي مكتبة لتقنيات زيادة البيانات، وفي هذا المثال سنستخدم Albumentations.
Albumentations هي مكتبة شهيرة لتوسيع الصور توفر مجموعة غنية من التحويلات تشمل التحويلات على مستوى الفضاء، والتحويلات على مستوى البكسل، والتحويلات على مستوى المزج.
قم بتثبيت Albumentations:
pip install albumentations
4. أنشئ خط أنابيب تعديلات نموذجي باستخدام 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. بما أن 🤗 Datasets يستخدم صور PIL بينما تتوقع Albumentations مصفوفات NumPy، فأنت بحاجة إلى التحويل بين الصيغتين:
>>> 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. طبّق التحويل باستخدام with_transform():
>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]النقاط الرئيسية عند استخدام Albumentations مع 🤗 Datasets:
- تحويل صور PIL إلى مصفوفات NumPy قبل تطبيق التحويلات
- يعيد Albumentations قاموسًا يحتوي على الصورة المحوّلة تحت المفتاح “image”
- قم بتحويل النتيجة مرة أخرى إلى تنسيق PIL بعد التحويل
7. أصبح مجموعة البيانات الآن جاهزة للتدريب باستخدام إطار عمل تعلم الآلة الخاص بك!
Update on GitHub