timm documentation
الخسائر
الخسائر
تحتوي هذه الصفحة على توثيق مرجع واجهة برمجة التطبيقات (API) لخسائر التصنيف المضمنة في timm، بالإضافة إلى نظرة عامة على كيفية إنشائها وإعدادها من خلال مصنع الخسائر.
الاستخدام
تُنشأ دوال الخسارة بالاسم باستخدام create_classification_loss. يحدد multi_label بين أهداف التسمية المفردة (فهارس الفئات، أو التوزيعات الناعمة الكثيفة من Mixup/CutMix)
وأهداف التسمية المتعددة (تسميات ثنائية مستقلة كثيفة بشكل (B, C))، ومع loss_type=None يختار المصنع ce أو bce وفقاً لذلك. تُسبق الحُجج الخاصة بكل دالة خسارة باسم الدالة (asl_*، poly_*، db_*، …)
وتُتجاهل من قِبل دوال الخسارة الأخرى. يرمي المصنع استثناءً عند التوليفات التي لا تدعمها دالة الخسارة، مثل أوزان الفئات
لدوال خسارة غير bce / asl متعددة التسميات، أو حُجج bce_* أو class_counts لدوال خسارة أخرى، أو دالة خسارة مخصصة للتسمية المتعددة فقط دون multi_label (أو دالة خسارة مخصصة للتسمية المفردة فقط مع وجوده).
import torch
import timm
from timm.data import Mixup
from timm.loss import PolyCrossEntropy, create_classification_loss
# Single-label, class index targets. Label smoothing selects LabelSmoothingCrossEntropy.
criterion = create_classification_loss(smoothing=0.1)
loss = criterion(torch.randn(8, 1000), torch.randint(0, 1000, (8,)))
# Mixup/CutMix output dense soft targets with the smoothing already applied, SoftTargetCrossEntropy.
mixup_fn = Mixup(mixup_alpha=0.8, cutmix_alpha=1.0, label_smoothing=0.1, num_classes=1000)
criterion = create_classification_loss(smoothing=0.1, soft_targets=True)
images, target = mixup_fn(torch.randn(8, 3, 224, 224), torch.randint(0, 1000, (8,)))
loss = criterion(torch.randn(8, 1000), target)
# Multi-label, dense (B, C) binary targets. BCE by default, other losses by name.
criterion = create_classification_loss(multi_label=True)
criterion = create_classification_loss('asl', multi_label=True, asl_gamma_neg=4., asl_gamma_pos=1., asl_clip=0.05)
loss = criterion(torch.randn(8, 6), torch.randint(0, 2, (8, 6)).float())
# The training tasks create their criterion with the factory, multi_label is set by the task.
from timm.task import MultiLabelClassificationTask
model = timm.create_model('resnet18', num_classes=6)
task = MultiLabelClassificationTask(model, criterion_kwargs=dict(loss_type='zlpr'))
# Losses can also be constructed directly, note the class defaults can differ from the factory's (below).
criterion = PolyCrossEntropy(epsilon=2.)يُخضع سكربت التدريب (train.py) خياراته إلى مصنع الخسارة على النحو التالي:
| خيار سطر الأوامر أو الشرط | حجة المصنع أو الأثر |
|---|---|
--loss | loss_type |
--task multilabel | multi_label=True |
--smoothing | smoothing، القيمة الافتراضية 0.1 للتدريب على تسمية واحدة و0 للتدريب على تسميات متعددة |
| تمكين Mixup أو CutMix | soft_targets=True |
--asl-* | الحجج asl_* المقابلة |
--poly-* | الحجج poly_* المقابلة |
--twoway-* | الحجج twoway_* المقابلة |
--db-* | الحجج db_* المقابلة |
--bce-sum | bce_sum |
--bce-target-thresh | bce_target_thresh |
--aug-splits | jsd_splits |
--class-stats | عدّادات الفئات لدوال أوزان الفئات أدناه، وclass_counts / num_samples لـdb |
--loss-pos-weight | pos_weight، الذي يُحدَّد بواسطة دوال أوزان الفئات أدناه |
--loss-class-weight | class_weight، يتم حلّه بواسطة دوال أوزان الفئات أدناه |
--loss-weight-* | خيارات لدوال وزن الفئة أدناه |
راجع وثائق التدريب لاستخدام سطر الأوامر.
أنواع الدالة
يحتوي LOSS_TYPES على الأسماء المقبولة من المصنع، بينما يحتوي MULTI_LABEL_LOSS_TYPES على الأسماء التي يمكن استخدامها مع multi_label=True.
loss_type | فئة | الأهداف | ملاحظات |
|---|---|---|---|
ce | nn.CrossEntropyLoss, LabelSmoothingCrossEntropy, SoftTargetCrossEntropy | تصنيف بوسم واحد | دالة Softmax cross-entropy، تعتمد الفئة على smoothing وsoft_targets. الافتراضي هو فئة واحدة |
bce | BinaryCrossEntropy | كلاهما | Sigmoid BCE، الافتراضي للتصنيف متعدد الوسوم. أهداف فهارس الفئات مشفّرة بتشفير واحد-ساخن (one-hot)، bce_target_thresh يحوّل الأهداف الناعمة إلى قيم ثنائية، bce_sum يجمع عبر الفئات قبل أخذ المتوسط عبر الدفعة |
asl | AsymmetricLossMultiLabel, AsymmetricLossSingleLabel | كلاهما | خسارة غير متماثلة، تركيز منفصل للإيجابيات (asl_gamma_pos) والسلبيات (asl_gamma_neg)، هامش احتمال على السلبيات (asl_clip، متعدد التسميات فقط). يتطلب المتغير أحادي التسمية (softmax) أهدافًا بمؤشر الفئة، ولا يدعم Mixup/CutMix |
poly | PolyBinaryCrossEntropy, PolyCrossEntropy | كلاهما | Poly-1، يضيف poly_epsilon * (1 - p_t) إلى BCE / CE، وقيمة 0 تعيد الأمر إلى BCE / CE. يتضمن مصطلحات اختيارية للتركيز (poly_gamma) والتوازن (poly_alpha) للتسميات المتعددة |
jsd | JsdCrossEntropy | تصنيف بوسم واحد | CE على الجزء النظيف + تباعد جينسن-شونان عبر jsd_splits من أجزاء المعالجة (AugMix) |
twoway | TwoWayLoss | تصنيف متعدد الوسوم | دالة خسارة متعددة التسميات ثنائية الاتجاه، درجات الحرارة twoway_tp / twoway_tn، الأهداف الثنائية فقط |
zlpr | ZlprLoss | تصنيف متعدد الوسوم | ZLPR، امتداد متعدد التسميات لـ softmax CE دون معاملات فائقة، للأهداف الثنائية فقط |
db | DistributionBalancedLoss | تصنيف متعدد الوسوم | دالة خسارة متوازنة التوزيع للبيانات ذات الذيل الطويل، وتتطلب class_counts وnum_samples |
تنعيم التسميات والأهداف الناعمة
smoothing افتراضيًا 0 في المصنع. بالنسبة لأهداف التصنيف أحادية التسمية، تحصل فئة الهدف على 1 - s + s / C بينما تحصل الفئات الأخرى على s / C (حيث أن LabelSmoothingCrossEntropy مكافئ لـ nn.CrossEntropyLoss(label_smoothing=s))، بينما يستخدم bce نفس تنعيم one-hot لأهداف فهارس الفئات. أما بالنسبة لأهداف التصنيف متعددة التسميات، فإن كل تسمية ثنائية تُحرَّك نحو 0.5، أي y * (1 - s) + 0.5 * s.
يطبّق timm.data.Mixup خاصية label_smoothing أثناء الخلط ويخرج أهدافاً كثيفة (مع multi_label=True يخلط وينعّم الأهداف الكثيفة متعددة التسميات). أنشئ الدالة الخاسرة مع soft_targets=True في هذه الحالة:
- يصبح
ceSoftTargetCrossEntropy. - لا تُنعّم
bce،aslمتعدد التسميات،polyوdbالأهداف مرة أخرى. - يُطلق التصنيف أحادي التسمية
aslاستثناءً عند استخدامsoft_targets. twoway/zlprترفع خطأً عند استخدامsoft_targetsأوsmoothingلأنها تُحوّل الأهداف إلى قيم ثنائية عند 0.5.
تتمتع الفئات بقيم افتراضية خاصة بها عند إنشائها مباشرة، حيث تعتمد BinaryCrossEntropy وLabelSmoothingCrossEntropy وJsdCrossEntropy على smoothing=0.1 بينما تعتمد AsymmetricLossSingleLabel على eps=0.1 (وهو تنعيم التسميات الخاص بها).
وزن الفئات
يضرب pos_weight الحد الموجب لكل فئة، مما يحقق التوازن بين القيم الموجبة والسالبة داخل الفئة الواحدة. بينما يضرب class_weight إجمالي دالة الخسارة لكل فئة، مما يحقق التوازن بين الفئات فيما بينها. وكلاهما يقبل قيمة واحدة أو قيمة واحدة لكل فئة، ويدعمه كل من bce وasl متعدد الوسوم. يمكن تقديمها بشكل صريح أو اشتقاقها من عدد القيم الموجبة لكل فئة باستخدام compute_class_weights، الذي يعيد حجة الخسارة التي تخصها الأوزان، بالإضافة إلى الأوزان نفسها. تُحتسب الفئات التي لا تحتوي على قيم موجبة على أنها تحتوي على قيمة واحدة، ويحدد max_weight الحد الأقصى للأوزان النهائية.
method | الحُجّة | الأوزان لفئة تحتوي على n إيجابيات |
|---|---|---|
neg_pos | pos_weight | ((num_samples - n) / n) ** power |
inv_freq | class_weight | (num_samples / n) ** power، مُعايَرةً إلى متوسط يساوي 1 |
effective_num | class_weight | (1 - beta) / (1 - beta ** n) (class-balanced)، مُطبَّعة بحيث يكون متوسطها 1 |
توجد الطرق في CLASS_WEIGHT_METHODS، ويربط CLASS_WEIGHT_METHOD_KINDS كل طريقة بحجتها الخاصة بالخسارة.
load_class_statsيقرأ العدّات من ملف JSON يحتوي على مدخلاتpos_countsوnum_samples، كما كُتبت بواسطةclass_weights.pyفي جذر المستودع.- يقوم
load_class_weightsبتحليل الأوزان الصريحة (رقم، أو نص مفصول بفواصل، أو قائمة، أو ملف JSON / نص). - يقبل
resolve_class_weightsإما اسم طريقة أو أوزانًا صريحة، كما يفعلtrain.pyمع أعلامه.
تأخذ خسارة db التعدادات مباشرةً.
import torch
from timm.loss import compute_class_weights, create_classification_loss, resolve_class_weights
pos_counts = [120, 3400, 560, 45, 980, 2100] # positives per class
num_samples = 5000
kind, weights = compute_class_weights(pos_counts, num_samples, method='neg_pos', power=0.5) # kind == 'pos_weight'
criterion = create_classification_loss(multi_label=True, pos_weight=weights)
# Method names (w/ class stats) or explicit weights, class_stats can be loaded w/ load_class_stats('stats.json')
class_stats = (torch.tensor(pos_counts), num_samples)
class_weight = resolve_class_weights('effective_num', 'class_weight', class_stats=class_stats, beta=0.999)
pos_weight = resolve_class_weights('2.0', 'pos_weight')
criterion = create_classification_loss('asl', multi_label=True, class_weight=class_weight, pos_weight=pos_weight)
criterion = create_classification_loss('db', multi_label=True, class_counts=pos_counts, num_samples=num_samples)ملاحظات حول الخسارة
الدقة. تُحسب دوال الخسارة متعددة التسميات ASL وPoly-1 وDB وTwo-way وZLPR بدقة
float32بغض النظر عن نوع بيانات القيم اللوجستية (logits)، إذ إن احتمالات ASL منخفضة الدقة (float16) ستؤدي إلى انخفاض قيمة (underflow) في حدّ السجل (log clamp).الاختزال. يدعم ASL متعدد التسميات قيم
asl_reductionالتالية:القيمة فوق الفئات عبر الدفعة ملاحظات batchmeanالمجموع المتوسط افتراضي sumالمجموع المجموع خفض ASL الأصلي؛ الخسارة تتناسب مع حجم الدفعة meanالمتوسط المتوسط مثل BCE يجمع ASL ذو التسمية الواحدة على الفئات ويحسب المتوسط على الدفعة، ولا يقبل المصنع سوى
batchmeanله. أماbceوpolyمتعدد التسميات وdbفتحسب المتوسط على الدفعة والفئات (بينماbce_sumيجمع على الفئات في حالةbce).يقارن Two-way بين أصعب قيمة سالبة (logit) وأصعب قيمة موجبة (logit) عبر فئات كل عينة وعبر العينات لكل فئة، حيث تساهم فقط العينات/الفئات ذات القيمة الموجبة. قيماتها (logits) هي درجات ترتيب وليست احتمالات مُعايرة عبر دالة سيجمويد، لذا فإن المقاييس المعتمدة على عتبة (مثل F1) لا معنى لها، ويُفضَّل استخدام mAP.
يدفع ZLPR كل قيمة لوغيت إيجابية فوق كل قيمة لوغيت سالبة مع اعتبار 0 عتبة القرار، بحيث تتنبأ القيم التي لوغيتها > 0 (سغمويد > 0.5) بالإيجابيات.
تضرب أوزان DB كل حد (عينة، فئة) بنسبة احتمال أخذ العينة على مستوى الفئة إلى احتمال أخذ العينة على مستوى الحالة، مع مراعاة التواجد المشترك للتسميات، وتُزاح القيم اللوجستية (logits) بواسطة مسبق الفئة (
db_init_bias) وتُضبط القيم اللوجستية السالبة (db_neg_scale). وتُثبَّت العدّادات ضمن المدى[1, num_samples - 1]. ومعاملات خريطة إعادة التوازن والتوازن البؤري (focal balance) هي حُجج للفئة، ولا تُعرَض عبر المصنع (factory).يتوقع JSD الدفعة على شكل
jsd_splitsأقسام متساوية، حيث تكون الصور النظيفة أولاً (كما يرتبfast_collateعيناتAugMixDataset)، بينما يستخدم حد CE القسم النظيف فقط. وزن JSD (alpha=12) هو معامل للفئة.
واجهة برمجة التطبيقات
دوال المصنع
timm.loss.create_classification_loss
< source >( loss_type: typing.Optional[str] = Nonemulti_label: bool = Falsesmoothing: float = 0.0soft_targets: bool = Falseclass_weight: typing.Union[torch.Tensor, float, typing.Sequence[float], NoneType] = Nonepos_weight: typing.Union[torch.Tensor, float, typing.Sequence[float], NoneType] = Nonebce_target_thresh: typing.Optional[float] = Nonebce_sum: bool = Falseasl_gamma_pos: float = 1.0asl_gamma_neg: float = 4.0asl_clip: typing.Optional[float] = 0.05asl_reduction: str = 'batchmean'poly_epsilon: float = 2.0poly_gamma: float = 0.0poly_alpha: typing.Optional[float] = Nonejsd_splits: int = 0twoway_tp: float = 4.0twoway_tn: float = 1.0class_counts: typing.Union[torch.Tensor, typing.Sequence[float], NoneType] = Nonenum_samples: typing.Optional[int] = Nonedb_neg_scale: float = 2.0db_init_bias: float = 0.05db_focal_gamma: float = 2.0 )
المعاملات
- loss_type — أحد LOSSTYPES، حيث تختار القيمة None نوع ‘bce’ للأهداف متعددة التسميات و ‘ce’ للأهداف أحادية التسمية. ‘ce’: إنتروبيا التقاطع مع softmax (مع تنويعات تنعيم التسمية / الأهداف الناعمة عند الحاجة)، ‘bce’: إنتروبيا التقاطع الثنائية (bce args)، ‘asl’: Asymmetric Loss، باستخدام AsymmetricLossMultiLabel للأهداف متعددة التسميات، وإلا softmax AsymmetricLossSingleLabel، أهداف فهارس الفئات فقط، بدون Mixup/CutMix (asl_ args)، ‘poly’: Poly-1 loss، باستخدام PolyBinaryCrossEntropy (sigmoid) للأهداف متعددة التسميات، وإلا softmax PolyCrossEntropy (poly* args)، ‘jsd’: تباعد Jensen-Shannon + CE على تقسيمات المعالجة، أحادي التسمية (jsd_splits)، ‘twoway’: Two-way loss، أهداف متعددة التسميات ثنائية فقط (twoway args)، ‘zlpr’: ZLPR loss، أهداف متعددة التسميات ثنائية فقط، ‘db’: Distribution-Balanced loss، متعددة التسميات (classcounts, num_samples, db args).
- multi_label — الأهداف هي تسميات ثنائية مستقلة كثيفة على شكل (B, C).
- smoothing — معامل تنعيم التسميات. يتم تجاهله عند تعيين soft_targets، لأن Mixup/CutMix يطبقانه بالفعل أثناء إنتاج التسميات الناعمة.
- soft_targets — تصل الأهداف كتوزيعات ناعمة كثيفة من Mixup/CutMix بدلاً من فئات الفهرسة.
- class_weight — وزن الخسارة لكل فئة، قيمة واحدة أو قيمة لكل فئة (‘bce’ و ‘asl’ متعددة التسميات).
- pos_weight — وزن الحد الموجب، قيمة واحدة أو قيمة لكل فئة (‘bce’ و‘asl’ متعددة التسميات).
- bce_target_thresh — تحويل الأهداف الناعمة إلى قيم ثنائية إذا تجاوزت هذه القيمة (لـ ‘bce’ فقط).
- bce_sum — جمع الخسارة عبر الفئات قبل أخذ المتوسط عبر الدفعة (لـ ‘bce’ فقط).
- asl_gamma_pos — معامل التركيز للأهداف الإيجابية (لـ ‘asl’ فقط).
- asl_gamma_neg — معامل التركيز للأهداف السلبية (لـ ‘asl’ فقط).
- asl_clip — هامش الاحتمال المُزاح نحو القيم السالبة، حيث يُعطَّل بتعيين None أو 0 (لوسم متعدد التسميات ‘asl’ فقط).
- asl_reduction — ‘batchmean’ (المجموع عبر الفئات، والمتوسط عبر الدفعة)، أو ‘sum’ (ASL الأصلي)، أو ‘mean’ (لـ ‘asl’ متعدد التسميات فقط، بينما يستخدم ASL أحادي التسمية ‘batchmean’ دائمًا).
- poly_epsilon — معامل Poly-1، حيث يُقلل القيمة 0 إلى CE / BCE (لـ ‘poly’ فقط).
- poly_gamma — معامل التركيز، حيث يُعطَّل الحدّ البؤري عند القيمة 0 (لوسم متعدد التسميات ‘poly’ فقط).
- poly_alpha — وزن التوازن بين الإيجابي والسلبي، تعطيله عند القيمة None (لوسم متعدد التسميات ‘poly’ فقط).
- jsd_splits — عدد تقسيمات المعالجة، يجب أن يكون > 1 (لـ ‘jsd’ فقط).
- twoway_tp — درجة حرارة اللوجيت الإيجابية (لوضع ‘twoway’ فقط).
- twoway_tn — درجة حرارة اللوجيت السالبة (لـ ‘twoway’ فقط).
- class_counts — عدد عينات التدريب الإيجابية لكل فئة (لـ ‘db’ فقط).
- num_samples — عدد عينات التدريب التي تم حساب class_counts عليها (لـ ‘db’ فقط).
- db_neg_scale — مقياس اللوجيت المتسامح مع القيم السالبة، تعطيل القيمة 1 (لـ ‘db’ فقط).
- db_init_bias — معامل إزاحة اللوجيت المسبق للفئة، تعطيل القيمة 0 (لـ ‘db’ فقط).
- db_focal_gamma — معامل التركيز، حيث يؤدي ضبطه على 0 إلى تعطيل الحد البؤري (‘db’ فقط).
أنشئ معيار التدريب لمهمة تصنيف.
دوال وزن الفئات
timm.loss.compute_class_weights
< source >( pos_counts: typing.Union[torch.Tensor, typing.Sequence[float]]num_samples: intmethod: str = 'neg_pos'power: float = 1.0beta: float = 0.999max_weight: typing.Optional[float] = None )
المعاملات
- pos_counts — عدد العينات الإيجابية لكل فئة (تكرار الفئة في حالة الأهداف أحادية التسمية).
- num_samples — عدد العينات التي تم أخذ العدّ عليها.
- method — أحد ‘neg_pos’: pos_weight = (negatives / positives) power، يوازن بين المصطلحات الموجبة والسالبة لكل فئة، ‘inv_freq’: class_weight تتناسب مع (num_samples / positives) power، متوسطها 1، ‘effective_num’: class_weight متوازنة للفئات مشتقة من العدد الفعلي للعينات (1 - beta ** n) / (1 - beta)، https://arxiv.org/abs/1901.05555، متوسطها 1.
- power — أُسّ ‘neg_pos’ و ‘inv_freq’، القيمة 0.5 تعطي إعادة وزنٍ أكثر نعومةً (جذر تربيعي).
- beta — معامل ضبط فائق لعدد العناصر الفعّالة الخاص بـ ‘effective_num’.
- max_weight — الحد الأقصى المطبَّق على الأوزان النهائية.
احسب أوزان الخسارة لكل فئة من أعداد التسميات الإيجابية.
تُعامل الفئات التي لا تحتوي على أي قيم إيجابية على أنها تحتوي على قيمة واحدة، وتُحدَّد كل قيمة وزن بـ max_weight إذا تم ضبطها.
timm.loss.load_class_stats
< source >( path: typing.Optional[str] )
حمّل عدد العينات الإيجابية لكل فئة وعدد العينات من ملف الإحصاءات class_weights.py.
timm.loss.load_class_weights
< source >( value: typing.Union[str, float, typing.Sequence[float], torch.Tensor, NoneType]key: str = 'class_weight' )
تحليل أوزان الخسارة من رقم، أو قائمة مفصولة بفواصل، أو من ملف.
الملفات بصيغة JSON (قائمة، أو كائن يحتوي على القائمة تحت key، كما يكتبها class_weights.py) أو نص بأرقام مفصولة بفواصل أو مسافات بيضاء.
timm.loss.resolve_class_weights
< source >( value: typing.Union[str, float, typing.Sequence[float], torch.Tensor, NoneType]kind: str = 'class_weight'class_stats: typing.Optional[typing.Tuple[torch.Tensor, int]] = Nonepower: float = 1.0beta: float = 0.999max_weight: typing.Optional[float] = None )
المعاملات
- value — طريقة ضمن CLASS_WEIGHT_METHODS، أو أوزان صريحة لـ load_class_weights().
- kind — حجة الخسارة التي يتم حلها، ‘pos_weight’ أو ‘class_weight’.
- class_stats — (counts, num_samples) من load_class_stats()، مطلوب لأسماء الطرق.
- power — راجع compute_class_weights().
- beta — راجع compute_class_weights().
- max_weight — راجع compute_class_weights().
حلّ أوزان الخسارة المُعطاة باسم دالة (تُحسب من إحصاءات الفئة) أو كأوزان صريحة.
فئات دالة الخسارة للتصنيف أحادي التسمية
فقدان NLL مع تنعيم التسميات.
class timm.loss.AsymmetricLossSingleLabel
< source >( gamma_pos = 1gamma_neg = 4eps: float = 0.1reduction = 'mean' )
انحراف جينسن-شونسن + خسارة الانتروبيا المتقاطعة
بناءً على التنفيذ هنا: https://github.com/google-research/augmix/blob/master/imagenet.py من الورقة البحثية: ‘AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty - https://arxiv.org/abs/1912.02781
تم بناؤه بواسطة / حقوق النشر 2020 روس وايتمان
فئة timm.loss.PolyCrossEntropy
< source >( epsilon: float = 2.0smoothing: float = 0.0reduction: str = 'mean' )
تقاطع الإنتروبيا المتقاطعة لـ softmax متعدد العناصر، CE + epsilon * (1 - p_t)، لتصنيف التسمية المفردة.
هو مجموع احتمالات softmax المرجّحة بالأهداف sum_c(t_c * p_c)، لذا فإن تنعيم التسميات والأهداف الناعمة (Mixup/CutMix) تنطبق على كلا الحدين، كما في المرجع.
forward
< source >( x: Tensortarget: Tensor )
فئات خسارة التصنيف متعدد الوسوم
فئة timm.loss.BinaryCrossEntropy
< source >( smoothing = 0.1target_threshold: typing.Optional[float] = Noneweight: typing.Optional[torch.Tensor] = Nonereduction: str = 'mean'sum_classes: bool = Falsepos_weight: typing.Union[torch.Tensor, float, NoneType] = Nonesmooth_dense: bool = False )
المعاملات
- smoothing — تنعيم التسميات المطبّق أثناء ترميز الأهداف ذات الفهرس بشكل أحادي. يُفترض أن تكون الأهداف الكثيفة مُنعّمة مسبقًا (مثلًا بواسطة Mixup/CutMix) ما لم يتم تعيين smooth_dense.
- target_threshold — تحويل الأهداف (الناعمة) إلى قيم ثنائية إذا تجاوزت هذه القيمة.
- weight — وزن إعادة التحجيم لكل فئة.
- reduction — تقليل الخسارة.
- sum_classes — جمع الخسارة عبر الفئات قبل أخذ المتوسط عبر الدفعة.
- pos_weight — وزن الفئة الإيجابية.
- smooth_dense — يُطبَّق التنعيم أيضًا على الأهداف التي تطابق بالفعل شكل القيم اللوجستية (التصنيف متعدد الوسوم)، حيث يُحرَّك كل هدف ثنائي نحو 0.5.
BCE مع خيار one-hot من الأهداف الكثيفة، تنعيم التسميات، تحديد العتبة ملاحظة للتجارب التي تقارن بين CE و BCE مع تنعيم التسميات، قد يُحذف
class timm.loss.AsymmetricLossMultiLabel
< source >( gamma_neg: float = 4gamma_pos: float = 1clip: typing.Optional[float] = 0.05eps: float = 1e-08disable_torch_grad_focal_loss: bool = Falsesmoothing: float = 0.0reduction: str = 'batchmean'weight: typing.Optional[torch.Tensor] = Nonepos_weight: typing.Union[torch.Tensor, float, NoneType] = None )
المعاملات
- gamma_neg — معامل التركيز للأهداف السلبية.
- gamma_pos — معامل التركيز للأهداف الإيجابية.
- clip — هامش الاحتمال المُزاح على القيم السالبة (قص غير متماثل)، ويُعطَّل إذا كان None أو 0.
- eps — الحد الأدنى لاحتمال يُثبَّت قبل أخذ اللوغاريتم.
- disable_torch_grad_focal_loss — لا تُنفّذ التدرّج العكسي عبر أوزان التركيز.
- smoothing — تنعيم التسميات، يُقرّب كل هدف (كثيف، ثنائي مستقل) نحو 0.5.
- reduction — ‘batchmean’ يجمع على الفئات ويحسب المتوسط على الدفعة، ‘sum’ يجمع على الدفعة والفئات (اختزال ASL الأصلي، يتناسب مع حجم الدفعة)، ‘mean’ يحسب المتوسط على الدفعة والفئات، ‘none’ يحافظ على خسارة العنصر الواحد.
- weight — وزن إعادة التحجيم لكل فئة.
- pos_weight — وزن الحد الموجب، قيمة واحدة أو قيمة لكل فئة.
دالة الخسارة غير المتماثلة (ASL) لتصنيف التسميات المتعددة، https://arxiv.org/abs/2009.14119
forward
< source >( x: Tensory: Tensor )
فئة timm.loss.PolyBinaryCrossEntropy
< source >( epsilon: float = 2.0gamma: float = 0.0alpha: typing.Optional[float] = Nonesmoothing: float = 0.0reduction: str = 'mean' )
المعاملات
- epsilon — معامل Poly-1، حيث 0 تعني BCE العادي (أو خسارة focal).
- gamma — معامل التركيز، حيث يؤدي ضبطه على 0 إلى تعطيل الحد البؤري.
- alpha — وزن التوازن الموجب/السالب، تعطيله عند تعيينه بقيمة None.
- smoothing — تنعيم التسميات، يُقرّب كل هدف (كثيف، ثنائي مستقل) نحو 0.5.
- reduction — ‘mean’ يحسب المتوسط عبر الدفعة والفئات (كما في BCE)، و‘batchmean’ يجمع عبر الفئات ويحسب المتوسط عبر الدفعة، و‘sum’ يجمع عبر كليهما، و‘none’ يحافظ على خسارة العنصر الواحد.
خسارة Poly-1 sigmoid (focal)، FL + epsilon * (1 - p_t) ** (gamma + 1)، لتصنيف متعدد التسميات.
عندما يكون gamma = 0، تكون هذه الدالة هي BCE + epsilon * (1 - p_t) لكل فئة. عند تعيين alpha، تُوزَّن الإيجابيات بـ alpha والسلبيات بـ 1 - alpha في كلا الحدين، كما في المرجع.
forward
< source >( x: Tensortarget: Tensor )
فئة timm.loss.DistributionBalancedLoss
< source >( class_counts: typing.Union[torch.Tensor, typing.Sequence[float]]num_samples: intmap_alpha: float = 0.1map_beta: float = 10.0map_mu: float = 0.2neg_scale: float = 2.0init_bias: float = 0.05focal_gamma: float = 2.0focal_balance: float = 2.0smoothing: float = 0.0reduction: str = 'mean' )
المعاملات
- class_counts — عدد العينات الإيجابية لكل فئة على مجموعة التدريب.
- num_samples — عدد عينات التدريب التي تم أخذ العدّ عليها.
- map_alpha — الحد الأدنى لوزن خريطة إعادة التوازن.
- map_beta — مقياس خريطة إعادة التوازن.
- map_mu — عتبة خريطة إعادة التوازن.
- neg_scale — مقياس اللوجيتات السالبة (lambda)، حيث يُعطّل القيمة 1 التدرّج المتسامح مع السالب.
- init_bias — معامل إزاحة اللوجيت المسبق للفئة (كيبا)، حيث يؤدي تعيينه إلى 0 إلى تعطيله.
- focal_gamma — معامل التركيز، حيث يؤدي ضبطه على 0 إلى تعطيل حد التركيز (وfocal_balance).
- focal_balance — ثابت مقياس خسارة التركيز.
- smoothing — تنعيم التسميات، يُقرّب كل هدف نحو 0.5.
- reduction — ‘mean’ يحسب المتوسط عبر الدفعة (batch) والفئات (وهو المقياس المرجعي)، و‘batchmean’ يجمع عبر الفئات ويحسب المتوسط عبر الدفعة، و‘sum’ يجمع عبر كليهما، و‘none’ يحافظ على قيمة الخسارة لكل عنصر على حدة.
دالة الخسارة المتوازنة التوزيع (DB) لتصنيف التسميات المتعددة ذي الذيل الطويل.
دالة BCE مع دالة Sigmoid مع إضافتين:
- إعادة موازنة الأوزان: يُوزَّن كل حد (عينة، فئة) بنسبة احتمال أخذ العينة على مستوى الفئة 1 / n_i إلى احتمالها على مستوى العينة sum_j(y_j / n_j)، والتي تأخذ في الحسبان تزامن التسميات لكل عينة، مع تنعيمها على النحو alpha + sigmoid(beta * (r - mu)).
- التنظيم المتسامح مع القيم السالبة: تُزاح القيم غير المعيارية (logits) بواسطة انحياز مسبق للفئة، وتستخدم الحدود السالبة قيمة غير معيارية مُقيّمة، softplus(neg_scale * z) / neg_scale، حتى لا تُكبح القيم السالبة العديدة للفئات النادرة بشكل مفرط. يوجد حد تركيزي اختياري (1 - p_t) ** gamma يتبع إعداد قاعدة البيانات المرجعية.
تُوزّن الأهداف الناعمة (Mixup/CutMix) الحدود الموجبة والسالبة، بينما تستخدم أوزان إعادة التوازن الأهداف كما هي. يتطابق كلاهما مع المرجع للأهداف الثنائية.
forward
< source >( x: Tensortarget: Tensor )
فئة timm.loss.TwoWayLoss
< source >( tp: float = 4.0tn: float = 1.0 )
خسارة متعددة التسميات ثنائية الاتجاه.
يقارن أصعب (soft-max) قيمة logit السالبة بأصعب (soft-min) قيمة logit الموجبة في اتجاهين، عبر فئات كل عينة وعبر العينات لكل فئة في الدفعة. تساهم فقط العينات / الفئات التي تحتوي على إيجابي واحد على الأقل في الاتجاه المعني.
تُحوَّل الأهداف إلى قيم ثنائية، حيث تُعدّ القيم التي تتجاوز 0.5 إيجابية. أما القيم غير المعالجة (Logits) فهي درجات ترتيب، وليست مُعايرة كاحتمالات سيجمويد مستقلة.
forward
< source >( x: Tensortarget: Tensor )
خسارة ZLPR، وهي التوسعة متعددة التسميات لخسارة الانتروبيا المتقاطعة لـ softmax.
لكل عينة، log(1 + sum_neg exp(s_j)) + log(1 + sum_pos exp(-s_i)). يتم دفع كل لوجيت إيجابي فوق كل لوجيت سلبي، ويعمل الصفر كعتبة قرار، لذا فإن اللوجيتات > 0 (سيجمويد > 0.5) تتنبأ بالإيجابيات. لا توجد معاملات فائقة، ولا ينمو الخسارة مع عدد الفئات السلبية كما هو الحال في BCE لكل فئة.
تُحوَّل الأهداف إلى قيم ثنائية، حيث تُعدّ القيم التي تتجاوز 0.5 إيجابية.
forward
< source >( x: Tensortarget: Tensor )