Datasets documentation
Tiền xử lý
Tiền xử lý
Ngoài việc tải các bộ dữ liệu, mục tiêu chính khác của 🤗 Datasets là cung cấp một bộ các hàm tiền xử lý đa dạng để đưa bộ dữ liệu về định dạng phù hợp cho việc huấn luyện với framework machine learning của bạn.
Có nhiều cách khác nhau để tiền xử lý một tập dữ liệu, và tất cả đều phụ thuộc vào tập dữ liệu cụ thể của bạn. Đôi khi bạn có thể cần đổi tên một cột, và đôi khi bạn có thể cần làm phẳng các trường lồng nhau. 🤗 Datasets cung cấp cách để thực hiện hầu hết những việc này. Nhưng trong gần như mọi trường hợp tiền xử lý, tùy thuộc vào dạng dữ liệu (modality) của tập dữ liệu, bạn sẽ cần:
- Tokenize một tập dữ liệu văn bản.
- Tạo lại mẫu cho một tập dữ liệu âm thanh.
- Áp dụng các phép biến đổi cho một tập dữ liệu ảnh.
Bước tiền xử lý cuối cùng thường là đặt định dạng bộ dữ liệu của bạn để tương thích với định dạng đầu vào mong đợi của framework học máy của bạn.
Trong hướng dẫn này, bạn cũng cần cài đặt thư viện 🤗 Transformers:
pip install transformers
Hãy chọn một bộ dữ liệu bất kỳ và làm theo!
Chia token văn bản
Mô hình không thể xử lý văn bản thô, vì vậy bạn cần chuyển đổi văn bản thành các con số. Tokenization cung cấp một cách để thực hiện điều này bằng cách chia văn bản thành các từ riêng lẻ gọi là token. Cuối cùng, các token được chuyển đổi thành các con số.
Xem phần Tokenizers trong Chương 2 của khóa học Hugging Face để tìm hiểu thêm về tokenization và các thuật toán tokenization khác nhau.
1. Bắt đầu bằng cách tải dataset rotten_tomatoes và tokenizer tương ứng với một model BERT đã được huấn luyện trước. Việc sử dụng cùng một tokenizer với model đã được huấn luyện trước là quan trọng vì bạn cần đảm bảo văn bản được tách theo cùng một cách.
>>> 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. Gọi tokenizer của bạn trên hàng đầu tiên của text trong bộ dữ liệu:
>>> 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 trả về một từ điển với ba mục:
input_ids: các số đại diện cho các token trong văn bản.token_type_ids: chỉ ra chuỗi mà một token thuộc về nếu có nhiều hơn một chuỗi.attention_mask: chỉ ra xem một token có nên bị che (mask) hay không.
Các giá trị này thực chất là đầu vào của mô hình.
3. Cách nhanh nhất để tokenize toàn bộ dataset của bạn là sử dụng hàm map(). Hàm này tăng tốc quá trình tokenize bằng cách áp dụng tokenizer lên các batch ví dụ thay vì từng ví dụ riêng lẻ. Đặt tham số batched thành True:
>>> def tokenization(example):
... return tokenizer(example["text"])
>>> dataset = dataset.map(tokenization, batched=True)4. Đặt định dạng của bộ dữ liệu của bạn để tương thích với framework machine learning của bạn:
Sử dụng hàm set_format() để đặt định dạng bộ dữ liệu tương thích với PyTorch:
>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"])
>>> dataset.format['type']
'torch'Sử dụng hàm to_tf_dataset() để đặt định dạng tập dữ liệu tương thích với TensorFlow. Bạn cũng cần nhập một data collator từ 🤗 Transformers để kết hợp các độ dài chuỗi khác nhau thành một batch có độ dài bằng nhau:
>>> 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. Bộ dữ liệu giờ đã sẵn sàng để huấn luyện với framework machine learning của bạn!
Tạo lại mẫu tín hiệu âm thanh
Đầu vào âm thanh, giống như các tập dữ liệu văn bản, cần được chia thành các điểm dữ liệu rời rạc. Quá trình này được gọi là lấy mẫu; tần số lấy mẫu cho biết lượng tín hiệu giọng nói được ghi lại trong mỗi giây. Điều quan trọng là phải đảm bảo tần số lấy mẫu của tập dữ liệu của bạn khớp với tần số lấy mẫu của dữ liệu được sử dụng để huấn luyện trước mô hình mà bạn đang dùng. Nếu các tần số lấy mẫu khác nhau, mô hình huấn luyện trước có thể hoạt động kém trên tập dữ liệu của bạn vì nó không nhận ra sự khác biệt về tần số lấy mẫu.
1. Bắt đầu bằng cách tải bộ dữ liệu MInDS-14, tính năng Audio và bộ trích xuất tính năng tương ứng với một mô hình Wav2Vec2 đã được huấn luyện trước:
>>> 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. Truy cập vào hàng đầu tiên của tập dữ liệu. Khi bạn gọi cột audio của tập dữ liệu, nó sẽ được giải mã và lấy mẫu lại một cách tự động:
>>> audio = dataset[0]["audio"]
>>> print(audio)
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
>>> audio.get_all_samples().sample_rate
80003. Đọc thẻ dữ liệu (dataset card) cực kỳ hữu ích và có thể cung cấp cho bạn nhiều thông tin về bộ dữ liệu. Chỉ cần xem nhanh thẻ dữ liệu của MInDS-14, bạn sẽ thấy tần số lấy mẫu là 8kHz. Tương tự, bạn có thể tìm thấy nhiều chi tiết về một mô hình từ thẻ mô hình (model card) của nó. Thẻ mô hình của Wav2Vec2 cho biết nó được lấy mẫu trên âm thanh giọng nói 16kHz. Điều này có nghĩa là bạn sẽ cần tăng tần số lấy mẫu (upsample) của bộ dữ liệu MInDS-14 để khớp với tần số lấy mẫu của mô hình.
Sử dụng hàm cast_column() và đặt tham số sampling_rate trong đặc trưng Audio để lấy mẫu lại tín hiệu âm thanh. Khi bạn gọi cột audio lúc này, nó sẽ được giải mã và lấy mẫu lại ở 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. Sử dụng hàm map() để lấy mẫu lại toàn bộ bộ dữ liệu xuống 16kHz. Hàm này tăng tốc quá trình lấy mẫu lại bằng cách áp dụng bộ trích xuất đặc trưng lên các lô ví dụ thay vì từng ví dụ riêng lẻ. Đặt tham số batched thành 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. Bộ dữ liệu giờ đã sẵn sàng để huấn luyện với framework machine learning của bạn!
Áp dụng các kỹ thuật tăng cường dữ liệu
Xử lý tiền xử lý phổ biến nhất mà bạn sẽ thực hiện với các bộ dữ liệu ảnh là data augmentation, một quá trình đưa vào các biến đổi ngẫu nhiên cho một ảnh mà không làm thay đổi ý nghĩa của dữ liệu. Điều này có thể bao gồm việc thay đổi các thuộc tính màu sắc của ảnh hoặc cắt ngẫu nhiên một phần của ảnh. Bạn có thể tự do sử dụng bất kỳ thư viện data augmentation nào bạn thích, và 🤗 Datasets sẽ giúp bạn áp dụng các phép tăng cường dữ liệu của mình lên bộ dữ liệu.
1. Bắt đầu bằng cách tải bộ dữ liệu Beans, đặc trưng Image và bộ trích xuất đặc trưng tương ứng với một mô hình ViT được huấn luyện trước:
>>> 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. Truy cập vào hàng đầu tiên của tập dữ liệu. Khi bạn gọi cột image của tập dữ liệu, đối tượng PIL bên dưới sẽ tự động được giải mã thành một hình ảnh.
>>> dataset[0]["image"]
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x500 at 0x7FE5A047CC70>Hầu hết các mô hình ảnh kỳ vọng ảnh ở chế độ RGB. Ảnh Beans đã ở chế độ RGB, nhưng nếu tập dữ liệu của bạn chứa ảnh ở chế độ khác, bạn có thể sử dụng hàm cast_column() để đặt chế độ thành RGB:
>>> dataset = dataset.cast_column("image", Image(mode="RGB"))3. Bây giờ hãy áp dụng các phép tăng cường dữ liệu cho hình ảnh của bạn. 🤗 Datasets hoạt động với bất kỳ thư viện tăng cường nào, và trong ví dụ này chúng ta sẽ sử dụng Albumentations.
Albumentations là thư viện tăng cường hình ảnh phổ biến, cung cấp bộ biến đổi phong phú bao gồm các biến đổi ở cấp độ không gian, cấp độ pixel và cấp độ trộn.
Cài đặt Albumentations:
pip install albumentations
4. Tạo một pipeline tăng cường dữ liệu điển hình với 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. Vì 🤗 Datasets sử dụng ảnh PIL trong khi Albumentations kỳ vọng mảng NumPy, bạn cần chuyển đổi giữa các định dạng:
>>> 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. Áp dụng phép biến đổi bằng with_transform():
>>> dataset = dataset.with_transform(albumentations_transforms)
>>> dataset[0]["pixel_values"]Các điểm chính khi sử dụng Albumentations với 🤗 Datasets:
- Chuyển đổi ảnh PIL thành mảng NumPy trước khi áp dụng các phép biến đổi
- Albumentations trả về một từ điển với hình ảnh đã được biến đổi dưới khóa “image”
- Chuyển đổi kết quả về định dạng PIL sau khi biến đổi
7. Bộ dữ liệu giờ đã sẵn sàng để huấn luyện với framework machine learning của bạn!
Update on GitHub