MinAI - Về trang chủ
Lý thuyết
7/2155 phút
Đang tải...

Pooling và Kiến Trúc CNN

Tìm hiểu Pooling Layers, cách ghép nối layers, và dòng chảy dữ liệu trong CNN

1

🎯 Mục tiêu bài học

TB5 min

Trong bài này, bạn sẽ học:

  • Pooling Layer: Max Pooling, Average Pooling
  • Kiến trúc CNN chuẩn: Conv → Pool → FC
  • Feature Hierarchy: Từ low-level đến high-level features
  • Flatten: Chuyển 2D → 1D cho classification
  • Xây dựng CNN hoàn chỉnh với Keras

Pooling giúp CNN "nhìn" ảnh ở nhiều độ phân giải khác nhau và tập trung vào đặc trưng quan trọng nhất.

2

💧 Pooling là gì?

TB5 min

Định nghĩa

Pooling giống như việc "zoom out" bức ảnh - giảm kích thước nhưng giữ lại thông tin quan trọng nhất.

Pooling Layer thực hiện:

  1. Downsampling: Giảm kích thước spatial (H, W)
  2. Tổng hợp: Lấy đại diện cho mỗi vùng
  3. Giữ nguyên depth: Số channels không đổi

Tại sao cần Pooling?

Lý doGiải thích
Giảm tính toánÍt pixels → ít params → nhanh hơn
Kiểm soát overfittingÍt params → ít overfit
Translation InvarianceĐặc trưng dịch chuyển nhẹ → kết quả vẫn tương tự
Tăng receptive fieldNeuron "nhìn" được vùng lớn hơn của ảnh gốc
Pooling Effect224 × 224 × 64InputPooling 2×2, stride 2112 × 112 × 64OutputGiảm 4× pixelsGiữ nguyên channelsGlobal Average Pooling (GAP)Flatten + Dense (cũ)7×7×51225,088FC 4096~100M paramsGAP + Dense (mới)7×7×512GAP512FC 1000512KFlatten: ~100M paramsGAP: ~512K paramsGiảm ~200× tham số!

Checkpoint

Bạn hiểu tại sao cần Pooling?

3

📊 Max Pooling

TB5 min

Cách hoạt động

Max Pooling chọn giá trị lớn nhất trong mỗi window.

Max Pooling (2×2)

Max Pooling (2×2)Input (4×4)1321241356793214maxOutput (2×2)4369max(1,3,2,4) = 4max(2,1,1,3) = 3max(5,6,3,2) = 6max(7,9,1,4) = 9

Đặc điểm

Ưu điểmNhược điểm
Giữ được đặc trưng nổi bậtMất vị trí chính xác
Robust với noiseCó thể mất thông tin quan trọng
Tính toán nhanhKhông có tham số học

Code Keras

python.py
1from tensorflow.keras import layers
2
3# Max Pooling 2×2
4layers.MaxPooling2D(
5 pool_size=(2, 2), # Window size
6 strides=(2, 2), # Thường = pool_size
7 padding='valid' # 'valid' hoặc 'same'
8)
9
10# Ví dụ trong model
11model = keras.Sequential([
12 layers.Conv2D(32, (3, 3), activation='relu'),
13 layers.MaxPooling2D((2, 2)), # Giảm size 1/2
14 layers.Conv2D(64, (3, 3), activation='relu'),
15 layers.MaxPooling2D((2, 2)), # Giảm size 1/2
16])

Checkpoint

Bạn đã hiểu Max Pooling?

4

📈 Average Pooling vs Global Average Pooling

TB5 min

Average Pooling

Average Pooling tính giá trị trung bình của window.

Average Pooling (2×2)

Average Pooling (2×2)Input (4×4)1321241356793214avgOutput (2×2)2.51.7545.25avg(1,3,2,4) = 2.5avg(2,1,1,3) = 1.75avg(5,6,3,2) = 4.0avg(7,9,1,4) = 5.25

Global Average Pooling (GAP)

GAP = Average toàn bộ feature map → 1 số Rất hiệu quả để thay thế Fully Connected layer cuối!

Code Keras

python.py
1from tensorflow.keras import layers
2
3# Average Pooling
4layers.AveragePooling2D(pool_size=(2, 2))
5
6# Global Average Pooling
7layers.GlobalAveragePooling2D()
8
9# So sánh 2 cách kết thúc CNN
10# Cách 1: Flatten (cũ)
11model_old = keras.Sequential([
12 # ... conv layers ...
13 layers.Flatten(), # 7×7×512 = 25,088
14 layers.Dense(4096), # 100M params!
15 layers.Dense(1000)
16])
17
18# Cách 2: GAP (mới, tốt hơn)
19model_new = keras.Sequential([
20 # ... conv layers ...
21 layers.GlobalAveragePooling2D(), # 512
22 layers.Dense(1000) # 512K params
23])

So sánh các loại Pooling

