Mạng nơ-ron tích chập

Deep Learning nâng cao với PyTorch

Michal Oleszak

Machine Learning Engineer

Vì sao không dùng tầng tuyến tính?

Một hình vuông đen biểu diễn ảnh thang xám 256x256.

Deep Learning nâng cao với PyTorch

Vì sao không dùng tầng tuyến tính?

Ảnh thang xám 256x256 gồm khoảng 65k giá trị điểm ảnh.

Deep Learning nâng cao với PyTorch

Vì sao không dùng tầng tuyến tính?

Một tầng tuyến tính 1000 nơ-ron xử lý 65k giá trị điểm ảnh.

Deep Learning nâng cao với PyTorch

Vì sao không dùng tầng tuyến tính?

Có 65 triệu kết nối giữa ảnh và tầng.

Deep Learning nâng cao với PyTorch

Vì sao không dùng tầng tuyến tính?

Với ảnh màu RGB, có 200 triệu kết nối.

Deep Learning nâng cao với PyTorch

Vì sao không dùng tầng tuyến tính?

  • Tầng tuyến tính:
    • Huấn luyện chậm
    • Dễ overfit
    • Không nhận diện mẫu không gian
  • Giải pháp tốt hơn: tầng tích chập!

Hình có mèo ở góc và các nơ-ron chỉ đọc vùng đó của ảnh

Deep Learning nâng cao với PyTorch

Tầng tích chập

Bộ lọc 3x3 trượt trên đầu vào 5x5 để tạo bản đồ đặc trưng 3x3.

  • Trượt bộ lọc (tham số) trên đầu vào
  • Ở mỗi vị trí, thực hiện tích chập
  • Bản đồ đặc trưng thu được:
    • Giữ cấu trúc không gian của đầu vào
    • Ít tham số hơn tầng tuyến tính
  • Mỗi bộ lọc → một bản đồ đặc trưng
  • Áp dụng kích hoạt lên các bản đồ
  • Gộp tất cả bản đồ thành đầu ra
  • nn.Conv2d(3, 32, kernel_size=3)
Deep Learning nâng cao với PyTorch

Tích chập

Hai ma trận 3x3 được nhân từng phần tử rồi cộng tổng các giá trị thu được.

  1. Tính tích vô hướng giữa ô đầu vào và bộ lọc
    • Ô góc trên-trái: 2 × 1 = 2
  2. Cộng các giá trị lại
Deep Learning nâng cao với PyTorch

Đệm 0 (zero-padding)

Ảnh 4x4 được bao quanh bởi khung điểm ảnh có giá trị 0.

  • Thêm khung điểm ảnh 0 vào đầu vào của tầng tích chập
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • Giữ nguyên kích thước không gian của tensor vào/ra
  • Đảm bảo điểm ảnh biên được xử lý như các điểm khác
Deep Learning nâng cao với PyTorch

Max pooling

Ma trận 4x4 với mỗi góc 2x2 tô màu khác nhau trở thành ma trận 2x2 sau max pooling.

  • Trượt cửa sổ không chồng lấp trên đầu vào
  • Ở mỗi vị trí, giữ giá trị lớn nhất
  • Dùng sau tầng tích chập để giảm kích thước không gian
  • nn.MaxPool2d(kernel_size=2)
Deep Learning nâng cao với PyTorch

Mạng nơ-ron tích chập (CNN)

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: (tích chập, kích hoạt, pooling), lặp 2 lần rồi làm phẳng
  • classifier: một tầng tuyến tính
  • forward(): đưa ảnh vào qua bộ trích xuất đặc trưng và bộ phân loại
Deep Learning nâng cao với PyTorch

Kích thước đầu ra của bộ trích xuất đặc trưng

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)
`

Sơ đồ cho thấy ảnh đầu vào dạng 3x64x64 đi qua một tầng conv, một tầng pooling, thêm một conv và một pooling nữa.

Deep Learning nâng cao với PyTorch

Kích thước đầu ra của bộ trích xuất đặc trưng

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)
`

Sơ đồ cho thấy ảnh đầu vào dạng 3x64x64 đi qua một tầng conv, một tầng pooling, thêm một conv và một pooling nữa.

Deep Learning nâng cao với PyTorch

Kích thước đầu ra của bộ trích xuất đặc trưng

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)
`

Sơ đồ cho thấy ảnh đầu vào dạng 3x64x64 đi qua một tầng conv, một tầng pooling, thêm một conv và một pooling nữa.

Deep Learning nâng cao với PyTorch

Kích thước đầu ra của bộ trích xuất đặc trưng

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)
`

Sơ đồ cho thấy ảnh đầu vào dạng 3x64x64 đi qua một tầng conv, một tầng pooling, thêm một conv và một pooling nữa.

Deep Learning nâng cao với PyTorch

Kích thước đầu ra của bộ trích xuất đặc trưng

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)
`

Sơ đồ cho thấy ảnh đầu vào dạng 3x64x64 đi qua một tầng conv, một tầng pooling, thêm một conv và một pooling nữa.

Deep Learning nâng cao với PyTorch

Ayo berlatih!

Deep Learning nâng cao với PyTorch

Preparing Video For Download...