PyTorch Basics

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.")
Output:
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 คลาส) โดยกำหนดให้ทุกค่าเป็น 0
  • scatter_(dim=0, index=torch.tensor(y), value=1) : เรียกใช้ฟังก์ชัน scatter_ เพื่อเข้าไป ระบุค่า 1 ลงในตำแหน่งที่ตรงกับค่า Index y (ป้ายกำกับ)

เช่น หาก 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]