Pytorch: حول torch.nn.CrossEntropyLoss

تم إنشاؤها على ١٤ أبريل ٢٠١٧  ·  3تعليقات  ·  مصدر: pytorch/pytorch

حول torch.nn.CrossEntropyLoss ،
أنا أتعلم pytorch ، وأتخذ مشروع anpr
(https://github.com/matthewearl/deep-anpr ،
http://matthewearl.github.io/2016/05/06/cnn-anpr/)
كتمرين ، قم بنقله إلى منصة pytorch.

هناك مشكلة ، أنا أستخدم nn.CrossEntropyLoss () كدالة خسارة:
المعيار = nn.CrossEntropyLoss ()

بيانات الإخراج للنموذج هي:
1.00000e-02 *
-2.5552 2.7582 2.5368 ... 5.6184 1.2288 -0.0076
-0.7033 1.3167 -1.0966 ... 4.7249 1.3217 1.8367
-0.7592 1.4777 1.8095 ... 0.8733 1.2417 1.1521
-0.1040 -0.7054 -3.4862 ... 4.7703 2.9595 1.4263
[torch.FloatTensor بحجم 4x253]

والأهداف والبيانات هي:
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
[torch.DoubleTensor بحجم 4x253]

عندما اتصل:
الخسارة = المعيار (المخرجات ، الأهداف)
حدث خطأ ، المعلومات هي:
TypeError: FloatClassNLLCriterion_updateOutput تلقت مجموعة غير صالحة من الوسائط - got (int، torch.FloatTensor، torch.DoubleTensor، torch.FloatTensor، bool، NoneType، torch.FloatTensor) ، لكنها متوقعة (حالة int ، torch.FloatTensor) ، torch.FloatTensor output، bool sizeAverage، [torch.FloatTensor weight or None]، torch.FloatTensor total_weight)

"الشعلة المتوقعة. LongTensor" ، "حصلت على torch.DoubleTensor" ، ولكن إذا قمت بتحويل الأهداف إلى LongTensor:
torch.LongTensor (numpy.array (target.data.numpy () ، numpy.long))
خسارة المكالمة = المعيار (المخرجات ، الأهداف) ، الخطأ هو:
خطأ وقت التشغيل: الأهداف المتعددة غير مدعومة في /data/users/soumith/miniconda2/conda-bld/pytorch-0.1.10_1488752595704/work/torch/lib/THNN/generic/ClassNLLCriterion.c:20

آخر تمرين لي هو mnist ، مثال من pytorch ، لقد أجريت تعديلًا قليلاً ، حجم الدفعة هو 4 ، وظيفة الخسارة:
الخسارة = F.nll_loss (المخرجات ، الملصقات)
المخرجات. البيانات:
-2.3220 -2.1229 -2.3395 -2.3391 -2.5270 -2.3269 -2.1055 -2.2321 -2.4943 -2.2996
-2.3653 -2.2034 -2.4437 -2.2708 -2.5114 -2.3286 -2.1921 -2.1771 -2.3343 -2.2533
-2.2809 -2.2119 -2.3872-2.2190 -2.4610 -2.2946 -2.2053 -2.3192 -2.3674 -2.3100
-2.3715 -2.1455 -2.4199 -2.4177 -2.4565 -2.2812 -2.2467 -2.1144 -2.3321 -2.3009
[torch.FloatTensor بحجم 4x10]

تسميات البيانات:
8
6
0
1
[torch.LongTensor بحجم 4]

يجب أن تكون التسميات ، لصورة الإدخال ، عنصرًا واحدًا ، في المثال العلوي ، يوجد 253 رقمًا ، وفي "mnist" ، يوجد رقم واحد فقط ، وشكل المخرجات يختلف عن الملصقات.

قمت بمراجعة دليل tensorflow ، tf.nn.softmax_cross_entropy_with_logits ،
"يجب أن يكون للسجلات والتسميات نفس الشكل [batch_size، num_classes] ونفس النوع dtype (إما float32 أو float64)."

لذا ، هل يمكنني استخدام pytorch في هذه الحالة ، أو كيف يمكنني القيام بذلك؟
كثير من thks

التعليق الأكثر فائدة

لن أقول إن مستندات TF هي أفضل مكان للتعرف على PyTorch API نحن لا نحاول أن نكون متوافقين مع TF ، ويقبل CrossEntropyLoss متجهًا لمؤشرات الفئة (وهذا يسمح له بالعمل أسرع بكثير مما لو كان مستخدمًا 1- ناقلات ساخنة). يجب أن يكون التحويل بين كلا التمثيلين أمرًا سهلاً إذا كنت حقًا بحاجة إلى ذلك.

لاحظ أننا نستخدم مشكلات GitHub لتقارير الأخطاء فقط. إذا كان لديك أي أسئلة ، يرجى طرحها على منتدياتنا .

ال 3 كومينتر

http://pytorch.org/docs/nn.html#crossentropyloss
الشكل الخاسر:
المدخلات: (N، C) حيث C = عدد الفصول
الهدف: (N) حيث تكون كل قيمة 0 <= أهداف [i] <= C-1

هل لدي أي خيار آخر؟

لن أقول إن مستندات TF هي أفضل مكان للتعرف على PyTorch API نحن لا نحاول أن نكون متوافقين مع TF ، ويقبل CrossEntropyLoss متجهًا لمؤشرات الفئة (وهذا يسمح له بالعمل أسرع بكثير مما لو كان مستخدمًا 1- ناقلات ساخنة). يجب أن يكون التحويل بين كلا التمثيلين أمرًا سهلاً إذا كنت حقًا بحاجة إلى ذلك.

لاحظ أننا نستخدم مشكلات GitHub لتقارير الأخطاء فقط. إذا كان لديك أي أسئلة ، يرجى طرحها على منتدياتنا .

شكرًا ، تحويل مصفوفة ترميز الفئة الواحدة الساخنة إلى متجه عدد صحيح أدى إلى إصلاح مشكلة CrossEntropyLoss بالنسبة لي!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات