Pytorch: acerca de torch.nn.CrossEntropyLoss

Creado en 14 abr. 2017  ·  3Comentarios  ·  Fuente: pytorch/pytorch

acerca de torch.nn.CrossEntropyLoss,
estoy aprendiendo pytorch y tomando el proyecto anpr
(https://github.com/matthewearl/deep-anpr,
http://matthewearl.github.io/2016/05/06/cnn-anpr/)
como ejercicio, transplántelo a la plataforma pytorch.

hay un problema, estoy usando nn.CrossEntropyLoss() como función de pérdida:
criterio=nn.CrossEntropyLoss()

los datos de salida del modelo son:
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 de tamaño 4x253]

y objetivos.datos es:
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
[antorcha.DoubleTensor de tamaño 4x253]

cuando llamo:
pérdida=criterio(salida,objetivos)
ocurrió un error, la información es:
TypeError: FloatClassNLLCriterion_updateOutput recibió una combinación no válida de argumentos: obtuvo (int, torch.FloatTensor, torch.DoubleTensor, torch.FloatTensor, bool, NoneType, torch.FloatTensor), pero se esperaba (int state, torch.FloatTensor input, torch.LongTensor target , salida de torch.FloatTensor, promedio de tamaño bool, [pesos de torch.FloatTensor o ninguno], torch.FloatTensor total_weight)

'antorcha esperada.LongTensor','obtuve antorcha.DoubleTensor', pero si convierto los objetivos en LongTensor:
antorcha.LongTensor(numpy.array(targets.data.numpy(),numpy.long))
call loss=criterion(output,targets), el error es:
RuntimeError: múltiples objetivos no admitidos en /data/users/soumith/miniconda2/conda-bld/pytorch-0.1.10_1488752595704/work/torch/lib/THNN/generic/ClassNLLCriterion.c:20

mi último ejercicio es mnist, un ejemplo de pytorch, hice una pequeña modificación, lote_tamaño es 4, la función de pérdida:
pérdida = F.nll_loss(salidas, etiquetas)
salidas.datos:
-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 de tamaño 4x10]

etiquetas.datos:
8
6
0
1
[antorcha.LongTensor de tamaño 4]

las etiquetas, para una imagen de entrada, deben ser un solo elemento, en el ejemplo superior, hay 253 números, y en 'mnist', solo hay un número, la forma de las salidas es diferente de las etiquetas.

reviso el manual de tensorflow, tf.nn.softmax_cross_entropy_with_logits,
'Logits y etiquetas deben tener la misma forma [batch_size, num_classes] y el mismo dtype (ya sea float32 o float64).'

Entonces, ¿puedo usar pytorch en este caso o cómo puedo hacerlo?
muchas gracias

Comentario más útil

No diría que los documentos de TF son el mejor lugar para aprender sobre la API de PyTorch 🙂 No estamos tratando de ser compatibles con TF, y nuestro CrossEntropyLoss acepta un vector de índices de clase (esto le permite ejecutarse mucho más rápido que si usara 1-vectores calientes). Debería ser sencillo convertir entre ambas representaciones si realmente lo necesita.

Tenga en cuenta que estamos usando problemas de GitHub solo para informes de errores. Si tiene alguna pregunta, por favor pregúntela en nuestros foros .

Todos 3 comentarios

http://pytorch.org/docs/nn.html#crossentropyloss
CrossEntropyLoss Forma:
Entrada: (N,C) donde C = número de clases
Objetivo: (N) donde cada valor es 0 <= objetivos[i] <= C-1

¿tengo alguna otra opción?

No diría que los documentos de TF son el mejor lugar para aprender sobre la API de PyTorch 🙂 No estamos tratando de ser compatibles con TF, y nuestro CrossEntropyLoss acepta un vector de índices de clase (esto le permite ejecutarse mucho más rápido que si usara 1-vectores calientes). Debería ser sencillo convertir entre ambas representaciones si realmente lo necesita.

Tenga en cuenta que estamos usando problemas de GitHub solo para informes de errores. Si tiene alguna pregunta, por favor pregúntela en nuestros foros .

¡Gracias, convertir la matriz de codificación de clase one-hot en un vector entero solucionó el problema de CrossEntropyLoss para mí!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

JamesOwers picture JamesOwers  ·  61Comentarios

alexeygolyshev picture alexeygolyshev  ·  77Comentarios

GinSoda picture GinSoda  ·  61Comentarios

PhilippPelz picture PhilippPelz  ·  128Comentarios

zym1010 picture zym1010  ·  189Comentarios