LoạiƯu điểmKhi nào dùng
Max PoolingGiữ feature nổi bậtGiữa các conv layers
Average PoolingSmooth hơnÍt dùng
Global AverageGiảm params đáng kểTrước Dense layer cuối

Checkpoint

Bạn đã hiểu Average và Global Average Pooling?

5

🏗️ Kiến trúc CNN chuẩn

TB5 min

Cấu trúc tổng quan

Kiến trúc CNN chuẩn

Kiến trúc CNN chuẩnInput ImageFeature Extraction32224×22464112×11212856×5625628×28Conv + ReLU + PoolClassificationGlobalAvgPoolDenseSoftmaxOutputClass Probs🐱 🐶224×2247×7Spatial ↓ Channels ↑

Quy tắc thiết kế

Quy tắcChi tiết
Spatial giảm dần224 → 112 → 56 → 28 → 14 → 7
Channels tăng dần64 → 128 → 256 → 512
Tổng pixels ≈ không đổi224×224×3 ≈ 7×7×512
Conv block patternConv → BatchNorm → ReLU → Pool

"Sâu hơn, hẹp hơn" - Kích thước giảm nhưng số channels tăng, giữ tổng thông tin tương đối ổn định.

Checkpoint

Bạn đã nắm được kiến trúc CNN chuẩn?

6

🔬 Hierarchical Feature Learning

TB5 min

Từ Low-level đến High-level Features

CNN Feature Hierarchy & Receptive FieldLOW-LEVELLayer 1-2Cạnh (Edges)Góc (Corners)Màu sắcKết cấu đơn giảnMID-LEVELLayer 3-4Bộ phận (Parts)Hình dạngMẫu (Patterns)Kết cấu phức tạpHIGH-LEVELLayer 5+Đối tượng (Objects)Khuôn mặtCảnh (Scenes)Semantic conceptsReceptive Field tăng dần~full image9×93×3Sâu hơn → RF lớn hơn → "Nhìn" rộng hơn

Visualization

VGG16 Feature Visualization:

LayerHọc đượcVí dụ
Conv1Gabor filtersCạnh, gradient
Conv2-3TexturesLông, vảy, nước
Conv4-5PartsMắt, bánh xe, cửa sổ
FCObjectsMèo, ô tô, nhà

Receptive Field tăng dần

CNN học theo kiểu bottom-up: từ chi tiết nhỏ → ghép thành đặc trưng lớn → nhận ra object

Checkpoint

Bạn hiểu CNN học features theo thứ bậc như thế nào?

7

💻 Xây dựng CNN hoàn chỉnh

TB5 min

CNN cho MNIST (28×28×1)

python.py
1from tensorflow import keras
2from tensorflow.keras import layers
3
4def create_mnist_cnn():
5 """CNN đơn giản cho MNIST"""
6 model = keras.Sequential([
7 # Input: 28×28×1
8
9 # Conv Block 1
10 layers.Conv2D(32, (3, 3), activation='relu',
11 input_shape=(28, 28, 1)),
12 # Output: 26×26×32
13 layers.MaxPooling2D((2, 2)),
14 # Output: 13×13×32
15
16 # Conv Block 2
17 layers.Conv2D(64, (3, 3), activation='relu'),
18 # Output: 11×11×64
19 layers.MaxPooling2D((2, 2)),
20 # Output: 5×5×64
21
22 # Conv Block 3
23 layers.Conv2D(64, (3, 3), activation='relu'),
24 # Output: 3×3×64
25
26 # Classification Head
27 layers.Flatten(), # 3×3×64 = 576
28 layers.Dense(64, activation='relu'),
29 layers.Dropout(0.5),
30 layers.Dense(10, activation='softmax')
31 ])
32
33 return model
34
35model = create_mnist_cnn()
36model.summary()
Expected Output
1Model: "sequential"
2_________________________________________________________________
3Layer (type) Output Shape Param #
4=================================================================
5conv2d (Conv2D) (None, 26, 26, 32) 320
6_________________________________________________________________
7max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
8_________________________________________________________________
9conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
10_________________________________________________________________
11max_pooling2d_1 (MaxPooling) (None, 5, 5, 64) 0
12_________________________________________________________________
13conv2d_2 (Conv2D) (None, 3, 3, 64) 36928
14_________________________________________________________________
15flatten (Flatten) (None, 576) 0
16_________________________________________________________________
17dense (Dense) (None, 64) 36928
18_________________________________________________________________
19dropout (Dropout) (None, 64) 0
20_________________________________________________________________
21dense_1 (Dense) (None, 10) 650
22=================================================================
23Total params: 93,322
24Trainable params: 93,322
25Non-trainable params: 0
26_________________________________________________________________

CNN cho CIFAR-10 (32×32×3)

