Bỏ qua nội dung

Chuyển giao việc học với các lớp đông lạnh

📚 Hướng dẫn này giải thích cách đông lạnh YOLOv5 🚀 các lớp khi chuyển giao học tập . Chuyển giao học tập là một cách hữu ích để nhanh chóng đào tạo lại một mô hình trên dữ liệu mới mà không cần phải đào tạo lại toàn bộ mạng. Thay vào đó, một phần trọng số ban đầu được đóng băng tại chỗ và phần còn lại của trọng số được sử dụng để tính toán tổn thất và được trình tối ưu hóa cập nhật. Điều này đòi hỏi ít tài nguyên hơn so với đào tạo thông thường và cho phép thời gian đào tạo nhanh hơn, mặc dù nó cũng có thể dẫn đến việc giảm độ chính xác được đào tạo cuối cùng.

Trước khi bạn bắt đầu

Sao chép kho lưu trữ và cài đặt requirements.txt trong môi trường Python >=3.8.0 , bao gồm PyTorch >=1.8 . Các mô hìnhtập dữ liệu tự động tải xuống từ phiên bản mới nhất YOLOv5 giải phóng .

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

Đóng băng xương sống

Tất cả các lớp phù hợp với train.py freeze danh sách trong train.py sẽ bị đóng băng bằng cách đặt độ dốc của chúng thành 0 trước khi bắt đầu đào tạo.

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

Để xem danh sách tên mô-đun:

for k, v in model.named_parameters():
    print(k)

"""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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

Khi nhìn vào kiến trúc mô hình, chúng ta có thể thấy xương sống của mô hình là các lớp 0-9:

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13

    - [-1, 1, Conv, [256, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 4], 1, Concat, [1]] # cat backbone P3
    - [-1, 3, C3, [256, False]] # 17 (P3/8-small)

    - [-1, 1, Conv, [256, 3, 2]]
    - [[-1, 14], 1, Concat, [1]] # cat head P4
    - [-1, 3, C3, [512, False]] # 20 (P4/16-medium)

    - [-1, 1, Conv, [512, 3, 2]]
    - [[-1, 10], 1, Concat, [1]] # cat head P5
    - [-1, 3, C3, [1024, False]] # 23 (P5/32-large)

    - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

vì vậy chúng ta có thể định nghĩa danh sách đóng băng để chứa tất cả các mô-đun có 'model.0.' - 'model.9.' trong tên của chúng:

python train.py --freeze 10

Đóng băng tất cả các lớp

Để đóng băng toàn bộ mô hình ngoại trừ các lớp tích chập đầu ra cuối cùng trong Detect(), chúng tôi đặt danh sách đóng băng để chứa tất cả các mô-đun có 'model.0.' - 'model.23.' trong tên của chúng:

python train.py --freeze 24

Kết quả

Chúng tôi đào tạo YOLOv5m trên VOC trong cả hai tình huống trên, cùng với một mô hình mặc định (không đóng băng), bắt đầu từ mô hình COCO được đào tạo trước chính thức --weights yolov5m.pt:

train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

So sánh độ chính xác

Kết quả cho thấy việc đóng băng làm tăng tốc độ đào tạo nhưng lại làm giảm độ chính xác cuối cùng một chút.

Kết quả đào tạo đóng băng mAP50

Kết quả đào tạo đóng băng mAP50-95

Kết quả bảng

GPU So sánh sử dụng

Điều thú vị là càng nhiều mô-đun bị đóng băng thì càng ít GPU bộ nhớ là cần thiết để đào tạo, và thấp hơn GPU sử dụng. Điều này chỉ ra rằng các mô hình lớn hơn hoặc các mô hình được đào tạo ở --image-size lớn hơn có thể được hưởng lợi từ việc đóng băng để đào tạo nhanh hơn.

Đào tạo GPU phần trăm bộ nhớ được phân bổ

Đào tạo GPU phần trăm sử dụng bộ nhớ

Môi trường được hỗ trợ

Ultralytics cung cấp nhiều môi trường sẵn sàng sử dụng, mỗi môi trường đều được cài đặt sẵn các thành phần phụ thuộc cần thiết như CUDA , CUDNN , PythonPyTorch để khởi động dự án của bạn.

Tình trạng dự án

YOLOv5 CI

Huy hiệu này cho biết tất cả các thử nghiệm Tích hợp liên tục (CI) YOLOv5 GitHub Actions đều vượt qua thành công. Các thử nghiệm CI này kiểm tra nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên nhiều khía cạnh chính: đào tạo , xác thực , suy luận , xuấtchuẩn . Chúng đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu, với các bài kiểm tra được tiến hành sau mỗi 24 giờ và sau mỗi lần cam kết mới.

📅 Được tạo ra cách đây 1 năm ✏️ Đã cập nhật cách đây 1 tháng

Bình luận