Key Concept: ทำไมต้องใช้ Transforms?
ข้อมูลในโลกความเป็นจริง (เช่น ไฟล์ภาพ, วิดีโอ, ข้อความ) ไม่ได้อยู่ในรูปแบบที่พร้อมสำหรับการฝึกสอน Machine Learning เสมอไป
เราจึงต้องใช้ Transforms เพื่อทำหน้าที่ "ดัดแปลงแก้ไข" ข้อมูลดิบเหล่านั้นให้อยู่ในรูปแบบ Tensor ที่เหมาะสมกับการประมวลผลของโมเดล
Raw Data
ภาพ (PIL Image), ตัวเลข (Integer)
Processed Tensor
Normalized Tensors, One-Hot Labels
การใช้ Transforms กับ Dataset
ชุดข้อมูล FashionMNIST มาพร้อมกับ Features ที่เป็นรูปภาพรูปแบบ PIL (Python Imaging Library) และ Labels ที่เป็นตัวเลขจำนวนเต็ม (Integers) แต่สำหรับการฝึกสอน (Training) เราต้องการนำ Features มาแปลงเป็น Normalized Tensors และนำ Labels มาแปลงเป็นแบบ One-Hot Encoded Tensors
ในการทำสิ่งเหล่านี้ เราจะใช้พารามิเตอร์ transform (สำหรับแก้ไขฟีเจอร์) และ target_transform (สำหรับแก้ไขป้ายกำกับ) ที่มีอยู่ในชุดข้อมูล torchvision
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
ds = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor(), # แปลงภาพให้เป็น Tensor
target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1)) # แปลงตัวเลขเป็น One-hot
)
print(f"Transform applied successfully.")
Transform applied successfully.
1. ToTensor() (สำหรับแปลง Feature)
ToTensor จะทำหน้าที่แปลงรูปภาพรูปแบบ PIL หรือ NumPy ndarray ให้กลายเป็น FloatTensor
และจะทำการปรับสเกลค่าความสว่างของพิกเซล (Pixel intensity values) จากเดิมที่มีค่าอยู่ในช่วง [0, 255] ให้กลายเป็นช่วง [0.0, 1.0] ซึ่งจำเป็นมากสำหรับโครงข่ายประสาทเทียม
2. Lambda Transforms (สำหรับแปลง Label/Target)
Lambda transforms ทำให้เราสามารถเขียนฟังก์ชันใดๆ ก็ได้ที่ผู้ใช้กำหนดเอง (User-defined lambda function)
ในตัวอย่างนี้ เราใช้ในการแปลงค่า Integer (ตัวเลขหมวดหมู่เสื้อผ้า) ให้กลายเป็น One-hot encoded tensor
target_transform = Lambda(lambda y: torch.zeros(
10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))
อธิบายโค้ด Lambda ทีละขั้นตอน:
torch.zeros(10, dtype=torch.float): สร้าง Tensor เริ่มต้นที่มีขนาดเท่ากับจำนวนคลาส (10 คลาส) โดยกำหนดให้ทุกค่าเป็น 0scatter_(dim=0, index=torch.tensor(y), value=1): เรียกใช้ฟังก์ชันscatter_เพื่อเข้าไป ระบุค่า 1 ลงในตำแหน่งที่ตรงกับค่า Indexy(ป้ายกำกับ)
เช่น หาก y = 3 (ชุดเดรส), ตัว One-hot tensor ก็จะมีหน้าตาเป็น: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]