Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ການສ້າງ Autoencoder ສຳລັບການບີບອັດຂໍ້ມູນ

ໂພສເມື່ອ # Deep Learning # Computer Vision # PyTorch # Data Compression

ການສ້າງ Autoencoder ສຳລັບການບີບອັດຂໍ້ມູນ

ໃນຍຸກທີ່ເຕັກໂນໂລຊີກຳລັງຂະຫຍາຍຕົວໃນ ສປປ ລາວ, ຂໍ້ມູນຂະໜາດໃຫຍ່ (Big Data) ໄດ້ກາຍເປັນສິ່ງທີ່ເຮົາຕ້ອງຮັບມືຢູ່ທຸກວັນ. ລອງຈິນຕະນາການເຖິງໂຄງການກະສິກຳອັດສະລິຍະ (Smart Agriculture) ຢູ່ເມືອງປາກຊ່ອງ ແຂວງຈຳປາສັກ ທີ່ໃຊ້ໂດຣນ (Drones) ຕິດຕັ້ງກ້ອງ Multispectral ເພື່ອບິນສຳຫຼວດພະຍາດໃນຕົ້ນກາເຟ. ຮູບພາບຄວາມລະອຽດສູງເຫຼົ່ານີ້ມີຂະໜາດໃຫຍ່ຫຼາຍ (Gigabytes ຕໍ່ຖ້ຽວບິນ), ຊຶ່ງການຈະສົ່ງຂໍ້ມູນເຫຼົ່ານີ້ຜ່ານເຄືອຂ່າຍ 4G ໃນພື້ນທີ່ຫ່າງໄກສອກຫຼີກໄປຍັງສູນຂໍ້ມູນຢູ່ນະຄອນຫຼວງວຽງຈັນ ສ້າງຂໍ້ຈຳກັດທັງເລື່ອງຄວາມໄວ ແລະ ຄ່າໃຊ້ຈ່າຍ.

ຈຸດນີ້ເອງທີ່ Deep Learning ກ້າວເຂົ້າມາແກ້ໄຂບັນຫາ. ແທນທີ່ຈະໃຊ້ການບີບອັດແບບມາດຕະຖານ (ເຊັ່ນ JPEG ທີ່ອາດເຮັດໃຫ້ຂໍ້ມູນທາງ Multispectral ເສຍຫາຍ), ເຮົາສາມາດສ້າງ Autoencoder ທີ່ຮຽນຮູ້ການບີບອັດຂໍ້ມູນສະເພາະທາງຂອງເຮົາໄດ້ຢ່າງມີປະສິດທິຜົນສູງສຸດ. ບົດຄວາມນີ້ຈະພາທ່ານລົງເລິກເຖິງສະຖາປັດຕະຍະກຳ ແລະ ການຂຽນໂຄດເພື່ອສ້າງໂມເດລບີບອັດຂໍ້ມູນດ້ວຍຕົວເອງ.

ສະຖາປັດຕະຍະກຳຂອງ Autoencoder

Autoencoder ແມ່ນໂຄງຂ່າຍປະສາດທຽມ (Neural Network) ປະເພດໜຶ່ງທີ່ຖືກອອກແບບມາເພື່ອຮຽນຮູ້ການເຂົ້າລະຫັດຂໍ້ມູນ (Encode) ໃຫ້ມີຂະໜາດນ້ອຍລົງ ແລະ ຖອດລະຫັດ (Decode) ກັບຄືນມາໃຫ້ຄືກັບຕົ້ນສະບັບຫຼາຍທີ່ສຸດ. ສຳລັບຂໍ້ມູນຮູບພາບ, ເຮົານິຍົມໃຊ້ Convolutional Autoencoder (CAE).

ໂຄງສ້າງຫຼັກປະກອບມີ 3 ສ່ວນ:

  1. Encoder (fθf_{\theta}): ບີບອັດຂໍ້ມູນນຳເຂົ້າ xx ໃຫ້ກາຍເປັນ Latent Representation zz (ຫຼື Bottleneck). ສູດຄື: z=fθ(x)z = f_{\theta}(x)
  2. Latent Space (zz): ພື້ນທີ່ລີ້ຊ່ອນທີ່ເກັບແຕ່ຂໍ້ມູນທີ່ສຳຄັນທີ່ສຸດ (ສະກັດເອົາແຕ່ Features ຫຼັກຂອງສວນກາເຟ ເຊັ່ນ ສີ, ຂອບໃບ).
  3. Decoder (gϕg_{\phi}): ນຳເອົາ zz ມາສ້າງຮູບພາບໃໝ່ x^\hat{x} ໃຫ້ໃກ້ຄຽງກັບ xx ທີ່ສຸດ. ສູດຄື: x^=gϕ(z)\hat{x} = g_{\phi}(z)

ເປົ້າໝາຍຂອງການຝຶກສອນ (Training) ແມ່ນການຫາຍອດຕໍ່າສຸດຂອງ Loss Function, ໂດຍທົ່ວໄປໃຊ້ Mean Squared Error (MSE): L(x,x^)=xgϕ(fθ(x))2L(x, \hat{x}) = || x - g_{\phi}(f_{\theta}(x)) ||^2

ການສ້າງໂມເດລດ້ວຍ PyTorch (ພາກປະຕິບັດ)

