Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Dataset và DataLoader trong PyTorch Beginner
Trong phần này, mình sẽ tìm hiểu cách sử dụng các lớp tích hợp sẵn như Dataset và DataLoader trong PyTorch để cải tiến quy trình xử lý dữ liệu bằng batch training (huấn luyện theo lô). Ngoài ra, bạn sẽ học cách tạo lớp Dataset của riêng mình và sử dụng các tập dữ liệu phổ biến như MNIST từ thư viện torchvision
.
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
Các khái niệm chính trong phần này bao gồm:
- Tách dữ liệu thành các lô (batches) nhằm tối ưu hóa quy trình tính toán gradient.
- Sử dụng Dataset để xây dựng tập dữ liệu có thể được truy cập theo chỉ mục hoặc kích thước.
- Sử dụng DataLoader để tự động quản lý việc lặp qua các lô trong vòng lặp huấn luyện.
- Tìm hiểu cách sử dụng các tập dữ liệu phổ biến với thư viện
torchvision
.
Dataset và DataLoader trong PyTorch
Xử lý dữ liệu với Dataset và DataLoader
import torch import torchvision from torch.utils.data import Dataset, DataLoader import numpy as np import math # Giải thích một số khái niệm cơ bản # Epoch: Một lần truyền tiến và lan truyền ngược qua tất cả các mẫu trong tập huấn luyện. # Batch_size: Số mẫu được sử dụng trong mỗi lần truyền tiến và lan truyền ngược. # Số vòng lặp (iterations): Số lần truyền tiến, mỗi lần sử dụng một lô dữ liệu với batch_size mẫu. # Ví dụ: 100 mẫu, batch_size=20 → cần 100/20 = 5 iterations để hoàn thành 1 epoch. # DataLoader giúp tự động chia dữ liệu thành các lô (batches).
Tạo lớp Dataset tùy chỉnh
class WineDataset(Dataset): def __init__(self): # Khởi tạo dữ liệu (có thể tải từ file, API hoặc các nguồn khác) # Đọc dữ liệu từ tệp CSV bằng numpy xy = np.loadtxt('./data/wine/wine.csv', delimiter=',', dtype=np.float32, skiprows=1) self.n_samples = xy.shape[0] # Số lượng mẫu self.x_data = torch.from_numpy(xy[:, 1:]) # Đặc trưng (features) self.y_data = torch.from_numpy(xy[:, [0]]) # Nhãn (labels) def __getitem__(self, index): # Cho phép truy cập từng mẫu qua chỉ mục return self.x_data[index], self.y_data[index] def __len__(self): # Trả về kích thước tập dữ liệu return self.n_samples # Tạo một đối tượng Dataset từ lớp đã định nghĩa dataset = WineDataset() # Lấy mẫu đầu tiên từ Dataset first_data = dataset[0] features, labels = first_data print(features, labels) # In ra đặc trưng và nhãn của mẫu đầu tiên
Sử dụng DataLoader
# Tải dữ liệu bằng DataLoader train_loader = DataLoader(dataset=dataset, batch_size=4, # Mỗi lô chứa 4 mẫu shuffle=True, # Xáo trộn dữ liệu sau mỗi epoch num_workers=2) # Sử dụng đa luồng để tải dữ liệu # Lấy ngẫu nhiên một lô dữ liệu dataiter = iter(train_loader) data = dataiter.next() features, labels = data print(features, labels) # In đặc trưng và nhãn của một batch
Vòng lặp huấn luyện đơn giản
num_epochs = 2 total_samples = len(dataset) # Tổng số mẫu trong Dataset n_iterations = math.ceil(total_samples / 4) # Số vòng lặp (iterations) cho mỗi epoch print(total_samples, n_iterations) for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(train_loader): # Ví dụ: Với 178 mẫu, batch_size=4 → 45 iterations mỗi epoch. # Chạy quá trình huấn luyện (giả lập) if (i + 1) % 5 == 0: print(f'Epoch: {epoch+1}/{num_epochs}, Step {i+1}/{n_iterations} | Inputs {inputs.shape} | Labels {labels.shape}')
Sử dụng tập dữ liệu từ torchvision
# Tải dữ liệu MNIST từ thư viện torchvision train_dataset = torchvision.datasets.MNIST( root='./data', # Thư mục lưu dữ liệu train=True, # Dữ liệu huấn luyện transform=torchvision.transforms.ToTensor(), # Chuyển đổi thành tensor download=True # Tải xuống dữ liệu nếu chưa có ) # Tạo DataLoader từ MNIST Dataset train_loader = DataLoader( dataset=train_dataset, batch_size=3, # Lô chứa 3 mẫu shuffle=True # Xáo trộn dữ liệu ) # Xem một lô ngẫu nhiên từ MNIST dataiter = iter(train_loader) data = dataiter.next() inputs, targets = data print(inputs.shape, targets.shape) # Đầu vào và nhãn (target) của MNIST
Giải thích từng phần
Dataset
- Lớp
Dataset
cho phép quản lý dữ liệu một cách dễ dàng:- Khởi tạo tập dữ liệu từ file, API hoặc dữ liệu sẵn có.
- Hỗ trợ truy cập từng mẫu bằng chỉ mục `__getitem__`.
- Xác định số lượng mẫu `__len__`.
- Trong ví dụ trên, dữ liệu rượu vang được tải và xử lý thành Tensor.
DataLoader
- Lớp
DataLoader
hỗ trợ việc quản lý và phân lô dữ liệu tự động:- Tạo lô dựa trên
batch_size
. - Xáo trộn dữ liệu giúp mô hình học tốt hơn.
- Tăng tốc độ tải dữ liệu với
num_workers
.
- Tạo lô dựa trên
Vòng lặp huấn luyện
- Vòng lặp huấn luyện duyệt qua từng lô , giúp giảm bộ nhớ cần thiết so với xử lý toàn bộ dữ liệu.
- Ví dụ: Với 178 mẫu và
batch_size=4
, mỗi epoch sẽ có bước lặp.
Sử dụng tập dữ liệu torchvision
torchvision.datasets
cung cấp nhiều tập dữ liệu phổ biến như MNIST, Fashion-MNIST, CIFAR10, COCO...- Dữ liệu được tải xuống tự động nếu chưa có, kết hợp với các thao tác tiền xử lý như chuyển đổi thành tensor.
Kết bài
Việc sử dụng Dataset và DataLoader trong PyTorch giúp:
- Quản lý dữ liệu dễ dàng, linh hoạt hơn.
- Tối ưu hóa huấn luyện bằng cách xử lý dữ liệu theo lô.
- Tích hợp các tập dữ liệu phổ biến với ít thao tác.
Công cụ này là phần quan trọng trong việc xây dựng các mô hình học sâu hiệu quả và dễ bảo trì.
Bài viết này được đăng tại [free tuts .net]