Stride và padding
Stride và Padding trong CNN - Hai Yếu Tố Quyết Định Hiệu Suất Mạng
Giới thiệu
Trong thế giới Convolutional Neural Networks (CNN), mỗi yếu tố thiết kế đều đóng vai trò quan trọng trong việc định hình hiệu suất và khả năng học của mô hình. Hai tham số quan trọng nhưng thường bị bỏ qua là stride và padding. Chúng không chỉ ảnh hưởng đến kích thước đầu ra của mỗi lớp mà còn tác động đến quá trình trích xuất đặc trưng và hiệu suất tổng thể của mạng.
Hôm nay, chúng ta sẽ đi sâu tìm hiểu về hai khái niệm này, hiểu cách chúng hoạt động, và khám phá cách ứng dụng chúng hiệu quả trong các mô hình CNN thực tế.
Stride - "Bước đi" của Kernel
Khái niệm cơ bản
Stride đơn giản là khoảng cách mà kernel "bước đi" sau mỗi lần thực hiện phép tích chập. Giống như cách bạn di chuyển một khuôn cookie trên bề mặt bột, stride quyết định bạn di chuyển khuôn bao xa sau mỗi lần cắt.
Stride = 1: Kernel di chuyển 1 pixel sau mỗi lần tính toán, tạo ra feature map với độ chi tiết cao nhất
Stride = 2: Kernel nhảy 2 pixel mỗi lần, bỏ qua một số vị trí và tạo ra feature map nhỏ hơn
Stride > 2: Thường được sử dụng cho downsampling mạnh, nhưng cũng có thể làm mất thông tin quan trọng
Ảnh hưởng của Stride
Lựa chọn stride có những tác động sau:
1. Kích thước feature map đầu ra
Công thức tính kích thước đầu ra:
Output size = [(Input size - Kernel size) / Stride] + 1Ví dụ với ảnh đầu vào 28x28, kernel 3x3:
Stride = 1 → Output: 26x26
Stride = 2 → Output: 13x13
2. Lượng thông tin được bảo toàn
Stride lớn đồng nghĩa với việc nhiều thông tin không được xử lý. Điều này có thể là:
Ưu điểm: Giảm dư thừa, giảm chi phí tính toán, tăng receptive field hiệu quả
Nhược điểm: Có thể bỏ lỡ các đặc trưng quan trọng, giảm độ chính xác
3. Hiệu suất tính toán
Stride lớn hơn làm giảm kích thước đầu ra, dẫn đến:
Ít phép tính hơn
Ít bộ nhớ cần thiết hơn
Thời gian huấn luyện và suy luận nhanh hơn
Padding - "Đệm" cho Feature Maps
Khái niệm cơ bản
Padding là quá trình thêm các pixel (thường là giá trị 0) xung quanh ảnh đầu vào trước khi áp dụng phép tích chập. Điều này giống như việc thêm một đường viền xung quanh tấm vải trước khi cắt.
Các loại Padding phổ biến
1. Valid Padding (No Padding)
┌───────────────┐
│ │
│ Ảnh gốc │
│ │
└───────────────┘Không thêm pixel nào
Feature map đầu ra luôn nhỏ hơn đầu vào
Mất thông tin ở biên
2. Same Padding
┌─────────────────────┐
│ │
│ ┌───────────┐ │
│ │ │ │
│ │ Ảnh gốc │ │
│ │ │ │
│ └───────────┘ │
│ │
└─────────────────────┘Thêm đủ pixel để giữ kích thước đầu ra bằng đầu vào (với stride=1)
Bảo toàn thông tin không gian
Phổ biến trong nhiều kiến trúc CNN hiện đại
3. Full Padding
┌───────────────────────────┐
│ │
│ │
│ ┌───────────┐ │
│ │ │ │
│ │ Ảnh gốc │ │
│ │ │ │
│ └───────────┘ │
│ │
│ │
└───────────────────────────┘Thêm nhiều lớp padding
Feature map đầu ra lớn hơn đầu vào
Ít được sử dụng trong thực tế
Lợi ích của Padding
Bảo toàn thông tin biên: Đặc biệt quan trọng đối với các đối tượng nhỏ hoặc chi tiết nằm ở rìa ảnh
Kiểm soát kích thước đầu ra: Cho phép xây dựng mạng sâu hơn mà không bị giảm kích thước quá nhanh
Cải thiện hiệu suất: "Same padding" thường giúp mô hình hoạt động tốt hơn vì bảo toàn thông tin không gian
Kết hợp Stride và Padding trong thực tế
Các kịch bản sử dụng phổ biến
Stride=1, Same padding: Lý tưởng cho các lớp trích xuất đặc trưng, không làm giảm kích thước không gian
# Keras/TensorFlow implementation
conv_layer = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')Stride=2, Same padding: Thay thế cho pooling layers, giảm kích thước không gian nhưng vẫn giữ được nhiều thông tin hơn so với max pooling
# Keras/TensorFlow implementation
conv_layer = Conv2D(filters=64, kernel_size=3, strides=2, padding='same', activation='relu')Stride=1, Valid padding: Được sử dụng khi muốn giảm dần kích thước qua mỗi lớp, thường trong các mạng đơn giản
# Keras/TensorFlow implementation
conv_layer = Conv2D(filters=64, kernel_size=3, strides=1, padding='valid', activation='relu')Ví dụ thực tế: ResNet
Trong kiến trúc ResNet nổi tiếng, stride và padding được sử dụng khéo léo:
Các block cơ bản sử dụng stride=1 và same padding để giữ kích thước không gian
Các block giảm kích thước sử dụng stride=2 và same padding để giảm một nửa kích thước không gian
# Ví dụ đơn giản về block ResNet
def resnet_block(x, filters, stride=1):
identity = x
# Lớp tích chập 1
x = Conv2D(filters, kernel_size=3, strides=stride, padding='same')(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
# Lớp tích chập 2
x = Conv2D(filters, kernel_size=3, strides=1, padding='same')(x)
x = BatchNormalization()(x)
# Xử lý shortcut connection khi stride > 1
if stride > 1:
identity = Conv2D(filters, kernel_size=1, strides=stride, padding='same')(identity)
identity = BatchNormalization()(identity)
# Kết hợp đầu ra với identity connection
x = Add()([x, identity])
x = Activation('relu')(x)
return xMẹo thiết kế CNN với Stride và Padding
Giữ thông tin ở các lớp đầu: Sử dụng stride=1 và same padding ở những lớp đầu tiên để bảo toàn chi tiết
Downsampling dần dần: Sử dụng stride=2 ở các lớp sau để giảm kích thước dần dần thay vì giảm đột ngột
Cân nhắc chi phí tính toán: Stride lớn giúp giảm chi phí tính toán nhưng có thể ảnh hưởng đến độ chính xác
Thử nghiệm: Stride và padding thường được coi là hyperparameters, đừng ngại thử nghiệm các cấu hình khác nhau
Hiểu cách Stride và Padding ảnh hưởng đến đầu ra
Cùng xem ví dụ cụ thể về cách stride và padding ảnh hưởng đến kích thước đầu ra:
Giả sử chúng ta có:
Ảnh đầu vào: 32x32
Kernel: 3x3
1
Valid
30x30
Ít nhất
1
Same
32x32
Trung bình
2
Valid
15x15
Ít nhất
2
Same
16x16
Trung bình
Tối ưu hóa CNN của bạn
Stride và padding có thể cải thiện đáng kể hiệu suất mô hình CNN của bạn khi được cấu hình đúng cách:
Tăng tốc quá trình huấn luyện: Sử dụng stride lớn hơn có thể giảm đáng kể thời gian huấn luyện
Cải thiện độ chính xác: Sử dụng padding thích hợp có thể giúp mô hình bắt được các đặc trưng biên quan trọng
Giảm overfitting: Stride lớn hơn có thể hoạt động như một dạng regularization, giảm số lượng tham số
Kết luận
Stride và padding là hai công cụ mạnh mẽ trong bộ công cụ của kỹ sư CNN. Hiểu được cách chúng hoạt động và tác động đến hiệu suất mô hình sẽ giúp bạn thiết kế các mạng CNN hiệu quả hơn, nhanh hơn và chính xác hơn.
Khi thiết kế CNN tiếp theo của bạn, hãy dành thời gian suy nghĩ về stride và padding - những chi tiết nhỏ này có thể tạo nên sự khác biệt lớn trong hiệu suất cuối cùng của mô hình.
Last updated