Feature maps
Feature Maps - Bản đồ đặc trưng trong CNN

Giới thiệu
Khi đi sâu vào kiến trúc của Convolutional Neural Networks (CNNs), một khái niệm then chốt mà chúng ta không thể bỏ qua chính là Feature Maps - hay còn được gọi là Activation Maps. Đây không chỉ là kết quả trung gian trong quá trình xử lý của CNN mà còn là cốt lõi giúp chúng ta hiểu cách thức mạng học và trích xuất thông tin từ dữ liệu đầu vào.
Nhưng feature maps thực sự là gì? Chúng được tạo ra như thế nào? Và tại sao chúng lại quan trọng đến vậy trong các ứng dụng computer vision hiện đại? Hãy cùng khám phá trong bài viết này.
Feature Maps - Bản đồ các đặc trưng
Định nghĩa
Feature map là kết quả của việc áp dụng một filter (kernel) lên ảnh đầu vào hoặc lên một feature map từ lớp trước đó thông qua phép tích chập (convolution). Mỗi feature map đại diện cho sự hiện diện của một đặc trưng cụ thể tại các vị trí khác nhau trong ảnh.
Nói một cách đơn giản, nếu filter được thiết kế để phát hiện đường viền ngang, thì feature map tương ứng sẽ có các giá trị cao tại những vị trí có đường viền ngang trong ảnh gốc.
Quá trình hình thành
Quá trình tạo ra một feature map bao gồm các bước cơ bản sau:
Phép tích chập (Convolution): Filter trượt qua ảnh đầu vào, thực hiện phép nhân ma trận phần tử tại mỗi vị trí.
Tính tổng: Các giá trị thu được từ phép nhân được cộng lại để tạo thành một phần tử trong feature map.
Áp dụng hàm kích hoạt: Thông thường là ReLU (Rectified Linear Unit), giúp thêm tính phi tuyến vào mô hình.
# Ví dụ về cách tạo feature map đơn giản với NumPy
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Ảnh đầu vào (giả lập một ảnh 8x8 đơn giản)
input_image = np.zeros((8, 8))
input_image[2:6, 2:6] = np.ones((4, 4)) # Tạo hình vuông ở giữa
# Filter phát hiện cạnh ngang
horizontal_edge_filter = np.array([
[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]
])
# Áp dụng convolution để tạo feature map
feature_map = signal.convolve2d(input_image, horizontal_edge_filter, mode='valid')
# Áp dụng ReLU
feature_map_relu = np.maximum(0, feature_map)
# Hiển thị kết quả
plt.figure(figsize=(15, 5))
plt.subplot(131)
plt.imshow(input_image, cmap='gray')
plt.title('Ảnh đầu vào')
plt.subplot(132)
plt.imshow(feature_map, cmap='gray')
plt.title('Feature Map (trước ReLU)')
plt.subplot(133)
plt.imshow(feature_map_relu, cmap='gray')
plt.title('Feature Map (sau ReLU)')
plt.tight_layout()
plt.show()Kích thước và số lượng
Kích thước: Kích thước của feature map phụ thuộc vào kích thước ảnh đầu vào, kích thước filter, stride và padding.
Số lượng: Số lượng feature maps trong một lớp bằng với số lượng filters được áp dụng.
Ví dụ, nếu chúng ta có một lớp tích chập với 64 filters 3x3, áp dụng lên ảnh đầu vào kích thước 224x224x3, chúng ta sẽ thu được 64 feature maps riêng biệt.
Vai trò của Feature Maps trong CNN
Feature maps đóng vai trò trung tâm trong cách thức hoạt động của CNN:
1. Trích xuất đặc trưng phân cấp
CNN học các đặc trưng theo cách phân tầng, từ đơn giản đến phức tạp:
Các lớp đầu tiên: Phát hiện các đặc trưng cơ bản như cạnh, góc, gradient màu sắc.
Các lớp giữa: Phát hiện các hình dạng, kết cấu phức tạp hơn.
Các lớp sau cùng: Phát hiện các đặc trưng cấp cao như khuôn mặt, đối tượng, và các mẫu trừu tượng khác.
Ví dụ, trong mạng VGG-16, các feature maps ở lớp đầu tiên chủ yếu phản ánh cạnh và màu sắc, trong khi các feature maps ở lớp conv5 có thể phát hiện các phần của khuôn mặt như mắt, mũi, hoặc các đặc trưng phức tạp khác.
2. Bảo toàn thông tin không gian
Không giống như các mạng neural truyền thống, CNN sử dụng feature maps để bảo toàn thông tin về vị trí không gian của các đặc trưng. Điều này rất quan trọng trong các tác vụ như phát hiện đối tượng và phân đoạn ngữ nghĩa.
3. Giảm số lượng tham số
Nhờ cơ chế chia sẻ trọng số (weight sharing), các filters được áp dụng trên toàn bộ ảnh đầu vào, giúp giảm đáng kể số lượng tham số cần học so với mạng fully connected.
Feature Maps trong các kiến trúc CNN hiện đại
ResNet và Residual Connections
Trong kiến trúc ResNet, các feature maps không chỉ được truyền tuần tự qua các lớp mà còn được cộng trực tiếp với feature maps từ các lớp trước đó thông qua residual connections. Điều này giúp giải quyết vấn đề vanishing gradient khi huấn luyện mạng sâu.
x → [Conv] → [BN] → [ReLU] → [Conv] → [BN] → (+) → [ReLU] → output
↓ ↑
└─────────────────────────────────────────┘
Residual ConnectionMobileNet và Depthwise Separable Convolution
MobileNet sử dụng depthwise separable convolution để tạo ra feature maps hiệu quả hơn về mặt tính toán. Phương pháp này tách phép tích chập thành hai bước: depthwise convolution (áp dụng filter riêng cho mỗi kênh đầu vào) và pointwise convolution (tích chập 1x1 để kết hợp thông tin từ các kênh).
Attention Mechanisms và Feature Maps
Các cơ chế attention như Squeeze-and-Excitation Networks tập trung vào việc tái hiệu chỉnh feature maps dựa trên tầm quan trọng tương đối của chúng:
Squeeze: Tính toán thông tin toàn cục của mỗi feature map thông qua global average pooling
Excitation: Tính toán trọng số cho mỗi feature map
Scaling: Nhân feature maps với trọng số tương ứng
Trực quan hóa Feature Maps
Trực quan hóa feature maps là một kỹ thuật mạnh mẽ giúp chúng ta hiểu điều gì đang xảy ra bên trong CNN. Dưới đây là một ví dụ đơn giản về cách trực quan hóa feature maps trong một mô hình đã huấn luyện:
# Trực quan hóa feature maps với Keras/TensorFlow
import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
# Tải mô hình VGG16 đã huấn luyện
model = VGG16(weights='imagenet', include_top=False)
# Tạo mô hình trích xuất feature maps từ lớp conv3_3
layer_name = 'block3_conv3'
intermediate_model = Model(inputs=model.input,
outputs=model.get_layer(layer_name).output)
# Tải và tiền xử lý ảnh
img_path = 'cat.jpg' # Thay bằng đường dẫn ảnh của bạn
img = image.load_img(img_path, target_size=(224, 224))
img_tensor = image.img_to_array(img)
img_tensor = np.expand_dims(img_tensor, axis=0)
img_tensor = tf.keras.applications.vgg16.preprocess_input(img_tensor)
# Lấy feature maps
feature_maps = intermediate_model.predict(img_tensor)
# Trực quan hóa 64 feature maps đầu tiên
fig, axes = plt.subplots(8, 8, figsize=(16, 16))
for i, ax in enumerate(axes.flat):
if i < 64:
ax.imshow(feature_maps[0, :, :, i], cmap='viridis')
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()Ứng dụng thực tế của Feature Maps
1. Transfer Learning
Các feature maps từ những mạng được huấn luyện trước (như VGG, ResNet, EfficientNet) có thể được sử dụng làm đầu vào cho các mô hình mới. Điều này đặc biệt hữu ích khi chúng ta có ít dữ liệu hoặc tài nguyên tính toán hạn chế.
# Ví dụ về transfer learning với feature maps
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(num_classes, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)
# Đóng băng các lớp của mô hình cơ sở
for layer in base_model.layers:
layer.trainable = False2. Feature Visualization
Kỹ thuật tối ưu hóa để tạo ra các hình ảnh kích hoạt tối đa một neuron cụ thể, giúp hiểu những gì mà CNN thực sự "nhìn thấy".
3. Style Transfer
Trong style transfer, feature maps được sử dụng để trích xuất nội dung và phong cách từ các ảnh khác nhau, sau đó kết hợp chúng để tạo ra ảnh mới với nội dung của ảnh này và phong cách của ảnh khác.
Kết luận
Feature maps không chỉ là kết quả trung gian trong CNN mà còn là cách để chúng ta hiểu sâu hơn về cách thức mạng học và trích xuất thông tin từ dữ liệu. Từ các feature maps đơn giản phát hiện cạnh trong các lớp đầu tiên đến các feature maps phức tạp nhận diện đối tượng trong các lớp sau, chúng tạo thành một hệ thống phân cấp đặc trưng mà CNN sử dụng để "nhìn" thế giới.
Khi tiếp tục thiết kế và tối ưu hóa các mô hình CNN cho các ứng dụng computer vision, việc hiểu rõ về feature maps và cách chúng tương tác qua các lớp khác nhau sẽ giúp chúng ta xây dựng các mô hình mạnh mẽ và hiệu quả hơn.
Last updated