timm documentation
Scripts
Scripts
Một tập lệnh dọn dẹp cho quá trình huấn luyện, xác thực, suy luận và checkpoint được bao gồm trong thư mục gốc của github. Các tập lệnh hiện chưa được đóng gói trong bản phát hành pip.
Các script huấn luyện và xác thực được phát triển từ các phiên bản ban đầu của PyTorch Imagenet Examples. Tôi đã bổ sung nhiều tính năng đáng kể theo thời gian, bao gồm các cải tiến hiệu năng đặc thù cho CUDA dựa trên NVIDIA’s APEX Examples.
Script huấn luyện
Số lượng các đối số huấn luyện rất lớn và không phải tất cả các tổ hợp tùy chọn (hoặc thậm chí chính các tùy chọn) đều đã được kiểm tra đầy đủ. Đối với thư mục bộ dữ liệu huấn luyện, hãy chỉ định thư mục gốc chứa thư mục train và validation.
Để chạy trên một nút duy nhất, hãy sử dụng torchrun với một tiến trình cho mỗi GPU. Ví dụ, sau khi lưu cấu hình MobileNetV4 thành mobilenetv4.yaml:
torchrun --standalone --nproc_per_node=2 train.py \ --config mobilenetv4.yaml --data-dir /data/imagenet --experiment mobilenetv4-cm
./distributed_train.sh 2 ... là một wrapper tiện lợi bao quanh torchrun.
Với một GPU, hãy dùng python train.py ... và điều chỉnh batch size và learning rate như đã mô tả trong HParams.
`--amp` uses PyTorch native mixed precision, with float16 by default. Use `--amp-dtype bfloat16` on supported hardware. The examples below use native PyTorch AMP and DDP; Apex is not required.
Tệp cấu hình
Bất kỳ đối số huấn luyện nào cũng có thể được cung cấp trong một tệp YAML thông qua --config, được đặt theo tên đối số có gạch dưới (--weight-decay trở thành weight_decay). Các đối số dòng lệnh ghi đè lên tệp. Mỗi lần chạy sẽ ghi bộ đối số hiệu lực đầy đủ vào args.yaml trong thư mục đầu ra của nó, và tệp đó tự nó là một --config hợp lệ, do đó một lần chạy có thể được tái tạo bằng python train.py --config output/train/my-run/args.yaml --experiment my-run-2. Tệp cũng ghi lại output, experiment và resume, nên nếu không có tên thử nghiệm mới, lệnh sẽ ghi vào thư mục gốc, và với --resume auto sẽ tiếp tục lần chạy gốc thay vì lặp lại nó. Các khóa cấu hình được kiểm tra đối chiếu với các đối số của script: các khóa không xác định sẽ cảnh báo, các lựa chọn không hợp lệ hoặc giá trị không phải số cho các đối số số sẽ gây lỗi.
Tiếp tục và các điểm kiểm tra mốc
Mỗi lần chạy sẽ ghi last.pth.tar (luôn là epoch mới nhất, chứa trạng thái của model, optimizer, EMA và AMP scaler), model_best.pth.tar, và lịch sử xếp hạng các tệp checkpoint-N.pth.tar bị giới hạn bởi --checkpoint-hist.
--resume PATHkhôi phục trạng thái đó và tiếp tục lịch trình từ epoch của checkpoint. Đây là cách thông thường để tạo một thư mục thí nghiệm mới từ một checkpoint có sẵn.--resume autotiếp tục tại chỗ: khi đã đặt--outputvà--experiment, lệnh sẽ tiếp tục từlast.pth.tartrong thư mục experiment đó nếu tệp tồn tại, nếu không sẽ bắt đầu một lượt chạy mới. Lệnh tương tự có thể được chạy lại sau khi bị gián đoạn. Lịch sử checkpoint, theo dõi chỉ số tốt nhất vàsummary.csvđều được duy trì nhất quán, nhờ đó việc loại bỏ của--checkpoint-histvàmodel_bestvẫn chính xác qua các lần khởi động lại.--stop-epoch Ndừng lại sauNepoch hoàn thành mà không thay đổi lịch trình được thiết lập bởi--epochs. Epoch cuối luôn được đánh giá và lưu checkpoint, do đó một lần chạy có thể được huấn luyện theo từng đoạn.--save-epochs N [N ...]giữ các bản chụpmilestone-N.pth.tarbất biến (N là số epoch đã hoàn thành) bên ngoài lịch sử xếp hạng. Chúng được liên kết cứng từlast.pth.tarkhi hệ thống tệp cho phép, do đó không tốn thêm dung lượng, và một lần đánh giá sẽ được thực hiện bắt buộc tại các epoch đó.
Cùng nhau, những yếu tố này giúp việc chạy thử nghiệm warmup-stable-decay (WSD) bằng tay trở nên dễ dàng: huấn luyện một phần thân ổn định một lần, sau đó tách các nhánh cooldown độc lập từ các mốc của nó với đầy đủ trạng thái optimizer.
# stable trunk through 30 completed epochs, keeping milestones at 18, 24 and 30. The 1 epoch decay is never reached.
python train.py --config configs/vit.yaml --sched wsd --sched-on-updates --epochs 31 --decay-epochs 1 \
--stop-epoch 30 --save-epochs 18 24 30 --output output/wsd --experiment stable --resume auto
# a 6 epoch 1-sqrt cooldown branched from epoch 24, i.e. a 30 epoch run that shares the first 24 epochs with the trunk
python train.py --config configs/vit.yaml --sched wsd --sched-on-updates --epochs 30 --decay-epochs 6 --lr-decay-fn 1-sqrt \
--resume output/wsd/stable/milestone-24.pth.tar --output output/wsd --experiment decay-p24-d6Phần suy giảm chiếm --decay-epochs cuối cùng của lịch trình, do đó một thời gian làm mát D epoch từ P epoch đã hoàn thành là --epochs P+D --decay-epochs D (trừ --warmup-epochs khỏi --epochs khi sử dụng --warmup-prefix). sweep.py bên dưới tự động hóa điều này.
Quét siêu tham số
sweep.py (PyTorch 2.5 trở lên) lập kế hoạch và thực hiện các lượt quét (sweep) trên bất kỳ tham số nào của train.py, tùy chọn với nhánh WSD. Nó ghi ra một tệp train.py --config hoàn chỉnh cho mỗi job cùng một tệp plan.json chứa đồ thị phụ thuộc giữa các job, sau đó chạy các job sẵn sàng trên một nhóm GPU cục bộ. Kế hoạch được giữ cố định trong khi các worker chạy. Mỗi job là một lệnh gọi train.py thông thường với thư mục thí nghiệm riêng, và mỗi tệp run.sh được tạo ra có thể chạy thủ công hoặc giao cho trình lập lịch khác.
Một lượt quét nhanh không cần tệp spec. Các trục tìm kiếm đến từ --sweep, cấu hình cơ bản đến từ các đối số train.py ở cuối sau --:
python sweep.py run --name lr-wd --sweep lr=1e-4,3e-4,1e-3 --sweep weight_decay=0.05,0.1 --gpus 0,1,2,3 \
-- --model vit_small_patch16_224 --data-dir /data/imagenet --sched cosine --epochs 100 --amp--gpus liệt kê các GPU để chạy, dưới dạng chỉ số vào CUDA_VISIBLE_DEVICES khi biến này được đặt (ví dụ trong một phân bổ Slurm).
Một lượt quét WSD chia sẻ một thân ổn định duy nhất cho mỗi tổ hợp siêu tham số trên nhiều lần cooldown. Với mỗi tốc độ học bên dưới, thân chạy đến 30 epoch với các mốc tại 18, 24 và 30, và một cooldown 6 epoch được phân nhánh từ mỗi mốc, tổng cộng 4 thân và 12 cooldown thay vì 12 lần chạy đầy đủ. Các cooldown bắt đầu ngay khi mốc của chúng tồn tại, trong khi thân tiếp tục chạy. Các tác vụ cần nhiều hơn một GPU được khởi chạy bằng torchrun:
python sweep.py run --name vit-wsd --sweep lr=1e-3,5e-4,2e-4,1e-4 \
--wsd-points 18 24 30 --wsd-decay-epochs 6 --wsd-decay-fn 1-sqrt --gpus-per-job 2 --gpus 0,1 \
-- --model vit_small_patch16_224 --data-dir /data/imagenet --warmup-epochs 3 --warmup-prefix --ampPlanner sở hữu các cờ sau, do đó chúng không thể được chỉ định trên dòng lệnh hoặc được quét.
Trong mỗi lần quét:
--output--experiment--resume--stop-epoch--save-epochs
Ngoài ra, trong một lượt quét WSD:
--sched(có thể được chỉ định làwsd, mặc dù planner sẽ tự động thiết lập nó)--epochs--decay-epochs--lr-decay-fn
Một spec YAML bổ sung tìm kiếm ngẫu nhiên với các phân phối, các trục ghép cặp (zipped), lặp lại trên các seed và một tệp cấu hình cơ sở, xem docstring ở đầu sweep.py để biết schema. python sweep.py plan spec.yaml ghi các cấu hình và graph.dot mà không chạy bất kỳ thứ gì.
Sweep được lưu trong output/sweeps/<name>/, tương đối so với tệp spec (hoặc thư mục làm việc đối với sweep từ dòng lệnh), với một thư mục cho mỗi trial, đặt tên theo các giá trị được sweep (trial-000-lr0.001), mỗi thư mục chứa các thư mục experiment của job. Mọi checkpoint được giữ lại đều là bản sao đầy đủ kèm trạng thái optimizer, vì vậy các job sweep giữ một checkpoint được xếp hạng bên cạnh last.pth.tar và model_best.pth.tar (--checkpoint-hist 1), và các sweep WSD bước lịch trình theo từng update (--sched-on-updates). Việc đặt bất kỳ tham số nào trong cấu hình cơ sở sẽ ghi đè lên chúng. Trong khi nó đang chạy, hoặc sau đó:
python sweep.py status output/sweeps/vit-wsd # job states and progress
python sweep.py results output/sweeps/vit-wsd # ranked endpoint metrics, written to results.csvKết quả so sánh các lần chạy ở cùng ngân sách. Một lượt quét WSD hiển thị một hàng cho mỗi lần chạy và một cột cho mỗi giai đoạn cooldown (p24-d6 là cooldown 6 epoch từ 24 epochs) với chỉ số cuối cùng, trung bình qua các lần lặp lại, và đánh dấu giá trị tốt nhất của mỗi cột. Một lượt quét thông thường được xếp hạng theo chỉ số cuối cùng trong mỗi ngân sách epoch. results.csv chứa mọi công việc, bao gồm các đoạn trunk, cùng với epoch tốt nhất của từng công việc. Nếu không có tập kiểm định, việc xếp hạng sẽ dựa vào tổn thất huấn luyện, và các checkpoint cuối cùng có thể được đánh giá bằng validate.py.
Chạy sweep.py run một lần nữa trên một lượt quét bị gián đoạn sẽ tiếp tục nó: các tác vụ đã hoàn thành sẽ bị bỏ qua và một tác vụ có phần chạy chưa hoàn tất sẽ tiếp tục từ last.pth.tar của riêng nó. Các worker trên nhiều máy chia sẻ thư mục quét có thể mỗi máy chạy một lệnh. Chúng phối hợp thông qua các khóa flock dưới state/locks, mà mọi tiến trình huấn luyện của một tác vụ cũng giữ, nên một tác vụ mà worker của nó đã chết sẽ không được khởi động lại hay lập kế hoạch lại cho đến khi tiến trình cuối cùng của nó thoát. Một lượt quét được chia sẻ bởi nhiều máy cần một hệ thống tệp mà flock của nó hoạt động xuyên suốt tất cả các máy, chẳng hạn như NFSv4 hoặc Lustre được gắn với -o flock. Các điểm gắn chỉ có khóa cục bộ sẽ không phối hợp được giữa các máy, vì vậy hãy kiểm tra khóa từ mỗi client. Dừng một worker (Ctrl-C, hoặc SIGTERM từ scancel) sẽ dừng các tác vụ của nó, và chạy run.sh của một tác vụ bằng tay sẽ bỏ qua cơ chế phối hợp.
Các tệp khóa dưới state/locks là vĩnh viễn: không bao giờ xóa hoặc thay thế chúng để xóa một lượt quét đang bận. Thay vào đó, hãy dừng hoặc chờ các worker và quy trình huấn luyện của nó. Trạng thái running (gone) có nghĩa là khóa huấn luyện đã trống nhưng lần thử chưa được đối soát; hãy chạy một worker để giải quyết nó và tiếp tục công việc chưa hoàn thành. status và results không sửa chữa trạng thái công việc.
Một worker đọc kế hoạch một lần khi nó khởi động. Để thay đổi một sweep, hãy dừng tất cả các worker và tiến trình huấn luyện của nó, lập kế hoạch lại với --force, sau đó khởi động chúng lại. Trước khi bất kỳ job nào bắt đầu, mọi thứ về kế hoạch đều có thể thay đổi. Sau đó, các job huấn luyện của nó chỉ có thể được mở rộng: thêm các trial, cooldown, hoặc điểm WSD sau các điểm hiện có, trong đó mỗi trunk tiếp tục từ nơi nó đã dừng lại. Các thay đổi đối với các job huấn luyện hiện có cần một sweep mới. Các đường dẫn được tạo ra là cố định khi kế hoạch được ghi lại, vì vậy hãy lập kế hoạch lại tại một vị trí mới thay vì di chuyển thư mục sweep.
Nếu quá trình lập kế hoạch bị gián đoạn, các worker sẽ phát hiện các cấu hình hoặc trình khởi chạy từ một lần ghi kế hoạch chưa hoàn chỉnh và từ chối khởi động. Chạy lại lệnh lập kế hoạch ban đầu với --force để hoàn tất hoặc sửa chữa kế hoạch, sau đó khởi động lại các worker. Mỗi lần ghi kế hoạch thành công sẽ xuất bản một thế hệ tương ứng trong plan.json, các cấu hình và các trình khởi chạy; một kế hoạch không thay đổi và hoàn chỉnh sẽ không ghi gì.
Ví dụ, để mở rộng quá trình quét WSD CLI ở trên lên 36 epoch ổn định, hãy dừng các worker và jobs của nó, sau đó lặp lại các đối số lập kế hoạch ban đầu với điểm sau được thêm vào:
python sweep.py plan --force --name vit-wsd --sweep lr=1e-3,5e-4,2e-4,1e-4 \
--wsd-points 18 24 30 36 --wsd-decay-epochs 6 --wsd-decay-fn 1-sqrt --gpus-per-job 2 \
-- --model vit_small_patch16_224 --data-dir /data/imagenet --warmup-epochs 3 --warmup-prefix --amp
python sweep.py run output/sweeps/vit-wsd --gpus 0,1Đối với một lượt quét YAML, hãy thêm điểm vào spec gốc và chạy python sweep.py plan spec.yaml --force trước khi khởi động lại. Giữ wsd.decay_epochs rõ ràng và không thay đổi ([6] trong ví dụ này): giá trị mặc định của nó là 20% của điểm cuối cùng, do đó việc mở rộng chân trời có thể làm thay đổi các cooldown hiện có nếu không được giữ nguyên. Giữ nguyên các ID thử nghiệm hiện có; việc sắp xếp lại hoặc mở rộng các trục lưới có thể đánh số lại các thử nghiệm. Với lr_noise, lịch trình của trunk phụ thuộc vào chân trời của nó, do đó việc thêm một điểm muộn hơn vào một lượt quét đã bắt đầu sẽ yêu cầu một lượt quét mới.
Các cài đặt huấn luyện thuộc về kế hoạch: hãy sử dụng khối train trong spec, hoặc các đối số sau -- khi tạo một CLI sweep. Không có tùy chọn ghi đè cài đặt huấn luyện lúc chạy. Các cài đặt báo cáo, chẳng hạn như chỉ số xếp hạng, và cài đặt đầu ra (checkpoint_hist, log_wandb, wandb_project, wandb_tags) có thể được thay đổi ngoại tuyến bằng --force mà không cần đặt lại trạng thái công việc hoặc thay đổi danh tính huấn luyện. Các cài đặt đầu ra áp dụng cho các lần thử trong tương lai; các công việc đã hoàn thành sẽ không được chạy lại.
sweep.py yêu cầu flock của Unix: đã được kiểm thử trên Linux, dự kiến hoạt động nhưng chưa được kiểm thử trên macOS. Hệ điều hành Windows bản địa không được hỗ trợ; hãy sử dụng WSL2. Các khóa (locks) không tồn tại qua một sự cố phân đoạn mạng kéo dài hơn thời hạn thuê bao NFS: một tiến trình bị ngắt kết nối có thể tiếp tục huấn luyện sau khi mất khóa, do đó một máy khác có thể bắt đầu một lần thử nghiệm chồng chéo.
Kịch bản kiểm định / suy luận
Các script kiểm định và suy luận có cách sử dụng tương tự nhau. Một script xuất ra các chỉ số trên tập kiểm định, script còn lại xuất ra các id lớp topk trong một tệp csv. Hãy chỉ định thư mục chứa các hình ảnh kiểm định, không phải thư mục gốc như trong script huấn luyện.
Để xác thực với trọng số được huấn luyện trước của mô hình (nếu có):
python validate.py --data-dir /imagenet/validation/ --model seresnext26_32x4d --pretrained
Để chạy suy luận từ một checkpoint:
python inference.py --data-dir /imagenet/validation/ --model mobilenetv3_large_100 --checkpoint ./output/train/model_best.pth.tar
Ví dụ huấn luyện
Công thức huấn luyện ImageNet
Các lệnh này tương ứng với các công thức HParams đã chọn, nơi bạn có thể tìm thấy các cấu hình YAML có thể sao chép, các gist mã nguồn và kết quả checkpoint đã công bố. Chúng giả định dữ liệu ImageFolder nằm dưới /data/imagenet/train/ và /data/imagenet/validation/. --batch-size là trên mỗi GPU.
Tốc độ học rõ ràng trong các ví dụ MobileNetV4 và ConvNeXt áp dụng cho kích thước batch toàn cục được nêu; chúng không tự động điều chỉnh nếu số lượng GPU thay đổi.
MobileNetV4 Conv Medium, ImageNet-1k
Từ mnv4_cm_r256_e500_gpu2.yaml: 2 GPU, batch toàn cục 1024, huấn luyện 256px, và 20 epoch warmup + 500 epoch cosine. Trọng số tương ứng là mobilenetv4_conv_medium.e500_r256_in1k.
torchrun --standalone --nproc_per_node=2 train.py --data-dir /data/imagenet \
--model mobilenetv4_conv_medium.e500_r256_in1k --img-size 256 --crop-pct 0.95 --batch-size 512 \
--opt adamw --lr 0.002 --weight-decay 0.1 --clip-grad 5.0 \
--sched cosine --sched-on-updates --epochs 500 --warmup-epochs 20 --warmup-prefix \
--warmup-lr 0 --min-lr 0 --cooldown-epochs 0 \
--aa rand-m8-inc1-mstd1.0 --mixup 0.2 --mixup-prob 0.8 --smoothing 0.1 \
--reprob 0.25 --remode pixel --drop 0.2 --drop-path 0.1 \
--model-ema --model-ema-decay 0.9998 --model-ema-warmup --dist-bn reduce \
--amp --amp-dtype bfloat16 --torchcompile inductor --experiment mobilenetv4-cmSử dụng --amp-dtype float16 nếu GPU của bạn không hỗ trợ bfloat16; --torchcompile inductor là tùy chọn.
ViT Medium với registers, ImageNet-1k
Từ train-vit_medium_reg4-4gpu-in1k.yaml: 4 GPU, global batch 1024, và 600 epochs bao gồm warmup + 10 epochs cooldown. Trọng số tương ứng là vit_medium_patch16_reg4_gap_256.sbb_in1k.
torchrun --standalone --nproc_per_node=4 train.py --data-dir /data/imagenet \
--model vit_medium_patch16_reg4_gap_256.sbb_in1k --model-kwargs fix_init=True --head-init-scale 0 \
--img-size 256 --crop-pct 0.95 --batch-size 256 \
--opt adamw --opt-eps 1e-8 --lr-base 0.0008 --lr-base-size 512 --lr-base-scale sqrt \
--weight-decay 0.07 --clip-grad 5.0 --sched cosine --sched-on-updates \
--epochs 600 --warmup-epochs 20 --warmup-lr 5e-7 --min-lr 5e-7 --cooldown-epochs 10 \
--aa rand-m7-inc1-mstd1.0-n3 --aug-repeats 3 --color-jitter 0 \
--mixup 0.8 --cutmix 1.0 --smoothing 0.1 --reprob 0.2 --remode pixel --drop-path 0.2 \
--seed 0 --amp --amp-dtype float16 --torchcompile inductor --experiment vit-medium-sbbChạy này sử dụng AdamW không có EMA. LR đỉnh của nó xấp xỉ 0.001131 tại global batch 1024.
ConvNeXt Tiny, tinh chỉnh từ ImageNet-12k sang ImageNet-1k
Từ hparams_84_00-convnext_tiny.in12k-args.yaml:
8 GPU, global batch 4096, và 75 epochs bao gồm warmup + 10 epochs cooldown.
Tải trọng số ImageNet-12k và đặt --num-classes 1000 để thay thế bộ phân loại cho fine-tuning.
Bộ checkpoint kết quả là convnext_tiny.in12k_ft_in1k.
torchrun --standalone --nproc_per_node=8 train.py --data-dir /data/imagenet \
--model convnext_tiny.in12k --pretrained --num-classes 1000 \
--img-size 224 --crop-pct 1.0 --batch-size 512 --grad-checkpointing \
--opt adamw --lr 1e-4 --weight-decay 0.05 --layer-decay 0.75 --clip-grad 3.0 \
--sched cosine --epochs 75 --warmup-epochs 10 --warmup-lr 1e-6 --min-lr 5e-7 \
--cooldown-epochs 10 --lr-noise 0.1 1.0 \
--aa rand-m8-inc1-mstd101 --mixup 0.8 --cutmix 1.0 --smoothing 0.1 \
--reprob 0.3 --remode pixel --drop-path 0.1 --model-ema --model-ema-decay 0.9998 \
--amp --amp-dtype float16 --experiment convnext-tiny-ftPhân loại nhiều nhãn
Sử dụng --task multilabel cho các hình ảnh có nhiều nhãn độc lập.
--num-classesđặt kích thước từ vựng.--target-format indices(mặc định) đọc cột target dưới dạng danh sách các ID lớp dương, bắt đầu từ 0. Các nhãn được chuyển đổi thành các target multi-hot dạng float trước khi tạo batch, và các danh sách rỗng đại diện cho các hình ảnh không có nhãn dương.--target-format multihotđọc một vector multi-hot dày đặc có độ dài--num-classes(giá trị bool, int hoặc float trong[0, 1]). Vector được sử dụng nguyên dạng, do đó các giá trị mềm được huấn luyện trực tiếp với BCE và được nhị phân hóa tại 0.5 cho các chỉ số đánh giá. Bản đồ lớp cho các mục tiêu multi-hot phải được đánh chỉ số bằng chỉ số lớp nguồn.
Nếu không có cờ này, mọi danh sách đều được đọc là các chỉ số lớp, vì một vector multi-hot dạng số nguyên không thể phân biệt được với một danh sách chỉ số.
Bộ dữ liệu plant pathology dataset cung cấp định dạng này: một cột image và một cột labels chứa một chuỗi các giá trị ClassLabel. Sáu lớp của nó là complex, frog_eye_leaf_spot, healthy, powdery_mildew, rust và scab. Ví dụ, [5, 1, 0] sẽ trở thành [1, 1, 0, 0, 0, 1].
python train.py --dataset hfds/timm/plant-pathology-2021 \ --task multilabel --target-key labels --num-classes 6 \ --model resnet50 --pretrained --batch-size 32 --epochs 30 \ --opt adamw --lr 1e-4 --weight-decay 0.01 --amp python validate.py --dataset hfds/timm/plant-pathology-2021 \ --task multilabel --target-key labels --num-classes 6 \ --model resnet50 --checkpoint ./output/train/<experiment>/model_best.pth.tar
hfids/timm/plant-pathology-2021 hỗ trợ streaming với cùng định dạng đích. Hỗ trợ Reader:
- Hugging Face
hfdsvàhfidshỗ trợ các mục tiêu đa nhãn. - WebDataset (
wds) hỗ trợ các danh sách ID lớp được lưu trong tệp.jsonphụ của mỗi mẫu, dưới trường có tên được chỉ định bởi--target-key. Nếu không có--target-key, tệp.clssẽ cung cấp một chỉ số lớp duy nhất. - Trình đọc thư mục và tar trả về các chỉ số lớp đơn lẻ.
Các bộ dữ liệu lưu trữ một trường nhị phân cho mỗi nhãn, chẳng hạn như Wake Vision, sử dụng các cài đặt sau:
--target-key person,depiction,body_partchọn một danh sách các trường được phân tách bằng dấu phẩy. Mỗi trường trở thành một lớp theo thứ tự được liệt kê, và các giá trị lớn hơn không được tính là dương. Cách này hoạt động với các trình đọchfds,hfidsvàtfds, cũng như với WebDataset khi các trường nằm trong tệp phụ.json.--num-classesphải bằng với số lượng trường.--target-formatgiữ nguyên giá trị mặc định, vì các khóa nhiều trường tự định nghĩa định dạng của chúng.- Đường dẫn trường lồng nhau sử dụng
/, ví dụ--input-key input --target-key output/pollen_output,output/wasps_outputchobee_datasetcủa TFDS. Các khóa đích đơn lẻ chấp nhận cùng các đường dẫn đó. Một tên trường văn bản chứa/(chẳng hạnimage/filenamecủa TFDS) có độ ưu tiên cao hơn so với một đường dẫn.
Trình nạp dữ liệu Standard và NaFlex hỗ trợ các mục tiêu đa nhãn, bao gồm mixup và cutmix; việc huấn luyện NaFlex hiện tại yêu cầu một tập dữ liệu dạng map như hfds.
Nhiệm vụ được huấn luyện bằng binary cross-entropy with logits. Smoothing mặc định là zero cho huấn luyện multi-label; việc đặt --smoothing s sẽ dịch chuyển mỗi binary target sang target * (1 - s) + 0.5 * s, được áp dụng bởi Mixup/CutMix khi chúng đang hoạt động và bởi loss trong các trường hợp còn lại. Các tùy chọn --bce-sum và --bce-target-thresh hiện có cũng được áp dụng. Distillation và JSD loss không được hỗ trợ bởi nhiệm vụ này.
--loss chọn các loss khác (bce là mặc định cho multi-label):
asl: Asymmetric Loss. Nó tuân theo cùng hành vi làm mịn và Mixup/CutMix như BCE và được tính trong float32 nên an toàn khi dùng--amp.--asl-gamma-negthiết lập focusing cho các mục tiêu âm (mặc định là 4).--asl-gamma-posthiết lập trọng số tập trung cho các mục tiêu dương (mặc định là 1).--asl-clipđặt biên độ xác suất cho các mẫu âm (mặc định là 0.05).--asl-reductionmặc định làbatchmean, cộng loss trên các lớp và lấy trung bình trên batch.sumkhôi phục cách giảm loss ASL ban đầu, cũng cộng trên batch nên tốc độ học hiệu dụng sẽ thay đổi theo kích thước batch.
twoway: Two-way Multi-Label Loss, đối chiếu các logits dương và âm giữa các lớp của mỗi mẫu và các mẫu của mỗi lớp. Logits của nó là điểm xếp hạng, do đó mAP là chỉ số có ý nghĩa; F1 tại ngưỡng sigmoid không được hiệu chuẩn.--twoway-tpđặt nhiệt độ logit dương (mặc định là 4).--twoway-tnđặt nhiệt độ logit âm (mặc định là 1).
zlpr: ZLPR, một phần mở rộng đa nhãn không cần siêu tham số của softmax cross-entropy với ngưỡng logit tích hợp là 0.db: Distribution-Balanced Loss cho dữ liệu đa nhãn có đuôi dài. BCE với trọng số cân bằng lại theo từng mẫu, tính đến sự đồng hiện diện của các nhãn, điều hòa quy phạm chấp nhận âm cho logits, và một số hạng focal. Nó hỗ trợ Mixup/CutMix và làm mượt, với các giá trị mặc định từ cấu hình DB tham chiếu:--db-neg-scaleđặt thang đo logit âm (mặc định là 2).--db-init-biasđặt hệ số dịch logit tiên nghiệm lớp (mặc định là 0.05).--db-focal-gammathiết lập focal focusing (mặc định là 2).--class-statscung cấp số lượng nhãn huấn luyện cần thiết dưới dạng tệp thống kê lớp (bên dưới).
twoway và zlpr cần các mục tiêu nhị phân, do đó chúng không hỗ trợ Mixup/CutMix hoặc --smoothing.
Với phân bố nhãn lệch, bce và asl hỗ trợ hai cờ trọng số:
--loss-pos-weightgán trọng số cho thành phần dương của mỗi lớp, cân bằng giữa các mẫu dương và âm trong cùng một lớp. Điều này cũng làm dịch chuyển các dự đoán về phía dương (tỷ lệ thu hồi cao hơn ở ngưỡng cố định, xác suất hiệu chuẩn kém hơn).--loss-class-weightgán trọng số cho toàn bộ loss của mỗi lớp, cân bằng các lớp với nhau và giữ nguyên độ hiệu chuẩn.
Mỗi cờ nhận trọng số rõ ràng (một giá trị duy nhất, một danh sách phân tách bằng dấu phẩy với một giá trị cho mỗi lớp, hoặc một tệp) hoặc tên phương pháp để suy ra trọng số từ số lượng nhãn huấn luyện được cung cấp bằng --class-stats:
--loss-pos-weight neg_pos: số mẫu âm / số mẫu dương cho mỗi lớp.--loss-class-weight inv_freq: tần số lớp nghịch đảo, được chuẩn hóa để có giá trị trung bình bằng 1.--loss-class-weight effective_num: trọng số class-balanced từ số lượng mẫu hiệu dụng, được chuẩn hóa để có giá trị trung bình bằng 1.
Các tùy chọn trọng số dẫn xuất:
--loss-weight-powerđặt số mũ choneg_posvàinv_freq(mặc định là 1), với 0.5 để tái trọng số hóa mềm hơn theo căn bậc hai.--loss-weight-betađặt beta cho các trọng sốeffective_num(mặc định là 0.999).--loss-weight-maxgiới hạn các trọng số được suy ra.
Cả hai cờ trọng số đều có thể sử dụng cùng một thống kê. class_weights.py đếm các nhãn của một tập dữ liệu, với các tham số tập dữ liệu giống như train.py, và ghi tệp thống kê lớp (--method xem trước trọng số của một phương pháp):
python class_weights.py --dataset hfds/timm/plant-pathology-2021 --split train \
--task multilabel --target-key labels --num-classes 6 --output stats.json
python train.py --dataset hfds/timm/plant-pathology-2021 \
--task multilabel --target-key labels --num-classes 6 \
--class-stats stats.json --loss-pos-weight neg_pos --loss-weight-power 0.5 ...Các cờ đã bị ngừng hỗ trợ:
| Cờ cũ | Thay thế |
|---|---|
--bce-loss | --loss bce |
--jsd-loss | --loss jsd |
--bce-pos-weight | --loss-pos-weight |
Báo cáo kiểm định báo cáo tổn thất BCE, map (độ chính xác trung bình trung bình), micro_f1, macro_f1 và sample_f1. Các chỉ số là phần trăm và sử dụng bộ kiểm định hoàn chỉnh, bao gồm các dự đoán được thu thập trên các rank phân tán. Padding của trình lấy mẫu phân tán có thứ tự bị loại trừ. mAP chính xác giữ các dự đoán trên CPU cho đến khi đánh giá hoàn tất, do đó mức sử dụng bộ nhớ của nó tăng theo số lượng ví dụ và lớp. Các lớp không có mẫu dương đóng góp AP bằng không; các giá trị F1 có mẫu số bằng không sẽ bằng không.
--eval-metric map là mặc định cho việc chọn checkpoint và lập lịch. F1 sử dụng ngưỡng xác suất sigmoid là 0.5, có thể cấu hình bằng --multilabel-threshold; mAP không phụ thuộc vào ngưỡng này. Đầu ra của mô hình vẫn là logits, do đó hãy áp dụng sigmoid để có xác suất độc lập cho từng lớp khi sử dụng mô hình đã huấn luyện.
Công thức ImageNet trong lịch sử
Các lần chạy trước đó vẫn là những tài liệu tham khảo hữu ích cho RMSProp, SGD và huấn luyện AugMix/JSD. Phần cứng và các chỉ số được báo cáo mô tả các lần chạy ban đầu. Đối với các công thức AdamW mới hơn, hãy bắt đầu với các ví dụ ở trên hoặc bộ sưu tập gist.
EfficientNet-B2 với RandAugment - 80,4 top-1, 95,1 top-5
Chạy ban đầu sử dụng hai card Titan RTX với NVIDIA Apex; --amp hiện tại sử dụng AMP native của PyTorch:
./distributed_train.sh 2 --data-dir /imagenet/ --model efficientnet_b2 -b 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.3 --drop-path 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .016MixNet-XL với RandAugment - 80.5 top-1, 94.9 top-5
Chạy ban đầu sử dụng hai card Titan RTX với NVIDIA Apex; --amp hiện tại sử dụng AMP native của PyTorch:
./distributed_train.sh 2 --data-dir /imagenet/ --model mixnet_xl -b 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .969 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.3 --drop-path 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.3 --amp --lr .016 --dist-bn reduceSE-ResNeXt-26-D và SE-ResNeXt-26-T
Các hparams này (hoặc tương tự) hoạt động tốt cho nhiều kiến trúc ResNet, nhìn chung nên tăng số epoch khi kích thước mô hình tăng… ví dụ khoảng 180-200 cho ResNe(X)t50, và 220+ cho các mô hình lớn hơn. Tăng batch size và LR tương ứng cho các GPU mạnh hơn hoặc khi bật AMP. Các tham số này dành cho 2 card 1080Ti:
./distributed_train.sh 2 --data-dir /imagenet/ --model seresnext26t_32x4d --lr 0.1 --warmup-epochs 5 --epochs 160 --weight-decay 1e-4 --sched cosine --reprob 0.4 --remode pixel -b 112EfficientNet-B3 với RandAugment - 81,5 top-1, 95,7 top-5
Việc huấn luyện mô hình này bắt đầu với cùng dòng lệnh như EfficientNet-B2 w/ RA ở trên. Sau gần ba tuần huấn luyện, quá trình đã bị lỗi. Kết quả không có vẻ ấn tượng nên tôi đã khởi động lại việc huấn luyện nhiều lần với các điều chỉnh cho một vài tham số (tăng xác suất RE, giảm rand-aug, tăng ema-decay). Không có gì trông thực sự tốt. Cuối cùng, tôi đã lấy trung bình các checkpoint tốt nhất từ tất cả các lần khởi động lại. Kết quả ở mức trung bình với độ phân giải/crop mặc định nhưng một cách kỳ lạ lại hoạt động tốt hơn nhiều với crop kiểm tra toàn bộ ảnh là 1.0.
EfficientNet-B0 với RandAugment - 77,7 top-1, 95,3 top-5
Michael Klachko đã đạt được các kết quả này bằng dòng lệnh cho B2 được điều chỉnh cho kích thước batch lớn hơn, với tỷ lệ dropout B0 được khuyến nghị là 0.2.
./distributed_train.sh 2 --data-dir /imagenet/ --model efficientnet_b0 -b 384 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .048ResNet50 với tổn thất JSD và RandAugment (sạch + 2x RA augs) - 79.04 top-1, 94.39 top-5
Được huấn luyện trên hai card 1080Ti đời cũ, quá trình này mất khá nhiều thời gian. Kết quả kiểm tra trên ImageNet chỉ tốt hơn một chút so với lần huấn luyện AugMix đầu tiên đạt 78.99, và sự khác biệt này không có ý nghĩa thống kê. Tuy nhiên, các trọng số này cho thấy độ bền vững cao hơn trong các bài kiểm tra với ImageNetV2, ImageNet-Sketch, v.v. Khác với các lần chạy AugMix đầu tiên, tôi đã bật SplitBatchNorm, tắt random erasing trên phần chia sạch (clean split), và tăng xác suất random erasing trên hai đường tăng cường (augmented paths).
./distributed_train.sh 2 --data-dir /imagenet -b 64 --model resnet50 --sched cosine --epochs 200 --lr 0.05 --amp --remode pixel --reprob 0.6 --aug-splits 3 --aa rand-m9-mstd0.5-inc1 --resplit --split-bn --loss jsd --dist-bn reduceEfficientNet-ES (EdgeTPU-Small) với RandAugment - 78.066 top-1, 93.926 top-5
Được huấn luyện bởi Andrew Lavin với 8 thẻ V100. Model EMA không được sử dụng, checkpoint cuối cùng là trung bình của 8 checkpoint tốt nhất trong quá trình huấn luyện.
./distributed_train.sh 8 --data-dir /imagenet --model efficientnet_es -b 128 --sched step --epochs 450 --decay-epochs 2.4 --decay-rate .97 --opt rmsproptf --opt-eps .001 -j 8 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064MobileNetV3-Large-100 - 75.766 top-1, 92.542 top-5
./distributed_train.sh 2 --data-dir /imagenet/ --model mobilenetv3_large_100 -b 512 --sched step --epochs 600 --decay-epochs 2.4 --decay-rate .973 --opt rmsproptf --opt-eps .001 -j 7 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --drop-path 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --amp --lr .064 --lr-noise 0.42 0.9ResNeXt-50 32x4d w/ RandAugment - 79.762 top-1, 94.60 top-5
Các tham số này cũng hoạt động tốt cho SE-ResNeXt-50 và SK-ResNeXt-50 và có thể cả 101. Tôi đã sử dụng chúng cho SK-ResNeXt-50 32x4d mà tôi đã huấn luyện với 2 GPU bằng cách sử dụng LR cao hơn một chút theo kích thước batch hiệu dụng (lr=0.18, b=192 mỗi GPU). Lệnh dòng bên dưới được tinh chỉnh cho việc huấn luyện với 8 GPU.
./distributed_train.sh 8 --data-dir /imagenet --model resnext50_32x4d --lr 0.6 --warmup-epochs 5 --epochs 240 --weight-decay 1e-4 --sched cosine --reprob 0.4 --recount 3 --remode pixel --aa rand-m7-mstd0.5-inc1 -b 192 -j 6 --amp --dist-bn reduce