Încerc să rezolv o problemă cu mai multe etichete cu 270 de etichete și am convertit etichetele țintă într-o singură formă codificată la cald. Folosesc BCEWithLogitsLoss (). Deoarece datele de antrenament sunt dezechilibrate, folosesc argumentul pos_weight, dar sunt confuz.

pos_weight (Tensor, opțional) - o pondere de exemple pozitive. Trebuie să fie un vector cu lungimea egală cu numărul de clase.

Trebuie să dau un număr total de valori pozitive ale fiecărei etichete ca tensor sau înseamnă altceva prin greutăți?

calculează

3 Răspunsuri 3

Documentația PyTorch pentru BCEWithLogitsLoss recomandă poz_weight să fie un raport între numărul negativ și numărul pozitiv pentru fiecare clasă.

Deci, dacă len (set de date) este 1000, elementul 0 al codificării dvs. multihot are 100 de numere pozitive, atunci elementul 0 al vectorului pos_weights_ ar trebui să fie 900/100 = 9. Asta înseamnă că pierderea binară încrucișată se va comporta ca și cum setul de date conține 900 de exemple pozitive în loc de 100.

Iată implementarea mea:

Unde class_counts este doar o sumă coloană a eșantioanelor pozitive. L-am postat pe forumul PyTorch și unul dintre dezvoltatorii PyTorch i-a dat binecuvântarea.

Ei bine, de fapt am trecut prin documente și puteți pur și simplu să utilizați într-adevăr pos_weight.

Acest argument dă greutatea eșantionului pozitiv pentru fiecare clasă, prin urmare, dacă aveți 270 de clase, ar trebui să treceți lanterna. Tensor cu formă (270,) care definește greutatea pentru fiecare clasă.

Iată fragmentul modificat marginal din documentație:

Când vine vorba de ponderare, nu există nicio soluție încorporată, dar puteți codifica una singură cu ușurință:

Tensorul trebuie să aibă aceeași lungime cu numărul de clase din clasificarea dvs. cu mai multe etichete (270), fiecare dând greutate pentru exemplul dvs. specific.

Calculul greutăților

Doar adăugați etichete pentru fiecare eșantion din setul de date, împărțiți la valoarea minimă și inversați la final.

Un fel de fragment:

Utilizarea acestei clase de abordare care apare cel mai puțin va da pierderi normale, în timp ce altele vor avea greutăți mai mici de 1 .

Totuși, ar putea provoca o oarecare instabilitate în timpul antrenamentului, deci s-ar putea să doriți să experimentați puțin acele valori (poate transforma jurnalul în loc de liniar?)

S-ar putea să vă gândiți la upsampling/downsampling (deși această operațiune este complicată, deoarece ați adăuga/șterge și alte clase, așa că ar fi nevoie de euristică avansată).