Datasets documentation
Предобработка
Предобработка
Помимо загрузки наборов данных, главная цель 🤗 Datasets — предложить разнообразный набор функций предобработки, чтобы привести набор данных к подходящему формату для обучения с вашим фреймворком машинного обучения.
Существует множество способов предобработки набора данных, и всё зависит от конкретного датасета. Иногда может потребоваться переименовать столбец, а в других случаях — развернуть вложенные поля. 🤗 Datasets предоставляет инструменты для выполнения большинства таких операций. Однако в подавляющем большинстве случаев предобработки, в зависимости от модальности вашего набора данных, вам потребуется:
- Токенизация текстового набора данных.
- Пересэмплировать аудиодатасет.
- Примените преобразования к набору данных изображений.
Последний этап предобработки обычно заключается в приведении формата набора данных к ожидаемому формату входных данных вашего фреймворка машинного обучения.
В этом учебном руководстве вам также потребуется установить библиотеку 🤗 Transformers:
pip install transformers
Выберите любой набор данных и следуйте инструкциям!
Токенизация текста
Модели не могут обрабатывать сырой текст, поэтому текст необходимо преобразовать в числа. Токенизация позволяет сделать это, разбивая текст на отдельные слова, называемые токенами. В конечном итоге токены преобразуются в числа.
Ознакомьтесь с разделом Tokenizers во второй главе курса Hugging Face, чтобы узнать больше о токенизации и различных алгоритмах токенизации.
1. Начните с загрузки набора данных rotten_tomatoes и токенизатора, соответствующего предобученной модели 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]}Токенизатор возвращает словарь с тремя элементами:
input_ids: числа, представляющие токены в тексте.token_type_ids: указывает, к какой последовательности относится токен, если последовательностей несколько.attention_mask: указывает, следует ли маскировать токен.
На самом деле, эти значения являются входными данными модели.
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 показывает, что частота дискретизации составляет 8 кГц. Аналогично, из карточки модели можно узнать множество деталей о ней. В карточке модели Wav2Vec2 указано, что она обучалась на речевых данных с частотой дискретизации 16 кГц. Это означает, что вам потребуется повысить частоту дискретизации датасета MInDS-14, чтобы она соответствовала частоте дискретизации модели.
Используйте функцию cast_column() и задайте параметр sampling_rate в признаке Audio, чтобы выполнить апсемплинг аудиосигнала. Теперь при обращении к столбцу audio он декодируется и ресемплируется до 16 кГц:
>>> 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(), чтобы пересэмплировать весь датасет до 16 кГц. Эта функция ускоряет пересэмплирование, применяя экстрактор признаков к батчам примеров, а не к отдельным примерам. Установите параметр 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