machine-learning - matriz - clasificacion multiclase
Problema de precisiĆ³n en caffe (1)
¿Debería usarse "EuclideanLoss"
para predecir salidas binarias?
Si está tratando de predecir las etiquetas binarias discretas, entonces "EuclideanLoss"
no es una muy buena opción. Esta pérdida es más adecuada para las tareas de regresión en las que desea predecir valores continuos (por ejemplo, estimación de cajas de límites coordinadas, etc.).
Para predecir etiquetas discretas, "SoftmaxWithLoss"
o "InfogainLoss"
son más adecuados. Por lo general, se usa "SoftmaxWithLoss"
.
Para predecir salidas binarias, también puede considerar "SigmoidCrossEntropyLoss"
.
¿Por qué hay un error en la capa "Accuracy"
?
En caffe , las capas " Accuracy"
esperan dos entradas ("bottom" s): una es un vector de predicción y la otra es la etiqueta discreta de ground truth expected. En su caso, debe proporcionar, para cada salida binaria, un vector de longitud 2 con las probabilidades pronosticadas de 0 y 1, y una única etiqueta binaria:
layer {
name: "acc01"
type: "Accuracy"
bottom: "predict01"
bottom: "label01"
top: "acc01"
}
En este ejemplo, usted mide la precisión de una única salida binaria. La entrada "predict01"
es un vector de dos para cada ejemplo en el lote (para batch_size: 50
la forma de este blob debe ser de 50 por 2).
¿Qué puedes hacer?
Está tratando de predecir 4 salidas diferentes en una sola red, por lo tanto, necesita 4 capas diferentes de pérdida y precisión.
Primero, debes dividir ( "Slice"
) las etiquetas de verdad del suelo en 4 escalares (en lugar de un solo vector binario de 4):
layer {
name: "label_split"
bottom: "label" # name of input 4-vector
top: "label01"
top: "label02"
top: "label03"
top: "label04"
type: "Slice"
slice_param {
axis: 1
slice_point: 1
slice_point: 2
slice_point: 3
}
}
Ahora debe tener una capa de predicción, pérdida y precisión para cada una de las etiquetas binarias
layer {
name: "predict01"
type: "InnerProduct"
bottom: "sig2"
top: "predict01"
inner_product_param {
num_outout: 2 # because you need to predict 2 probabilities one for False, one for True
...
}
layer {
name: "loss01"
type: "SoftmaxWithLoss"
bottom: "predict01"
bottom: "label01"
top: "loss01"
}
layer {
name: "acc01"
type: "Accuracy"
bottom: "predict01"
bottom: "label01"
top: "acc01"
}
Ahora necesita replicar estas tres capas para cada una de las cuatro etiquetas binarias que desea pronosticar.
Tengo una red que tiene 4 salidas booleanas. No es un problema de clasificación y cada uno de ellos tiene sentido. Espero obtener un cero o uno para cada uno de ellos. En este momento he usado la función de pérdida euclidiana.
Hay 1000000 muestras. En el archivo de entrada, cada uno de ellos tiene 144 funciones, por lo que el tamaño de la entrada es 1000000 * 144. He usado el tamaño de lote de 50, porque de lo contrario el tiempo de procesamiento es demasiado. El archivo de salida es del tamaño 1000000 * 4, es decir, hay cuatro salidas por cada entrada.
Cuando estoy usando la capa de precisión, se queja de la dimensión del resultado. Solo necesita una salida booleana, no cuatro. Creo que es porque considera el problema como un problema de clasificación. Tengo dos preguntas. Primero, considerando el error de la capa de precisión, ¿la función de pérdida euclidiana es adecuada para esta tarea? ¿Y cómo puedo obtener la precisión de mi red? En segundo lugar, obtendré el valor exacto de la producción pronosticada para cada una de las cuatro variables. Quiero decir que necesito los valores pronosticados exactos para cada registro de prueba. Ahora, solo tengo el valor de pérdida para cada lote. Por favor, guíame para resolver esos problemas.
Gracias, Afshin
La red de trenes es:
{ state {
phase: TRAIN
}
layer {
name: "abbas"
type: "HDF5Data"
top: "data"
top: "label"
hdf5_data_param {
source: "/home/afo214/Research/hdf5/simulation/Train-1000-11- 1/Train-Sc-B-1000-11-1.txt"
batch_size: 50
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "data"
top: "ip1"
inner_product_param {
num_output: 350
weight_filler {
type: "xavier"
}
}
}
layer {
name: "sig1"
bottom: "ip1"
top: "sig1"
type: "Sigmoid"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "sig1"
top: "ip2"
inner_product_param {
num_output: 150
weight_filler {
type: "xavier"
}
}
}
La red de prueba también es:
state {
phase: TEST
}
layer {
name: "abbas"
type: "HDF5Data"
top: "data"
top: "label"
hdf5_data_param {
source: "/home/afo214/Research/hdf5/simulation/Train-1000-11- 1/Train-Sc-B-1000-11-1.txt"
batch_size: 50
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "data"
top: "ip1"
inner_product_param {
num_output: 350
weight_filler {
type: "xavier"
}
}
}
layer {
name: "sig1"
bottom: "ip1"
top: "sig1"
type: "Sigmoid"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "sig1"
top: "ip2"
inner_product_param {
num_output: 150
weight_filler {
type: "xavier"
}
}
}
layer {
name: "sig2"
bottom: "ip2"
top: "sig2"
type: "Sigmoid"
}
layer {
name: "ip4"
type: "InnerProduct"
bottom: "sig2"
top: "ip4"
inner_product_param {
num_output: 4
weight_filler {
type: "xavier"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip4"
bottom: "label"
top: "accuracy"
}
layer {
name: "loss"
type: "EuclideanLoss"
bottom: "ip4"
bottom: "label"
top: "loss"
}
Y obtengo este error:
accuracy_layer.cpp:34] Check failed: outer_num_ * inner_num_ == bottom[1]->count() (50 vs. 200) Number of labels must match number of predictions; e.g., if label axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must be N*H*W, with integer values in {0, 1, ..., C-1}.
Sin usar la capa de precisión caffe me da el valor de pérdida.