regresion que machine learning español machine-learning neural-network regression caffe conv-neural-network

machine-learning - que - deep learning python español



Probando una red de regresión en caffe (2)

Estoy tratando de contar objetos en una imagen usando Alexnet.

Actualmente tengo imágenes que contienen 1, 2, 3 o 4 objetos por imagen. Para el chequeo inicial, tengo 10 imágenes por clase. Por ejemplo, en el conjunto de entrenamiento tengo:

image label image1 1 image2 1 image3 1 ... image39 4 image40 4

Usé script de creación de imagenet para crear un archivo lmdb para este conjunto de datos. Que convirtió con éxito mi conjunto de imágenes a lmdb. Alexnet, como ejemplo, se convierte en un modelo de regresión para aprender la cantidad de objetos en la imagen al introducir EucledeanLosslayer en lugar de Softmax Layer. Como lo sugirieron muchos. El resto de la red es igual.

Sin embargo, a pesar de hacer todo lo anterior, cuando ejecuto el modelo, recibí solo ceros como salida durante la fase de prueba (que se muestra a continuación). No aprendió nada. Sin embargo, la pérdida de entrenamiento disminuyó continuamente en cada iteración.

No entiendo qué errores cometí. ¿Alguien puede guiarme por qué los valores predichos son siempre 0? ¿Y cómo puedo verificar los valores regresados ​​en la fase de prueba, para verificar cuántas muestras son correctas y cuál es el valor para cada una de mi imagen?

La etiqueta predicha y real del conjunto de datos de prueba se da como:

I0928 17:52:45.585160 18302 solver.cpp:243] Iteration 1880, loss = 0.60498 I0928 17:52:45.585212 18302 solver.cpp:259] Train net output #0: loss = 0.60498 (* 1 = 0.60498 loss) I0928 17:52:45.585225 18302 solver.cpp:592] Iteration 1880, lr = 1e-06 I0928 17:52:48.397922 18302 solver.cpp:347] Iteration 1900, Testing net (#0) I0928 17:52:48.499543 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 1 I0928 17:52:48.499641 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 2 I0928 17:52:48.499660 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 3 I0928 17:52:48.499681 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 4 ...

Nota: También creé archivos de formato hdf5 para tener etiquetas flotantes, es decir, 1.0, 2.0, 3.0 y 4.0. Sin embargo, cuando cambié la capa de datos al tipo HDF5, no puedo recortar la imagen para el aumento de datos como se hace en alexnet con la capa lmdb, así como la normalización. Utilicé el script que se proporciona en " https://github.com/nikogamulin/caffe-utils/blob/master/hdf5/demo.m " para datos de hdf5 y seguí sus pasos para usarlo en mi modelo.

He actualizado las últimas capas como tal:

layer { name: "fc8reg" type: "InnerProduct" bottom: "fc7" top: "fc8reg" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } inner_product_param { num_output: 1 weight_filler { type: "gaussian" std: 0.01 } bias_filler { type: "constant" value: 0 } } } layer { name: "accuracy" type: "Accuracy" bottom: "fc8reg" bottom: "label" top: "accuracy" include { phase: TEST } } layer { name: "loss" type: "EuclideanLoss" bottom: "fc8reg" bottom: "label" top: "loss" }


En mi opinión, todo es correcto, pero su red no converge, lo cual no es raro. ¡Su red realmente converge a cero salidas! Tal vez la mayoría de tus muestras tienen 0 como etiqueta.

Además, no olvide incluir la capa de pérdida solo durante TRAIN; de lo contrario, también aprenderá sobre los datos de prueba.


Sin juzgar si su red divergió o no, el error obvio que ha cometido es que no debe usar una capa de Accuracy para probar una red de regresión. Es solo para probar una red de clasificación entrenada por una Capa SoftmaxWithLoss .

De hecho, dada una imagen para una red, la capa Accuracy en la red siempre ordenará su matriz de entrada (aquí está bottom: "fc8reg" ) y elegirá el índice del valor máximo en la matriz como la etiqueta predicha por defecto.

Dado que num_output == 1 en la capa fc8reg , la capa de accuracy siempre predecirá el índice 0 para la imagen de entrada como su etiqueta predicha como lo ha visto.

Por último, puede usar una capa EuclideanLoss para probar su red de regresión. Este problema similar también puede darle alguna pista.

Si debe imprimir y calcular los valores regresados ​​después del entrenamiento, y contar la precisión de la red de regresión, simplemente puede escribir una capa de precisión de regresión como esta .

O bien, si su etiqueta de destino solo tiene 4 valores discretos {1,2,3,4} , {1,2,3,4} , {1,2,3,4} , {1,2,3,4} , puede seguir entrenando una red de clasificación para su tarea.