حول 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
http://pytorch.org/docs/nn.html#crossentropyloss
الشكل الخاسر:
المدخلات: (N، C) حيث C = عدد الفصول
الهدف: (N) حيث تكون كل قيمة 0 <= أهداف [i] <= C-1
هل لدي أي خيار آخر؟
لن أقول إن مستندات TF هي أفضل مكان للتعرف على PyTorch API نحن لا نحاول أن نكون متوافقين مع TF ، ويقبل CrossEntropyLoss متجهًا لمؤشرات الفئة (وهذا يسمح له بالعمل أسرع بكثير مما لو كان مستخدمًا 1- ناقلات ساخنة). يجب أن يكون التحويل بين كلا التمثيلين أمرًا سهلاً إذا كنت حقًا بحاجة إلى ذلك.
لاحظ أننا نستخدم مشكلات GitHub لتقارير الأخطاء فقط. إذا كان لديك أي أسئلة ، يرجى طرحها على منتدياتنا .
شكرًا ، تحويل مصفوفة ترميز الفئة الواحدة الساخنة إلى متجه عدد صحيح أدى إلى إصلاح مشكلة CrossEntropyLoss بالنسبة لي!
التعليق الأكثر فائدة
لن أقول إن مستندات TF هي أفضل مكان للتعرف على PyTorch API نحن لا نحاول أن نكون متوافقين مع TF ، ويقبل CrossEntropyLoss متجهًا لمؤشرات الفئة (وهذا يسمح له بالعمل أسرع بكثير مما لو كان مستخدمًا 1- ناقلات ساخنة). يجب أن يكون التحويل بين كلا التمثيلين أمرًا سهلاً إذا كنت حقًا بحاجة إلى ذلك.
لاحظ أننا نستخدم مشكلات GitHub لتقارير الأخطاء فقط. إذا كان لديك أي أسئلة ، يرجى طرحها على منتدياتنا .