Học chuyển đổi (Transfer Learning) với các Layer bị đóng băng (Frozen Layers) trong YOLOv5
📚 Hướng dẫn này giải thích cách đóng băng (freeze) các layer trong YOLOv5 🚀 khi thực hiện học chuyển đổi. Học chuyển đổi là một kỹ thuật học máy (ML) mạnh mẽ cho phép bạn nhanh chóng huấn luyện lại mô hình trên dữ liệu mới mà không cần huấn luyện lại toàn bộ mạng từ đầu. Bằng cách đóng băng trọng số của các layer ban đầu và chỉ cập nhật tham số của các layer sau, bạn có thể giảm đáng kể yêu cầu về tài nguyên tính toán và thời gian huấn luyện. Tuy nhiên, cách tiếp cận này có thể ảnh hưởng nhẹ đến độ chính xác cuối cùng của mô hình.
Trước khi Bạn Bắt đầu
Trước tiên, hãy clone kho lưu trữ YOLOv5 và cài đặt các phụ thuộc cần thiết được liệt kê trong requirements.txt. Đảm bảo bạn có môi trường Python>=3.8.0 với PyTorch>=1.8 được cài đặt. Các mô hình đã huấn luyện sẵn và tập dữ liệu yêu cầu sẽ được tải xuống tự động từ bản phát hành YOLOv5 mới nhất.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesCách hoạt động của đóng băng layer
Khi bạn đóng băng các layer trong một mạng thần kinh, bạn ngăn các tham số của chúng (trọng số và bias) bị cập nhật trong quá trình huấn luyện. Trong PyTorch, điều này đạt được bằng cách thiết lập thuộc tính requires_grad của các tensor trong layer đó thành False. Kết quả là, các gradient không được tính toán cho các layer này trong quá trình lan truyền ngược, giúp tiết kiệm tính toán và bộ nhớ.
Dưới đây là cách YOLOv5 thực hiện việc đóng băng layer trong script huấn luyện của nó:
# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)] # Define layers to freeze based on module index
for k, v in model.named_parameters():
v.requires_grad = True # Ensure all parameters are initially trainable
if any(x in k for x in freeze):
print(f"Freezing layer: {k}")
v.requires_grad = False # Disable gradient calculation for frozen layersKhám phá kiến trúc mô hình
Việc hiểu cấu trúc của mô hình YOLOv5 là rất quan trọng để quyết định layer nào cần đóng băng. Bạn có thể kiểm tra tên của tất cả các module và tham số của chúng bằng cách sử dụng đoạn code Python sau:
# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
print(name)
"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""Kiến trúc YOLOv5 thường bao gồm một backbone (layer 0-9 trong các cấu hình tiêu chuẩn như YOLOv5s/m/l/x) chịu trách nhiệm trích xuất đặc trưng và một phần đầu (các layer còn lại) thực hiện phát hiện đối tượng.
# Example YOLOv5 v6.0 backbone structure
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]] # Layer 0: Initial convolution (P1/2 stride)
- [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
- [-1, 3, C3, [128]] # Layer 2: C3 module
- [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
- [-1, 6, C3, [256]] # Layer 4: C3 module
- [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
- [-1, 9, C3, [512]] # Layer 6: C3 module
- [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
- [-1, 3, C3, [1024]] # Layer 8: C3 module
- [-1, 1, SPPF, [1024, 5]] # Layer 9: Spatial Pyramid Pooling Fast
# Example YOLOv5 v6.0 head structure
head:
- [-1, 1, Conv, [512, 1, 1]] # Layer 10
- [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
- [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
- [-1, 3, C3, [512, False]] # Layer 13: C3 module
# ... subsequent head layers for feature fusion and detectionCác tùy chọn đóng băng
Bạn có thể kiểm soát layer nào bị đóng băng bằng cách sử dụng đối số --freeze trong lệnh huấn luyện. Đối số này chỉ định chỉ số của module chưa bị đóng băng đầu tiên; tất cả các module trước chỉ số này sẽ bị đóng băng trọng số. Sử dụng model.model (một nn.Sequential) để kiểm tra thứ tự module nếu bạn cần xác nhận chỉ số nào tương ứng với một block cụ thể.
Chỉ đóng băng Backbone
Để đóng băng toàn bộ backbone (từ layer 0 đến 9), đây là việc phổ biến khi tùy chỉnh mô hình cho các lớp đối tượng mới trong khi vẫn giữ lại khả năng trích xuất đặc trưng tổng quát đã học được từ một tập dữ liệu lớn như COCO:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10Chiến lược này hiệu quả khi tập dữ liệu mục tiêu của bạn chia sẻ các đặc trưng hình ảnh cấp thấp tương tự (cạnh, kết cấu) với dữ liệu huấn luyện gốc (ví dụ: COCO) nhưng chứa các danh mục đối tượng khác nhau.
Đóng băng tất cả trừ các Layer phát hiện cuối cùng
Để đóng băng gần như toàn bộ mạng, chỉ để lại các layer convolution đầu ra cuối cùng (một phần của module Detect, thường là module cuối cùng, ví dụ: module 24 trong YOLOv5s) ở trạng thái có thể huấn luyện:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24Cách tiếp cận này hữu ích khi bạn chủ yếu cần điều chỉnh mô hình cho một số lượng lớp đầu ra khác nhau trong khi vẫn giữ nguyên phần lớn các đặc trưng đã học. Nó đòi hỏi ít tài nguyên tính toán nhất cho việc tinh chỉnh.
So sánh hiệu năng
Để minh họa ảnh hưởng của việc đóng băng các layer, chúng tôi đã huấn luyện YOLOv5m trên tập dữ liệu Pascal VOC trong 50 epoch, bắt đầu từ trọng số COCO chính thức (yolov5m.pt). Chúng tôi đã so sánh ba kịch bản: huấn luyện tất cả layer (--freeze 0), đóng băng backbone (--freeze 10), và đóng băng tất cả trừ các layer phát hiện cuối cùng (--freeze 24).
# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10Kết quả về độ chính xác
Kết quả cho thấy việc đóng băng các layer có thể tăng tốc đáng kể quá trình huấn luyện nhưng có thể dẫn đến sự sụt giảm nhẹ trong mAP (mean Average Precision) cuối cùng. Việc huấn luyện tất cả layer thường mang lại độ chính xác tốt nhất, trong khi đóng băng nhiều layer hơn sẽ giúp huấn luyện nhanh hơn với chi phí là hiệu suất có thể thấp hơn.
So sánh mAP50 trong quá trình huấn luyện
So sánh mAP50-95 trong quá trình huấn luyện
*Summary table of performance metrics*
Sử dụng tài nguyên
Việc đóng băng nhiều layer hơn giúp giảm đáng kể yêu cầu bộ nhớ GPU và hiệu suất sử dụng tổng thể. Điều này làm cho học chuyển đổi với các layer bị đóng băng trở thành một lựa chọn hấp dẫn khi làm việc với tài nguyên phần cứng hạn chế, cho phép huấn luyện các mô hình lớn hơn hoặc sử dụng kích thước ảnh lớn hơn so với những gì có thể thực hiện được nếu không đóng băng.
Bộ nhớ GPU được cấp phát (%)
Sử dụng GPU (%)
Khi nào nên sử dụng đóng băng layer
Việc đóng băng layer trong quá trình học chuyển đổi đặc biệt có lợi trong một số tình huống:
- Tài nguyên tính toán hạn chế: Nếu bạn bị hạn chế về bộ nhớ GPU hoặc sức mạnh xử lý.
- Tập dữ liệu nhỏ: Khi tập dữ liệu mục tiêu của bạn nhỏ hơn đáng kể so với tập dữ liệu tiền huấn luyện gốc, việc đóng băng giúp ngăn ngừa quá khớp.
- Tạo mẫu nhanh (Rapid Prototyping): Khi bạn cần nhanh chóng điều chỉnh một mô hình hiện có sang một nhiệm vụ hoặc miền mới để đánh giá ban đầu.
- Miền đặc trưng tương tự: Nếu các đặc trưng cấp thấp trong tập dữ liệu mới của bạn rất giống với các đặc trưng trong tập dữ liệu mà mô hình đã được huấn luyện trước đó.
Khám phá thêm về các sắc thái của học chuyển đổi trong mục thuật ngữ của chúng tôi và xem xét các kỹ thuật như tinh chỉnh siêu tham số để tối ưu hóa hiệu suất.
Môi trường được hỗ trợ
Ultralytics cung cấp nhiều môi trường sẵn sàng sử dụng với các phụ thuộc thiết yếu như CUDA, CuDNN, Python và PyTorch đã được cài đặt sẵn.
- Notebook GPU miễn phí:
- Google Cloud: GCP Quickstart Guide
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Docker Quickstart Guide
Trạng thái dự án
Huy hiệu này xác nhận rằng tất cả các bài kiểm tra Tích hợp liên tục (CI) của YOLOv5 GitHub Actions đều vượt qua thành công. Các bài kiểm tra CI này đánh giá nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên các thao tác chính: huấn luyện, xác thực, suy luận, xuất và điểm chuẩn. Chúng đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu, chạy tự động 24 giờ một lần và trên mỗi commit mã mới.