Convolutional Neural Networks

Deep Learning ระดับกลางด้วย PyTorch

Michal Oleszak

Machine Learning Engineer

ทำไมไม่ใช้ linear layer?

สี่เหลี่ยมสีดำแทนภาพระดับสีเทาขนาด 256x256

Deep Learning ระดับกลางด้วย PyTorch

ทำไมไม่ใช้ linear layer?

ภาพระดับสีเทาขนาด 256x256 มีค่าพิกเซลประมาณ 65,000 ค่า

Deep Learning ระดับกลางด้วย PyTorch

ทำไมไม่ใช้ linear layer?

linear layer ที่มี 1,000 นิวรอนประมวลผลค่าพิกเซล 65,000 ค่า

Deep Learning ระดับกลางด้วย PyTorch

ทำไมไม่ใช้ linear layer?

มีการเชื่อมต่อ 65 ล้านจุดระหว่างภาพกับ layer

Deep Learning ระดับกลางด้วย PyTorch

ทำไมไม่ใช้ linear layer?

ภาพสี RGB มีการเชื่อมต่อถึง 200 ล้านจุด

Deep Learning ระดับกลางด้วย PyTorch

ทำไมไม่ใช้ linear layer?

  • Linear layer:
    • เทรนช้า
    • Overfitting
    • ไม่รู้จักรูปแบบเชิงพื้นที่
  • ทางเลือกที่ดีกว่า: convolutional layer!

ภาพแมวที่มุมภาพและนิวรอนที่อ่านส่วนนั้นของภาพ

Deep Learning ระดับกลางด้วย PyTorch

Convolutional layer

ฟิลเตอร์ขนาด 3x3 เลื่อนผ่าน input ขนาด 5x5 เพื่อสร้าง feature map ขนาด 3x3

  • เลื่อนฟิลเตอร์ (พารามิเตอร์) ผ่าน input
  • ที่แต่ละตำแหน่ง ทำการ convolution
  • Feature map ที่ได้:
    • เก็บรักษารูปแบบเชิงพื้นที่จาก input
    • ใช้พารามิเตอร์น้อยกว่า linear layer
  • 1 ฟิลเตอร์ = 1 feature map
  • นำ activation ไปใช้กับ feature map
  • Feature map ทั้งหมดรวมกันเป็น output
  • nn.Conv2d(3, 32, kernel_size=3)
Deep Learning ระดับกลางด้วย PyTorch

Convolution

เมทริกซ์ 3x3 สองอันคูณกันแบบ element-wise แล้วนำค่าทั้งหมดในเมทริกซ์ผลลัพธ์มาบวกรวมกัน

  1. คำนวณ dot product ของ input patch กับฟิลเตอร์
    • ช่องบนซ้าย: 2 × 1 = 2
  2. รวมผลลัพธ์
Deep Learning ระดับกลางด้วย PyTorch

Zero-padding

ภาพขนาด 4x4 ล้อมรอบด้วยเฟรมพิกเซลที่มีค่าเป็นศูนย์

  • เพิ่มเฟรมของศูนย์รอบ input ของ convolutional layer
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • รักษาขนาดเชิงพื้นที่ของ tensor input และ output
  • ทำให้พิกเซลขอบได้รับการประมวลผลเทียบเท่ากับพิกเซลอื่น
Deep Learning ระดับกลางด้วย PyTorch

Max Pooling

เมทริกซ์ 4x4 ที่แบ่งเป็น 4 ส่วนขนาด 2x2 โดยแต่ละส่วนมีสีต่างกัน กลายเป็นเมทริกซ์ 2x2 หลัง max pooling

  • เลื่อน window แบบไม่ทับซ้อนผ่าน input
  • ที่แต่ละตำแหน่ง เก็บเฉพาะค่าสูงสุด
  • ใช้หลัง convolutional layer เพื่อลดขนาดเชิงพื้นที่
  • nn.MaxPool2d(kernel_size=2)
Deep Learning ระดับกลางด้วย PyTorch

Convolutional Neural Network

class Net(nn.Module):
    def __init__(self, num_classes):
        super().__init__()

self.feature_extractor = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Flatten(), )
self.classifier = nn.Linear(64*16*16, num_classes)
def forward(self, x): x = self.feature_extractor(x) x = self.classifier(x) return x
  • feature_extractor: (convolution, activation, pooling) ซ้ำสองรอบแล้ว flatten
  • classifier: linear layer เดี่ยว
  • forward(): ส่งภาพ input ผ่าน feature extractor และ classifier
Deep Learning ระดับกลางด้วย PyTorch

ขนาด output ของ feature extractor

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

แผนภาพแสดงภาพ input ขนาด 3x64x64 ที่ผ่าน conv layer, pooling layer, conv layer อีกชั้น และ pooling layer อีกชั้น

Deep Learning ระดับกลางด้วย PyTorch

ขนาด output ของ feature extractor

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

แผนภาพแสดงภาพ input ขนาด 3x64x64 ที่ผ่าน conv layer, pooling layer, conv layer อีกชั้น และ pooling layer อีกชั้น

Deep Learning ระดับกลางด้วย PyTorch

ขนาด output ของ feature extractor

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

แผนภาพแสดงภาพ input ขนาด 3x64x64 ที่ผ่าน conv layer, pooling layer, conv layer อีกชั้น และ pooling layer อีกชั้น

Deep Learning ระดับกลางด้วย PyTorch

ขนาด output ของ feature extractor

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

แผนภาพแสดงภาพ input ขนาด 3x64x64 ที่ผ่าน conv layer, pooling layer, conv layer อีกชั้น และ pooling layer อีกชั้น

Deep Learning ระดับกลางด้วย PyTorch

ขนาด output ของ feature extractor

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

แผนภาพแสดงภาพ input ขนาด 3x64x64 ที่ผ่าน conv layer, pooling layer, conv layer อีกชั้น และ pooling layer อีกชั้น

Deep Learning ระดับกลางด้วย PyTorch

มาฝึกกันเถอะ!

Deep Learning ระดับกลางด้วย PyTorch

Preparing Video For Download...