MichelleGrenier / facial_recognition_tp2_metodos

0 stars 0 forks source link

fijarse por qué tarda tanto PCA #20

Closed franco-metnum closed 6 years ago

franco-metnum commented 6 years ago

capaz con la nueva M de covarianzas más chica, ya tarda menos (versionar csv con resultados)

otra que me tiraron es que no hace falta recalcular PCA para cada pliegue: lo puedo calcular una sola vez para todas las caras y usar eso

tendría que revisar bien qué es lo que estamos haciendo. capaz estamos calculando PCA para cada conjunto de entrenamiento de cada pliegue. tiene sentido hacerlo así? en una aplicación real vamos a tener un conjunto de entrenamiento fijo e imágenes de prueba sin etiquetar: también vamos a hacer PCA una sola vez. pero ahora estaría usando imágenes que se supone que no sé la clasificación para calcular la transformación característica. igual creo que está bien, porque la t.c. no depende de la etiqueta. podría incluso hacer PCA usando también las imágenes de prueba y no habría problema (de hecho, les aplicamos la t.c. también, cuando nos llegan y queremos hacer knn).

franco-metnum commented 6 years ago

Decíamos con Michelle que, en un caso real, estaría mal hacer la tc usando autovectores de (la matriz de covarianza de) las imágenes incluyendo las del conjunto de prueba. Porque nos podrían mandar fruta y nos romperían todo.

En nuestro caso (búsqueda de parámetros con K-fold CV) sabemos que las imágenes del conjunto de entrenamiento son todas posta, así que respecto a eso estaríamos bien. Pero pensamos que capaz usar también las que van a ser de prueba para la transformación característica, por ahí es trampa.

Lo que estamos haciendo ahora, cuando hacemos búsqueda de parámetros, es: 1) dividir en train y test, 2) calcular la tc con la matriz de covarianzas de train y 3) aplicarle la transformación a train y a test. Esto, para cada K pliegue, tarda mucho.

pca

Querríamos hacer como se muestra a la izquierda en la imagen de arriba: encontrar la matriz de covarianza de todo el conjunto de entrenamiento y calcular la tc y aplicársela, antes de dividirlo en train y test. Pero estaría bien? Porque estaríamos armando la tc con los avects de train y los de test.

Esto lo puedo preguntar por mail capaz.

franco-metnum commented 6 years ago

Ya mandé mail a los docentes.

Estoy viendo que en la tablita que hay un algunos PCA que tardan tipo 100 segs (vs la mayoría que tardan hasta 4 días aprox). Capaz son los nuevos, con la nueva matriz de covarianza más chica. Igual los aciertos siguen siendo peores que con KNN: no superan el 70% nunca.

Voy a borrar los archivos de las corridas PCA y la tablita, y mando a correr de nuevo para confirmar que se arregló: #24

franco-metnum commented 6 years ago

Mandé:

Nos está pasando que KNN nos da excelentes resultados. Por ejemplo: con k=1, entrenando con 2 imágenes de cada sujeto y probando con las 8 restantes (sin importar cuáles 2, usando 5-fold CV); obtenemos un promedio de alrededor de 80% de aciertos. Y tarda en promedio alrededor de 1/4 de segundo cada vez.

Sin embargo, PCA+KNN tarda hasta 4 días usando M = X^t X, o alrededor de 100 segundos usando M = X X^t . Pero nunca logramos obtener más del 70% en promedio de aciertos con este método, sin importar la combinación de parámetros (entrenando con 1, 2, 5, 8 o 9 imágenes por sujeto y probando con el resto, usando validación cruzada K-plegada; con los k = 1, 2, 4, 5, 10, 15, 20 vecinos más cercanos; usando las alfa = 4, 10, 12, 15, 100, 150, 200, 250, 300 dimensiones de mayor varianza...).

Queríamos consultarles si estos resultados son esperables o es que estamos haciendo algo mal. Los autovalores nos dan exactamente como los de la cátedra.

y nos respondieron:

No debería tardar tanto PCA. Es muy posible que estén haciendo cálculos de más como por ejemplo:

  • recomputanto autovalores de 1 a \alpha para cada \alpha.
  • creando una nueva base de autovectores cada vez que se hace una query o se cambia el k

Recuerden que la base de autovectores solo se tiene que recomputar si la base de entrenamiento cambia. También verifiquen el criterio de corte del método de la potencia. Traten de reducir la cantidad de iteraciones degradando poco la aproximación.

Por último, prueben con menos valores y más chicos tanto de \alpha como de k.

respecto a la última oración, abrí #27. voy a re-preguntar un par de cosas, de lo otro

franco-metnum commented 6 years ago

Mandé:

Para cortar el método de la potencia estamos usando 1000 iteraciones o |norma(Mx)_actual - norma(Mx)_anterior| < 0.0001, lo que pase primero.

Efectivamente, estamos recomputando autovalores y creando una nueva base de autovectores, cada vez que cambiamos los parámetros. El ciclo principal (el de "más afuera") de nuestro programa, itera para cada pliegue recibido por parámetro, usando un solo valor de cada parámetro a optimizar. No nos dimos cuenta que no iba a convenir...

No se si lo re-estructuraríamos a esta altura, porque ya armamos un sistema, más o menos automatizado, para crear los archivos de entrada con un valor de cada parámetro y los pliegues de una partición, y levantar los archivos con los resultados en una tabla. Pero por ahí hubiese estado bueno que el programa recibiera un conjunto de valores para k y \alfa, y los probara todos, para cada pliegue de una partición (para hacer PCA solo una vez).

¿Dicen que quizás podemos medir lo que tarda PCA con cada uno de los pliegues de las particiones que usamos, y ya guardar los autovalores y los autovectores, por ejemplo en un archivo, y usarlos pre-calculados para la búsqueda de los parámetros óptimos?

¿No se puede transformar toda la base de entrenamiento y después particionarla, no? Porque estaríamos usando autovectores de la matriz de covarianza de toda la base de entrenamiento, para la transformación (incluyendo los que vayan a usarse en el conjunto de prueba).

franco-metnum commented 6 years ago

Respondió Pachi:

¿Dicen que quizás podemos medir lo que tarda PCA con cada uno de los pliegues de las particiones que usamos, y ya guardar los autovalores y los autovectores, por ejemplo en un archivo, y usarlos pre-calculados para la búsqueda de los parámetros óptimos?

Si, esto puede ayudar a no repetir cálculos

Abrí #28, al respecto.

¿No se puede transformar toda la base de entrenamiento ydespués particionarla, no? Porque estaríamos usando autovectores de la matriz de covarianza de toda la base de entrenamiento, para la transformación (incluyendo los que vayan a usarse en el conjunto de prueba).

No es la idea

franco-metnum commented 6 years ago

Acá está la posta de que ande más rápido, creo: #30.

Vamos a ver cuánto tarda.

franco-metnum commented 6 years ago

Es un caso chico, pero parecería que ya está:

[franco@franco-pc src]$ ./tp2 ../tests/parametros/m1/k5/i1000/a150/K2inv/test_m1k5i1000a150K2inv-1_mini.in ../tests/parametros/m1/k5/i1000/a150/K2inv/test_m1k5i1000a150K2inv-1_mini.out 1
REALIZANDO TRANSFORMACION CARACTERISTICA

imagenes entrenamiento: 10 -  imagenes test: 10 - imagenes totales: 20
TEST 1
Resultados correctos: 10
Resultados incorrectos: 0
Porcentaje de aciertos: 100.000

REALIZANDO TRANSFORMACION CARACTERISTICA

imagenes entrenamiento: 10 -  imagenes test: 10 - imagenes totales: 20
TEST 2
Resultados correctos: 10
Resultados incorrectos: 0
Porcentaje de aciertos: 100.000

[franco@franco-pc src]$ tail ../tests/parametros/m1/k5/i1000/a150/K2inv/test_m1k5i1000a150K2inv-1_mini.out.report 

***RESULTADOS***

PARAMETROS: k: 5, alfa: 150, K: 2, metodo: PCA + kNN
Tiempo PCA: 0.072305
Tiempo Knn: 0.000093
Promedio de aciertos: 100.000000
Precision: 1.000000
Recall: 1.000000

Y acá está calculando PCA por primera vez para la partición. En experimentos sucesivos que usen la misma partición, ya no va a hacer falta.

franco-metnum commented 6 years ago

acá está lo que tarda PCA la primera vez: 3e77da6

franco-metnum commented 6 years ago

ya está