ชุดข้อมูลและ DataLoaders แบบกำหนดเอง
torch.utils.data.Dataset, __len__/__getitem__, DataLoader, การแปลงข้อมูล และการเพิ่มความหลากหลายของข้อมูล
ชุดข้อมูลและ DataLoaders แบบกำหนดเอง เป็นบทเรียน Learn AI with Python ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn AI with Python และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน
การป้อนข้อมูลให้โมเดล
การฝึกจำเป็นต้องมีวิธีอ่าน แปลง และจัดข้อมูลเป็นชุดย่อยอย่างมีประสิทธิภาพ PyTorch มีสิ่งนามธรรมสองแบบ ได้แก่ ชุดข้อมูล (รู้วิธีดึงตัวอย่างหนึ่งรายการ) และ DataLoader (จัดข้อมูลเป็นชุดย่อยและสลับลำดับให้)
from torch.utils.data import Dataset, DataLoaderอินเทอร์เฟซของชุดข้อมูล
คลาสย่อย Dataset ที่กำหนดเองต้องใช้สองเมธอด ได้แก่ __len__ (มีตัวอย่างกี่รายการ) และ __getitem__ (คืนตัวอย่างตามดัชนี) PyTorch จะเรียกใช้เมธอดเหล่านี้เพื่อดึงข้อมูล
การใช้งาน __len__
__len__ บอกขนาดของชุดข้อมูลให้ PyTorch ทราบ เพื่อให้ PyTorch รู้ว่ามีดัชนีทั้งหมดกี่รายการ และในหนึ่งยุคมีชุดข้อมูลย่อยกี่ชุด
class ImageDataset(Dataset):
def __init__(self, paths, labels):
self.paths = paths
self.labels = labels
def __len__(self):
return len(self.paths)การใช้งาน __getitem__
__getitem__ จะโหลดและคืนตัวอย่างหนึ่งรายการ (พร้อมป้ายกำกับ) เมื่อได้รับดัชนี นี่คือจุดที่คุณเปิดไฟล์รูปภาพและแปลงรูปภาพนั้นเป็นเทนเซอร์
from PIL import Image
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert("RGB")
label = self.labels[idx]
return img, labelเหตุใดจึงต้องใช้การแปลงข้อมูล
รูปภาพดิบมีขนาดและช่วงค่าพิกเซลแตกต่างกัน การแปลงข้อมูลจะทำให้รูปภาพมีมาตรฐานเดียวกัน ได้แก่ ปรับขนาดให้เป็นรูปร่างคงที่ แปลงเป็นเทนเซอร์ และปรับค่าพิกเซลให้เป็นมาตรฐาน เพื่อให้โมเดลฝึกได้อย่างเสถียร
from torchvision import transformstransforms.Compose
transforms.Compose เชื่อมการแปลงข้อมูลหลายรายการให้เป็นกระบวนการเดียวที่ทำตามลำดับ การเชื่อมต่อทั่วไปคือ Resize ตามด้วย ToTensor แล้วจึง Normalize
tf = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])ทำความเข้าใจการแปลงข้อมูล
Resize กำหนดขนาดเชิงพื้นที่ให้คงที่ ToTensor แปลงรูปภาพ PIL เป็นเทนเซอร์และปรับสเกลพิกเซลให้อยู่ในช่วง [0,1] ส่วน Normalize จะเลื่อนและปรับสเกลแต่ละช่องให้มีค่าเฉลี่ยเป็นศูนย์และความแปรปรวนเป็นหนึ่ง ซึ่งช่วยให้การลู่เข้าเร็วขึ้น
การใช้การแปลงข้อมูลในชุดข้อมูล
ส่ง transform เข้าไปในชุดข้อมูล แล้วใช้ภายใน __getitem__ เพื่อให้ตัวอย่างทุกตัวได้รับการประมวลผลล่วงหน้าอย่างสม่ำเสมอขณะถูกดึงออกมา
class ImageDataset(Dataset):
def __init__(self, paths, labels, transform):
self.paths, self.labels, self.transform = paths, labels, transform
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert("RGB")
return self.transform(img), self.labels[idx]การห่อด้วย DataLoader
DataLoader จะเปลี่ยนชุดข้อมูลให้เป็นสิ่งที่วนซ้ำได้ซึ่งประกอบด้วยชุดข้อมูลย่อย ตั้งค่า batch_size เพื่อควบคุมจำนวนตัวอย่างต่อขั้น และตั้งค่า shuffle=True เพื่อสุ่มลำดับใหม่ในแต่ละยุค (สำคัญสำหรับการฝึก)
dataset = ImageDataset(paths, labels, tf)
loader = DataLoader(dataset, batch_size=32, shuffle=True)num_workers เพื่อความเร็ว
num_workers จะสร้างกระบวนการย่อยแบบขนานเพื่อโหลดและแปลงข้อมูลระหว่างที่ GPU กำลังฝึกโมเดล ช่วยซ่อนความหน่วงของการรับส่งข้อมูล ค่าอย่าง 4 มักช่วยให้ GPU มีข้อมูลป้อนอย่างต่อเนื่องแทนที่จะต้องรอ
loader = DataLoader(
dataset,
batch_size=32,
shuffle=True,
num_workers=4
)การวนซ้ำผ่านชุดข้อมูลย่อย
วนซ้ำผ่าน DataLoader เพื่อรับเทนเซอร์ที่จัดเป็นชุดย่อย ในแต่ละรอบจะได้ (images, labels) โดย images มีรูปร่างเป็น [batch_size, channels, H, W] และพร้อมส่งให้โมเดล
for images, labels in loader:
print(images.shape) # torch.Size([32, 3, 224, 224])
breakตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับกระบวนการข้อมูลของคุณ
สรุป: ชุดข้อมูลและ DataLoaders
คุณสร้าง Dataset แบบกำหนดเองด้วย __len__ และ __getitem__ ประมวลผลรูปภาพล่วงหน้าด้วย transforms.Compose (Resize, ToTensor, Normalize) และห่อไว้ใน DataLoader ที่มี batch_size, shuffle และ num_workers เพื่อป้อนชุดข้อมูลย่อยให้โมเดลอย่างมีประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “ชุดข้อมูลและ DataLoaders แบบกำหนดเอง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชุดข้อมูลและ DataLoaders แบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn AI with Python ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชุดข้อมูลและ DataLoaders แบบกำหนดเอง”
torch.utils.data.Dataset, __len__/__getitem__, DataLoader, การแปลงข้อมูล และการเพิ่มความหลากหลายของข้อมูล คุณปฏิบัติ Learn AI with Python ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn AI with Python หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn AI with Python บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ชุดข้อมูลและ DataLoaders แบบกำหนดเอง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn AI with Python นี้ได้ไหม
ได้ บทเรียน Learn AI with Python ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เทนเซอร์ PyTorch และ Autograd
- ชุดข้อมูลและ DataLoaders แบบกำหนดเอง
- การสร้างและฝึก CNN ด้วย PyTorch
- การตรวจจับวัตถุด้วย YOLOv8