python.py
1def create_cifar_cnn():
2 """CNN với Batch Normalization cho CIFAR-10"""
3 model = keras.Sequential([
4 # Input: 32×32×3
5
6 # Conv Block 1
7 layers.Conv2D(32, (3, 3), padding='same',
8 input_shape=(32, 32, 3)),
9 layers.BatchNormalization(),
10 layers.Activation('relu'),
11 layers.Conv2D(32, (3, 3), padding='same'),
12 layers.BatchNormalization(),
13 layers.Activation('relu'),
14 layers.MaxPooling2D((2, 2)),
15 layers.Dropout(0.25),
16 # Output: 16×16×32
17
18 # Conv Block 2
19 layers.Conv2D(64, (3, 3), padding='same'),
20 layers.BatchNormalization(),
21 layers.Activation('relu'),
22 layers.Conv2D(64, (3, 3), padding='same'),
23 layers.BatchNormalization(),
24 layers.Activation('relu'),
25 layers.MaxPooling2D((2, 2)),
26 layers.Dropout(0.25),
27 # Output: 8×8×64
28
29 # Conv Block 3
30 layers.Conv2D(128, (3, 3), padding='same'),
31 layers.BatchNormalization(),
32 layers.Activation('relu'),
33 layers.MaxPooling2D((2, 2)),
34 layers.Dropout(0.25),
35 # Output: 4×4×128
36
37 # Classification Head with GAP
38 layers.GlobalAveragePooling2D(), # 128
39 layers.Dense(256, activation='relu'),
40 layers.Dropout(0.5),
41 layers.Dense(10, activation='softmax')
42 ])
43
44 return model
45
46model = create_cifar_cnn()
47model.compile(
48 optimizer='adam',
49 loss='sparse_categorical_crossentropy',
50 metrics=['accuracy']
51)

Checkpoint

Bạn có thể xây dựng CNN hoàn chỉnh?

8

📐 Tính Output Size

TB5 min

Công thức tổng quát

Conv2D: O=WK+2PS+1O = \left\lfloor \frac{W - K + 2P}{S} \right\rfloor + 1

Pooling: O=WKS+1O = \left\lfloor \frac{W - K}{S} \right\rfloor + 1

Ví dụ tính toán

python.py
1def calc_output_size(W, K, P=0, S=1):
2 """
3 Tính output size ca conv/pool
4 W: Input size
5 K: Kernel size
6 P: Padding
7 S: Stride
8 """
9 return (W - K + 2*P) // S + 1
10
11# Ví dụ MNIST CNN
12input_size = 28
13
14# Conv1: 3×3, padding=0
15after_conv1 = calc_output_size(28, 3, 0, 1) # 26
16
17# MaxPool1: 2×2, stride=2
18after_pool1 = calc_output_size(26, 2, 0, 2) # 13
19
20# Conv2: 3×3, padding=0
21after_conv2 = calc_output_size(13, 3, 0, 1) # 11
22
23# MaxPool2: 2×2, stride=2
24after_pool2 = calc_output_size(11, 2, 0, 2) # 5
25
26# Conv3: 3×3, padding=0
27after_conv3 = calc_output_size(5, 3, 0, 1) # 3
28
29print(f"28 → {after_conv1} → {after_pool1} → "
30 f"{after_conv2} → {after_pool2} → {after_conv3}")
Expected Output
128 → 26 → 13 → 11 → 5 → 3

Padding='same' trick

Với padding='same'stride=1:

  • Output size = Input size
  • Keras tự tính padding cần thiết

P=K12P = \frac{K - 1}{2}

Kernel 3×3 → Padding = 1 Kernel 5×5 → Padding = 2

Checkpoint

Bạn có thể tính output size cho bất kỳ CNN nào?

9

🎯 Tổng kết Module 2.1-2.2

TB5 min

Kiến thức đã học

ConceptChi tiết
PoolingGiảm spatial size, giữ features quan trọng
Max PoolingLấy max trong window - phổ biến nhất
Global Average PoolingAverage toàn bộ feature map - thay FC
CNN ArchitectureConv → Pool → Conv → Pool → FC
Feature HierarchyLow-level → Mid-level → High-level

Best Practices

  1. Spatial giảm dần: 224 → 112 → 56 → 28 → 14 → 7
  2. Channels tăng dần: 32 → 64 → 128 → 256
  3. Kernel 3×3 phổ biến nhất (VGG chứng minh)
  4. Batch Normalization sau mỗi Conv
  5. Global Average Pooling thay vì Flatten+Dense

So sánh ANN vs CNN

AspectANNCNN
InputVector 1DImage 2D/3D
ConnectivityFully connectedLocal connected
ParametersRất nhiềuÍt hơn (sharing)
Spatial infoMấtGiữ được
TranslationKhông invariantInvariant

Bài tiếp theo

Chúng ta sẽ học về các Famous CNN Models:

  • LeNet-5, AlexNet, VGGNet
  • ResNet và Skip Connections
  • Inception, DenseNet

🎉 Tuyệt vời! Bạn đã hiểu cách xây dựng CNN hoàn chỉnh!