Estoy trabajando en la biblioteca de duplicación de imágenes que usa ML para predecir la similitud de la imagen. En este proceso, Root Mean Square se usa para calcular la similitud entre dos imágenes (no voy a explicar cómo). La función que lo hace se parece a esto.
# Function that calulates the mean squared error (mse) between two image matrices def _mse(imageA, imageB): err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2) err /= float(imageA.shape[0] * imageA.shape[1]) return errMi modelo funcionó bien cuando lo probé en carpetas que contenían imágenes de 5K, pero tomó demasiado tiempo. Así que decidí refactorizar mi código y almacenar todos los tensores en una base de datos. ¿Por qué?
Si almaceno los tensores de todas las imágenes en una base de datos y luego consulto el tensor de la próxima imagen, obtendré resultados rápidamente. Repasar todas las imágenes una y otra vez + emparejar una imagen RMS con otras dará como resultado muchas combinaciones que llevarán tiempo.
Solución
Si almaceno todos los tensores que son una lista o una matriz y los almaceno en una base de datos como Postgres, entonces puedo consultarlos fácilmente con RMS wrt para obtener todas las imágenes a la vez que recorrerlas y descubrir la duplicidad.
Necesito su ayuda para averiguar si hay alguna forma de consultar a Postgres para obtener imágenes con el RMS más cercano.
Algo como esto:
SELECT ID_PARTNER, ID_ACCOUNT , SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) as feature_1_rmse FROM ... GROUP BY ID_PARTNER, ID_ACCOUNTPregunta similar: obtenga la puntuación RMSE mientras obtiene datos de la tabla directamente. Escriba una consulta para eso
Así es como se ve la base de datos
Si entiendo lo que quiere hacer correctamente, solo necesita crear una columna para contener el cálculo de RMSE y luego actualizar la tabla para hacer el cálculo.
UPDATE table_name as orig set RMSE=(select SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) from table_name as copy where orig.ID_PARTNER=copy.ID_PARTNER and orig.ID_ACCOUNT=copy.ID_ACCOUNT GROUP BY ID_PARTNER, ID_ACCOUNT); editar: no me había dado cuenta del grupo. Creo que esto crea un campo precalculado correctamente, aunque probablemente sea muy ineficiente, ya que creo que se volverá a calcular para cada par ID_PARTNER ID_ACCOUNT. Puede haber una mejor manera de hacer esto en SQL. Simplemente SELECT DISTINCT ID_PARTNER, ID_ACCOUNT from table_name luego ejecutaría eso en el código y SELECT SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) from table_name where ID_PARTNER=? and ID_ACCOUNT=? para cada una de las tuplas que he update table_name set RMSE=? para cada uno de esos valores. Alternativamente, podría tener una tabla que sea solo ID_PARTNER, ID_ACCOUNT, RMSE y solo poner los resultados allí una vez.
Luego, la tabla en la base de datos tendrá todos los valores precalculados y podrá ejecutar consultas en ella. Si quiere cosas cercanas a un valor de search_RMSE
SELECT ...,ABS(RMSE - search_RMSE) as RMSE_DIFF from table_name order by RMSE_DIFF;Esa no es necesariamente una forma súper optimizada de hacer los cálculos. Habla de duplicidad, lo que significaría que está buscando valores idénticos, pero sus cálculos son de punto flotante, por lo que incluso podría terminar con valores que deberían ser idénticos pero no terminar de esa manera. ¿Solo le importa el valor más cercano o le importa una cantidad de los valores más cercanos? Si solo crea una tabla gigante y la ordena por RMSE, el valor más cercano para cada fila será la fila de arriba o la fila de abajo y la colección de valores más cercanos crecerá hacia arriba y hacia abajo desde la fila.
No estoy del todo seguro de por qué quiere involucrar una base de datos en esto a menos que no pueda caber todos los datos en la memoria. Si ese es el caso, podría simplemente colocar los datos sin procesar en la base de datos y luego usar la selección a la que hace referencia con una cláusula order by y almacenarla en fragmentos fuera de la base de datos si lo desea.
De todos modos, hay muchas maneras de hacer esto, yo solo usaría un módulo cython para evitar las matemáticas extremadamente lentas en python (es notablemente más rápido que numpy y es casi idéntico a python) y hago todo esto con estructuras de datos en memoria y tal vez algunos archivos temporales.