Bỏ để qua phần 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 băng YOLOv5 🚀 lớp khi chuyển giao học tập. Học chuyển giao là một cách hữu ích để nhanh chóng đào tạo lại 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 lượng ban đầu được đóng băng tại chỗ và phần còn lại của trọng lượng được sử dụng để tính toán tổn thất và được cập nhật bởi trình tối ưu hóa. Điều này đòi hỏi ít tài nguyên hơn so với đào tạo bình 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 giảm độ chính xác được đào tạo cuối cùng.

Trước khi bắt đầu

Sao chép repo và cài đặt requirements.txt trong một PythonMôi trường >=3.8.0 , bao gồm PyTorch>=1,8. Mô hìnhbộ dữ liệu tải xuống tự động từ phiên bản mới nhất YOLOv5 phát hành.

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ẽ được đóng băng bằng cách đặt gradient của chúng về 0 trước khi đào tạo bắt đầu.

# 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
"""

Nhìn vào kiến trúc mô hình chúng ta có thể thấy rằng xương sống 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 với '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 mô hình đầy đủ 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 trên cả hai tình huống trên, cùng với mô hình mặc định (không đóng băng), bắt đầu từ COCO chính thức được đào tạo trướ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 đóng băng tăng tốc độ đào tạo, nhưng làm giảm độ chính xác cuối cùng một chút.

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

Kết quả huấn luyện đóng băng mAP50-95

Bảng kết quả

So sánh sử dụng GPU

Điều thú vị là càng nhiều mô-đun bị đóng băng, bộ nhớ GPU càng cần ít để đào tạo và mức sử dụng GPU càng thấp. Đ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 ở kích thước hình ảnh lớn hơn có thể được hưởng lợi từ việc đóng băng để đào tạo nhanh hơn.

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

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

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

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

Tình trạng dự án

YOLOv5 CI

Huy hiệu này cho biết rằng tất cả YOLOv5 Các bài kiểm tra Tích hợp liên tục (CI) GitHub Actions đã vượt qua thành công. Các bài kiểm tra CI này kiểm tra nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên các khía cạnh chính khác nhau: đào tạo, xác nhận, suy luận, xuất khẩuđ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, với các thử nghiệm được tiến hành 24 giờ một lần và theo mỗi cam kết mới.



Đã tạo 2023-11-12, Cập nhật 2024-01-14
Tác giả: glenn-jocher (4)

Ý kiến