Datasets documentation
الاستخدام مع NumPy
الاستخدام مع NumPy
هذا المستند مقدمة سريعة لاستخدام datasets مع NumPy، مع تركيز خاص على كيفية استخراج كائنات numpy.ndarray من مجموعات البيانات لدينا، وكيفية استخدامها لتدريب نماذج مبنية على NumPy مثل نماذج scikit-learn.
تنسيق مجموعة البيانات
بشكل افتراضي، تُرجع مجموعات البيانات كائنات بايثون العادية: أعداد صحيحة، وأعداد عشرية، ونصوص، وقوائم، وما إلى ذلك.
للحصول على مصفوفات NumPy بدلاً من ذلك، يمكنك تعيين صيغة مجموعة البيانات إلى numpy:
>>> from datasets import Dataset
>>> data = [[1, 2], [3, 4]]
>>> ds = Dataset.from_dict({"data": data})
>>> ds = ds.with_format("numpy")
>>> ds[0]
{'data': array([1, 2])}
>>> ds[:2]
{'data': array([
[1, 2],
[3, 4]])}يُعدّ كائن Dataset غلافًا لجدول Arrow، مما يتيح قراءة سريعة من المصفوفات في مجموعة البيانات إلى مصفوفات NumPy.
لاحظ أن الإجراء نفسه تمامًا ينطبق على كائنات DatasetDict، بحيث عند تعيين صيغة DatasetDict إلى numpy، سيتم تنسيق جميع Dataset الموجودة هناك كـ numpy:
>>> from datasets import DatasetDict
>>> data = {"train": {"data": [[1, 2], [3, 4]]}, "test": {"data": [[5, 6], [7, 8]]}}
>>> dds = DatasetDict.from_dict(data)
>>> dds = dds.with_format("numpy")
>>> dds["train"][:2]
{'data': array([
[1, 2],
[3, 4]])}مصفوفات N الأبعاد
إذا كانت مجموعة بياناتك تتكون من مصفوفات ذات أبعاد N، فستلاحظ أنه افتراضياً تُعتبر المصفوفات نفسها إذا كان الشكل ثابتاً:
>>> from datasets import Dataset
>>> data = [[[1, 2],[3, 4]], [[5, 6],[7, 8]]] # fixed shape
>>> ds = Dataset.from_dict({"data": data})
>>> ds = ds.with_format("numpy")
>>> ds[0]
{'data': array([[1, 2],
[3, 4]])}>>> from datasets import Dataset
>>> data = [[[1, 2],[3]], [[4, 5, 6],[7, 8]]] # varying shape
>>> ds = Dataset.from_dict({"data": data})
>>> ds = ds.with_format("numpy")
>>> ds[0]
{'data': array([array([1, 2]), array([3])], dtype=object)}ومع ذلك، تتطلب هذه المنطق غالبًا مقارنات بطيئة للأشكال ونسخًا للبيانات.
لتجنب ذلك، يجب عليك استخدام نوع الميزة Array بشكل صريح وتحديد شكل متجهاتك:
>>> from datasets import Dataset, Features, Array2D
>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]]
>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')})
>>> ds = Dataset.from_dict({"data": data}, features=features)
>>> ds = ds.with_format("numpy")
>>> ds[0]
{'data': array([[1, 2],
[3, 4]])}
>>> ds[:2]
{'data': array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])}أنواع ميزات أخرى
يتم تحويل بيانات ClassLabel إلى مصفوفات بشكل صحيح:
>>> from datasets import Dataset, Features, ClassLabel
>>> labels = [0, 0, 1]
>>> features = Features({"label": ClassLabel(names=["negative", "positive"])})
>>> ds = Dataset.from_dict({"label": labels}, features=features)
>>> ds = ds.with_format("numpy")
>>> ds[:3]
{'label': array([0, 0, 1])}تبقى كائنات النص والثنائية دون تغيير، لأن NumPy يدعم الأرقام فقط.
تُدعم أنواع الميزات Image وAudio أيضًا.
لاستخدام نوع الميزة Image، ستحتاج إلى تثبيت الإضافة
visionعبر الأمرpip install datasets[vision].
>>> from datasets import Dataset, Features, Image
>>> images = ["path/to/image.png"] * 10
>>> features = Features({"image": Image()})
>>> ds = Dataset.from_dict({"image": images}, features=features)
>>> ds = ds.with_format("numpy")
>>> ds[0]["image"].shape
(512, 512, 3)
>>> ds[0]
{'image': array([[[ 255, 255, 255],
[ 255, 255, 255],
...,
[ 255, 255, 255],
[ 255, 255, 255]]], dtype=uint8)}
>>> ds[:2]["image"].shape
(2, 512, 512, 3)
>>> ds[:2]
{'image': array([[[[ 255, 255, 255],
[ 255, 255, 255],
...,
[ 255, 255, 255],
[ 255, 255, 255]]]], dtype=uint8)}لاستخدام نوع الميزة Audio، ستحتاج إلى تثبيت الإضافة
audioعبر الأمرpip install datasets[audio].
>>> from datasets import Dataset, Features, Audio
>>> audio = ["path/to/audio.wav"] * 10
>>> features = Features({"audio": Audio()})
>>> ds = Dataset.from_dict({"audio": audio}, features=features)
>>> ds = ds.with_format("numpy")
>>> ds[0]["audio"]["array"]
array([-0.059021 , -0.03894043, -0.00735474, ..., 0.0133667 ,
0.01809692, 0.00268555], dtype=float32)
>>> ds[0]["audio"]["sampling_rate"]
array(44100, weak_type=True)تحميل البيانات
لا تملك مكتبة NumPy أي قدرات مدمجة لتحميل البيانات، لذا ستحتاج إما إلى إنشاء مصفوفات NumPy مثل X, y لاستخدامها في scikit-learn، أو استخدام مكتبة مثل PyTorch لتحميل بياناتك باستخدام DataLoader.
استخدام with_format('numpy')
أسهل طريقة للحصول على مصفوفات NumPy من مجموعة بيانات هي استخدام طريقة with_format('numpy'). لنفترض أننا نريد تدريب شبكة عصبية على مجموعة بيانات MNIST المتوفرة
في HuggingFace Hub على https://huggingface.co/datasets/mnist.
>>> from datasets import load_dataset
>>> ds = load_dataset("ylecun/mnist")
>>> ds = ds.with_format("numpy")
>>> ds["train"][0]
{'image': array([[ 0, 0, 0, ...],
[ 0, 0, 0, ...],
...,
[ 0, 0, 0, ...],
[ 0, 0, 0, ...]], dtype=uint8),
'label': array(5)}بمجرد ضبط التنسيق، يمكننا تغذية مجموعة البيانات إلى النموذج القائم على NumPy على دفعات باستخدام طريقة Dataset.iter():
>>> for epoch in range(epochs):
... for batch in ds["train"].iter(batch_size=32):
... x, y = batch["image"], batch["label"]
... ...