Python / Tensorflow – He entrenado la neural network convolucional, ¿cómo probarlo?

He entrenado una neural network convolucional (CNN) con los siguientes datos que tenía en un archivo binario (etiqueta, nombre de archivo, datos (píxeles)):

[array([2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0]), array(['10_c.jpg', '10_m.jpg', '10_n.jpg', '1_c.jpg', '1_m.jpg', '1_n.jpg', '2_c.jpg', '2_m.jpg', '2_n.jpg', '3_c.jpg', '3_m.jpg', '3_n.jpg', '4_c.jpg', '4_m.jpg', '4_n.jpg', '5_c.jpg', '5_m.jpg', '5_n.jpg', '6_c.jpg', '6_m.jpg', '6_n.jpg', '7_c.jpg', '7_m.jpg', '7_n.jpg', '8_c.jpg', '8_m.jpg', '8_n.jpg', '9_c.jpg', '9_m.jpg', '9_n.jpg'], dtype='<U15'), array([[255, 252, 255, ..., 255, 255, 255], [136, 137, 138, ..., 114, 110, 111], [200, 200, 199, ..., 179, 178, 177], ..., [146, 157, 165, ..., 202, 202, 201], [228, 225, 222, ..., 219, 221, 223], [128, 127, 127, ..., 133, 129, 127]])] 

Cada lote contenía todas las imágenes y se ejecutaron 30 epohs:

 EPOCH 0 0 0.476923 DONE WITH EPOCH EPOCH 1 0 0.615385 DONE WITH EPOCH EPOCH 2 0 0.615385 DONE WITH EPOCH EPOCH 3 0 0.538462 DONE WITH EPOCH EPOCH 4 0 0.384615 DONE WITH EPOCH ... ... EPOCH 28 0 0.615385 DONE WITH EPOCH EPOCH 29 0 0.692308 DONE WITH EPOCH 

Mi pregunta es que me gustaría probar nuevas imágenes (prueba) y me gustaría saber la clase devuelta (0,1,2). ¿Qué debo hacer en este caso? En otras palabras, entrené a la CNN, pero ¿cómo probarlo?

EDITAR-1

Para el punto de precisión de evaluación , obtuve los siguientes resultados al probar 20 imágenes:

 EPOCH 0 0 1.0 DONE WITH EPOCH EPOCH 1 0 1.0 DONE WITH EPOCH EPOCH 2 0 1.0 DONE WITH EPOCH EPOCH 3 0 1.0 DONE WITH EPOCH EPOCH 4 0 1.0 DONE WITH EPOCH EPOCH 5 0 1.0 DONE WITH EPOCH EPOCH 6 0 1.0 DONE WITH EPOCH EPOCH 7 0 1.0 DONE WITH EPOCH EPOCH 8 0 1.0 DONE WITH EPOCH EPOCH 9 0 1.0 DONE WITH EPOCH EPOCH 10 0 1.0 DONE WITH EPOCH EPOCH 11 0 1.0 DONE WITH EPOCH EPOCH 12 0 1.0 DONE WITH EPOCH EPOCH 13 0 1.0 DONE WITH EPOCH EPOCH 14 0 1.0 DONE WITH EPOCH EPOCH 15 0 1.0 DONE WITH EPOCH EPOCH 16 0 1.0 DONE WITH EPOCH EPOCH 17 0 1.0 DONE WITH EPOCH EPOCH 18 0 1.0 DONE WITH EPOCH EPOCH 19 0 1.0 DONE WITH EPOCH EPOCH 20 0 1.0 DONE WITH EPOCH EPOCH 21 0 1.0 DONE WITH EPOCH EPOCH 22 0 1.0 DONE WITH EPOCH EPOCH 23 0 1.0 DONE WITH EPOCH EPOCH 24 0 1.0 DONE WITH EPOCH EPOCH 25 0 1.0 DONE WITH EPOCH EPOCH 26 0 1.0 DONE WITH EPOCH EPOCH 27 0 1.0 DONE WITH EPOCH EPOCH 28 0 1.0 DONE WITH EPOCH EPOCH 29 0 1.0 DONE WITH EPOCH 

