[ad_1]
Hướng dẫn đầy đủ về cách tạo bộ dữ liệu và bộ tải dữ liệu tùy chỉnh cho các mô hình khác nhau trong PyTorch
Trước khi có thể xây dựng mô hình học máy, bạn cần tải dữ liệu của mình vào tập dữ liệu. Might mắn thay, PyTorch có nhiều lệnh trợ giúp cho toàn bộ quá trình này (nếu bạn chưa quen với PyTorch, tôi khuyên bạn nên xem lại những kiến thức cơ bản đây).
PyTorch có tài liệu tốt để trợ giúp quá trình này, nhưng tôi chưa tìm thấy bất kỳ tài liệu hoặc hướng dẫn toàn diện nào về bộ dữ liệu tùy chỉnh. Trước tiên, tôi sẽ bắt đầu với việc tạo các tập dữ liệu cơ bản được tạo sẵn và sau đó tiến tới tạo các tập dữ liệu từ đầu cho các mô hình khác nhau!
Trước khi đi sâu vào mã cho các trường hợp sử dụng khác nhau, hãy hiểu sự khác biệt giữa hai thuật ngữ. Nói chung, trước tiên bạn tạo tập dữ liệu của mình rồi tạo trình tải dữ liệu. MỘT tập dữ liệu chứa các tính năng và nhãn từ mỗi điểm dữ liệu sẽ được đưa vào mô hình. MỘT bộ nạp dữ liệu là một PyTorch tùy chỉnh có thể lặp lại giúp dễ dàng tải dữ liệu với các tính năng bổ sung.
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
batch_sampler=None, num_workers=0, collate_fn=None,
pin_memory=False, drop_last=False, timeout=0,
worker_init_fn=None, *, prefetch_factor=2,
persistent_workers=False)
Các đối số phổ biến nhất trong bộ nạp dữ liệu là batch_size, xáo trộn (thường chỉ dành cho dữ liệu huấn luyện), số_công nhân (để tải dữ liệu đa tiến trình) và pin_bộ nhớ (để đặt Tensor dữ liệu đã tìm nạp vào bộ nhớ được ghim và cho phép truyền dữ liệu nhanh hơn tới GPU hỗ trợ CUDA).
Bạn nên đặt pin_memory = True thay vì chỉ định num_workers do các biến chứng đa xử lý với CUDA.
Trong trường hợp tập dữ liệu của bạn được tải xuống từ trực tuyến hoặc cục bộ, việc tạo tập dữ liệu sẽ cực kỳ đơn giản. Tôi nghĩ PyTorch tốt tài liệu về điều này, vì vậy tôi sẽ nói ngắn gọn.
Nếu bạn biết tập dữ liệu đến từ PyTorch hoặc tương thích với PyTorch, chỉ cần gọi các lệnh nhập cần thiết và tập dữ liệu bạn chọn:
from torch.utils.knowledge import Dataset
from torchvision import datasets
from torchvision.transforms imports ToTensorknowledge = torchvision.datasets.CIFAR10('path', prepare=True, remodel=ToTensor())
Mỗi tập dữ liệu sẽ có các đối số duy nhất để chuyển vào nó (được tìm thấy đây). Nói chung, đó sẽ là đường dẫn mà tập dữ liệu được lưu trữ tại đó, một boolean cho biết liệu nó có cần được tải xuống hay không (gọi một cách thuận tiện là tải xuống), đó là đào tạo hay thử nghiệm và liệu các phép biến đổi có cần được áp dụng hay không.
Tôi đã đề cập rằng các phép biến đổi có thể được áp dụng cho tập dữ liệu ở cuối phần trước, nhưng biến đổi thực sự là gì?
MỘT biến đổi là một phương pháp xử lý dữ liệu để xử lý trước hình ảnh. Có nhiều khía cạnh khác nhau để biến đổi. Phép biến đổi phổ biến nhất ToTensor(), sẽ chuyển đổi tập dữ liệu thành tensor (cần thiết để nhập vào bất kỳ mô hình nào). Các phép biến đổi khác được tích hợp trong PyTorch (ngọn đuốc.transforms) bao gồm lật, xoay, cắt xén, chuẩn hóa và dịch chuyển hình ảnh. Chúng thường được sử dụng để mô hình có thể khái quát hóa tốt hơn và không quá phù hợp với dữ liệu huấn luyện. Việc tăng cường dữ liệu cũng có thể được sử dụng để tăng kích thước của tập dữ liệu một cách giả tạo nếu cần.
Hãy cẩn thận, hầu hết các biến đổi torchvision chỉ chấp nhận các định dạng hình ảnh Gối hoặc tensor (không phải dạng numpy). Để chuyển đổi, chỉ cần sử dụng
Để chuyển đổi từ numpy, hãy tạo một tensor ngọn đuốc hoặc sử dụng như sau:
From PIL import Picture
# assume arr is a numpy array
# chances are you'll must normalize and forged arr to np.uint8 relying on format
img = Picture.fromarray(arr)
Các phép biến đổi có thể được áp dụng đồng thời bằng cách sử dụng torchvision.transforms.compose. Bạn có thể kết hợp bao nhiêu phép biến đổi nếu cần cho tập dữ liệu. Một ví dụ đã được biểu diễn ở dưới:
import torchvision.transforms.Composedataset_transform = transforms.Compose((
transforms.RandomResizedCrop(256),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
))
Hãy nhớ chuyển biến đổi đã lưu làm đối số vào tập dữ liệu để nó được áp dụng trong trình tải dữ liệu.
Trong hầu hết các trường hợp phát triển mô hình của riêng bạn, bạn sẽ cần một tập dữ liệu tùy chỉnh. Một trường hợp sử dụng phổ biến là học chuyển giao để áp dụng tập dữ liệu của riêng bạn trên mô hình được đào tạo trước.
Có 3 phần bắt buộc đối với lớp tập dữ liệu PyTorch: khởi tạo, chiều dàiVà truy xuất một phần tử.
__trong đó__: Để khởi tạo tập dữ liệu, chuyển dữ liệu thô và được gắn nhãn vào. Cách tốt nhất là chuyển dữ liệu hình ảnh thô và dữ liệu được gắn nhãn riêng biệt.
__len__: Trả về độ dài của tập dữ liệu. Trước khi tạo tập dữ liệu, dữ liệu thô và dữ liệu được gắn nhãn phải được kiểm tra để có cùng kích thước.
__getitem__: Đây là nơi diễn ra tất cả quá trình xử lý dữ liệu để trả về một chỉ mục nhất định (idx) của dữ liệu thô và được gắn nhãn. Nếu cần áp dụng bất kỳ phép biến đổi nào, dữ liệu phải được chuyển đổi thành tensor và được chuyển đổi. Nếu quá trình khởi tạo chứa đường dẫn đến tập dữ liệu thì đường dẫn đó phải được mở và dữ liệu được truy cập/xử lý trước trước khi có thể trả về.
Tập dữ liệu mẫu cho mô hình phân đoạn theo ngữ nghĩa:
from torch.utils.knowledge import Dataset
from torchvision import transformsclass ExampleDataset(Dataset):
"""Instance dataset"""
def __init__(self, raw_img, data_mask, remodel=None):
self.raw_img = raw_img
self.data_mask = data_mask
self.remodel = remodel
def __len__(self):
return len(self.raw_img)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
picture = self.raw_img(idx)
masks = self.data_mask(idx)
pattern = {'picture': picture, 'masks': masks}
if self.remodel:
pattern = self.remodel(pattern)
return pattern
[ad_2]
Source link