ເຮົາມາລົງມືສ້າງໂມເດລ CAE ໂດຍໃຊ້ PyTorch. ໂມເດລນີ້ຈະຮັບຮູບພາບ Multispectral ຂະໜາດ 256x256 ແລ້ວບີບອັດຜ່ານ Bottleneck.

import torch
import torch.nn as nn

class PaksongAgriAutoencoder(nn.Module):
    def __init__(self):
        super(PaksongAgriAutoencoder, self).__init__()
        
        # 1. ພາກສ່ວນ Encoder: ຫຼຸດຂະໜາດຮູບ (Downsampling) ຮັກສາໄວ້ແຕ່ Features ທີ່ສຳຄັນ
        self.encoder = nn.Sequential(
            # Input shape: [Batch, 3, 256, 256] -> ສົມມຸດວ່າໃຊ້ 3 Channels
            nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=2, padding=1),
            nn.ReLU(True),
            # Shape: [Batch, 16, 128, 128]
            
            nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=2, padding=1),
            nn.ReLU(True),
            # Shape: [Batch, 32, 64, 64]
            
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=2, padding=1),
            nn.ReLU(True)
            # Shape: [Batch, 64, 32, 32] -> ນີ້ຄື Latent Space ທີ່ຖືກບີບອັດແລ້ວ!
            # ຂະໜາດຂໍ້ມູນຫຼຸດລົງຢ່າງມະຫາສານ ພ້ອມສົ່ງຜ່ານ 4G ໄດ້ໄວຂຶ້ນ
        )
        
        # 2. ພາກສ່ວນ Decoder: ຂະຫຍາຍຮູບພາບກັບຄືນ (Upsampling)
        self.decoder = nn.Sequential(
            nn.ConvTranspose2d(in_channels=64, out_channels=32, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(True),
            # Shape: [Batch, 32, 64, 64]
            
            nn.ConvTranspose2d(in_channels=32, out_channels=16, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(True),
            # Shape: [Batch, 16, 128, 128]
            
            nn.ConvTranspose2d(in_channels=16, out_channels=3, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.Sigmoid() # ໃຊ້ Sigmoid ເພື່ອໃຫ້ຄ່າ Pixel ກັບມາຢູ່ໃນຊ່ວງ 0 ຫາ 1
            # Final Shape: [Batch, 3, 256, 256]
        )

    def forward(self, x):
        z = self.encoder(x)
        reconstructed_x = self.decoder(z)
        return reconstructed_x, z

ຂັ້ນຕອນການ Training ໂມເດລ

ການ Training ຈຳເປັນຕ້ອງໃຊ້ Optimizer ທີ່ດີເຊັ່ນ AdamWeightDecay ຫຼື Adam ເພື່ອປັບຄ່າ Weights ອັດຕະໂນມັດ ຫຼຸດຜ່ອນຄວາມຜິດພາດ.

import torch.optim as optim

# ກຳນົດ Device (ໃຊ້ GPU ຂອງ Server ຖ້າມີ)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# ກຳນົດ Model, Loss Function ແລະ Optimizer
model = PaksongAgriAutoencoder().to(device)
criterion = nn.MSELoss() 
optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5)

# ອະທິບາຍ Training Loop ແບບຫຍໍ້
epochs = 50
for epoch in range(epochs):
    for images in dataloader: # ສົມມຸດວ່າມີ Dataset ຮູບພາບຈາກສວນກາເຟແລ້ວ
        images = images.to(device)
        
        # Forward pass
        reconstructed, latent_space = model(images)
        loss = criterion(reconstructed, images)
        
        # Backward pass ແລະ ປັບແຕ່ງທິດທາງຄວາມຊັນ (Gradient Descent)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
    print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

ເຕັກນິກຂັ້ນສູງ: ການປັບແຕ່ງເພື່ອການໃຊ້ງານຈິງ (Deployment)

ເມື່ອເຮົາສ້າງໂມເດລສຳເລັດແລ້ວ ການນຳໄປຕິດຕັ້ງໃສ່ອຸປະກອນ Edge Devices (ເຊັ່ນ Raspberry Pi ຫຼື Jetson Nano ທີ່ຕິດຢູ່ກັບໂດຣນ) ແມ່ນອີກສິ່ງທ້າທາຍໜຶ່ງ:

ຈຸດສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)

ການສ້າງ Autoencoder ບໍ່ໄດ້ເປັນພຽງແຕ່ທິດສະດີໃນປຶ້ມ ແຕ່ມັນເປັນເຄື່ອງມືຕົວຈິງທີ່ສາມາດແກ້ໄຂບັນຫາການສົ່ງຂໍ້ມູນຂະໜາດໃຫຍ່ໃນພື້ນທີ່ຕົວຈິງຂອງປະເທດລາວໄດ້. ການນຳໃຊ້ Deep Learning ໃນລັກສະນະນີ້ ຈະເປັນການຍົກລະດັບລະບົບໂຄງລ່າງພື້ນຖານດ້ານຂໍ້ມູນຂ່າວສານຂອງບ້ານເຮົາໃຫ້ກ້າວສູ່ມາດຕະຖານໂລກ, ເປັນການປູທາງໃຫ້ກັບກະສິກຳອັດສະລິຍະ, ການເຝົ້າລະວັງໄພທຳມະຊາດ ແລະ ລະບົບເຕັກໂນໂລຊີອື່ນໆໃນອະນາຄົດໄດ້ຢ່າງໝັ້ນຄົງ.