Al aplicar la obtención de las tags que la red produjo para el punto de datos de prueba , obtuve lo siguiente:

 EPOCH 0 0 0.0 DONE WITH EPOCH EPOCH 1 0 0.0 DONE WITH EPOCH EPOCH 2 0 0.0 DONE WITH EPOCH EPOCH 3 0 0.0 DONE WITH EPOCH EPOCH 4 0 0.0 DONE WITH EPOCH EPOCH 5 0 0.0 DONE WITH EPOCH EPOCH 6 0 0.0 DONE WITH EPOCH EPOCH 7 0 0.0 DONE WITH EPOCH EPOCH 8 0 0.0 DONE WITH EPOCH EPOCH 9 0 0.0 DONE WITH EPOCH EPOCH 10 0 0.0 DONE WITH EPOCH EPOCH 11 0 0.0 DONE WITH EPOCH EPOCH 12 0 0.0 DONE WITH EPOCH EPOCH 13 0 0.0 DONE WITH EPOCH EPOCH 14 0 0.0 DONE WITH EPOCH EPOCH 15 0 0.0 DONE WITH EPOCH EPOCH 16 0 0.0 DONE WITH EPOCH EPOCH 17 0 0.0 DONE WITH EPOCH EPOCH 18 0 0.0 DONE WITH EPOCH EPOCH 19 0 0.0 DONE WITH EPOCH EPOCH 20 0 0.0 DONE WITH EPOCH EPOCH 21 0 0.0 DONE WITH EPOCH EPOCH 22 0 0.0 DONE WITH EPOCH EPOCH 23 0 0.0 DONE WITH EPOCH EPOCH 24 0 0.0 DONE WITH EPOCH EPOCH 25 0 0.0 DONE WITH EPOCH EPOCH 26 0 0.0 DONE WITH EPOCH EPOCH 27 0 0.0 DONE WITH EPOCH EPOCH 28 0 0.0 DONE WITH EPOCH EPOCH 29 0 0.0 DONE WITH EPOCH 

¿Por qué tengo 0 o 1 ? ¿Tener esos valores tiene sentido (es decir, sin fracciones)?

EDIT-2

Para obtener las tags que la red produjo para los datos de prueba , al imprimir el valor de la etiqueta y la precisión de cada época, obtuve lo siguiente (las tags siempre son 0 , aunque esperaba solo 0 o 2 , y la precisión se indica como 1 ) :

 EPOCH 0 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH EPOCH 1 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH EPOCH 2 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH EPOCH 3 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH EPOCH 4 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH EPOCH 5 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH ..... ..... EPOCH 28 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH EPOCH 29 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 1.0 DONE WITH EPOCH 

Gracias.

Discusión General

En general, para probar la neural network, debe tomar nuevos datos etiquetados que no utilizó para la capacitación, aplicar la red a estos datos (es decir, aplicar el proceso de avance) y evaluar la precisión del resultado ( en comparación con las tags que usted sabe que son verdaderas).

Si no tiene esos datos nuevos (es decir, si usó todos sus datos para la capacitación) y no puede generar nuevos datos, le sugeriría que tome sus datos de capacitación, los separe a la capacitación y las pruebas, y vuelva a ejecutar su procedimiento de capacitación. En los datos de entrenamiento desde el principio. Es importante que los datos de prueba sean datos no utilizados para poder evaluar el rendimiento de su modelo.

Evaluando la exactitud

Ahora, asumiendo que está hablando sobre la red a partir de esta pregunta, puede hacer algo así para medir la precisión de los datos de su prueba:

 accuracy_test = sess.run(accuracy, feed_dict={x: test_data, y: test_onehot_vals}) 

donde test_data y test_onehot_vals son sus imágenes de prueba (y las tags correspondientes).

Recuerda que para entrenar corres lo siguiente:

 _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals}) 

Tenga en cuenta que no train_op en la evaluación de accuracy_test . Esto se debe al hecho de que cuando prueba su rendimiento, no optimiza los pesos ni nada de eso (lo que hace train_op ). Solo aplica la red que tienes actualmente.

Obtención de las tags que la red produjo para los datos de prueba.

Finalmente, si desea las tags reales de sus datos de prueba, necesita obtener el valor de tf.argmax(model_op, 1) . Así que puedes configurarlo en una variable separada, por ejemplo, justo arriba de la línea

 correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1)) 

Tu puedes hacer:

 res_model=tf.argmax(model_op, 1) correct_pred = tf.equal(res_model, tf.argmax(y,1)) 

y luego evalúelo junto con accuracy_test siguiente manera:

 res, accuracy_test = sess.run([res_model,accuracy], feed_dict={x: test_data, y: test_onehot_vals}). 

Aplicando la red en datos sin etiquetar.

Después de que termine de probar la red, y suponiendo que esté satisfecho con los resultados, puede seguir adelante y aplicar la red a datos nuevos y sin etiquetar. Por ejemplo haciendo

res_new = sess.run(res_model, feed_dict={x: new_data}) .

Tenga en cuenta que para producir res_model (que básicamente significa solo aplicar la red en la entrada) no necesita ninguna etiqueta, por lo que no necesita los valores de y en su feed_dict. res_new serán las nuevas tags.