dot*_*ace 5 python sql postgresql machine-learning
我正在研究图像复制库,它使用机器学习来预测图像相似度。在此过程中, 均方根用于计算两个图像之间的相似度(我不讨论如何计算)。执行此操作的函数如下所示。
# 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 err
Run Code Online (Sandbox Code Playgroud)
当我在包含 5K 图像的文件夹上测试时,我的模型运行良好,但花费了太多时间。所以我决定重构我的代码并将所有张量存储在数据库中。为什么?
如果我将所有图像的张量存储在数据库中而不是用它查询即将到来的图像张量,我将很快得到结果。一遍又一遍地循环所有图像+将一个图像的RMS与其他图像进行匹配将产生许多组合,这将需要时间。
解决方案
如果我存储列表或数组的所有张量并将它们存储在像 Postgres 这样的数据库中,那么我可以轻松地使用RMS查询它们,以便一次获取所有图像,而不是循环遍历它们并找出口是心非。
我需要你的帮助来弄清楚是否有任何方法可以查询 Postgres 以获取具有最接近RMS 的图像
像这样的东西:
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_ACCOUNT
Run Code Online (Sandbox Code Playgroud)
类似的问题:直接从表中获取数据时获取 RMSE 分数。为此编写一个查询
这就是数据库的样子
如果我理解您想要正确执行的操作,您只需创建一个列来保存 RMSE 计算,然后更新表来进行计算。
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);
Run Code Online (Sandbox Code Playgroud)
编辑:我没有注意到分组依据。我认为这会正确创建一个预先计算的字段,尽管它可能非常低效,因为我相信它会为每个 ID_PARTNER ID_ACCOUNT 对重新计算。在 SQL 中可能有更好的方法来做到这一点。然后,我将SELECT DISTINCT ID_PARTNER, ID_ACCOUNT from table_name
在代码中运行它,并为每个值的SELECT SQRT(Avg( POWER(Act_F_1 - Pred_F_1 , 2) ) ) from table_name where ID_PARTNER=? and ID_ACCOUNT=?
每个元组运行一遍。update table_name set RMSE=?
或者,您可以有一个仅包含 ID_PARTNER、ID_ACCOUNT、RMSE 的表,然后将结果放入其中一次。
然后数据库中的表将包含所有预先计算的值,您可以对其运行查询。如果您想要接近 search_RMSE 值的值
SELECT ...,ABS(RMSE - search_RMSE) as RMSE_DIFF from table_name order by RMSE_DIFF;
Run Code Online (Sandbox Code Playgroud)
这不一定是进行计算的超级优化方法。您谈到口是心非,这意味着您正在寻找相同的值,但您的计算是浮点的,因此您甚至可能最终得到应该相同的值,但最终不会那样。您只关心最接近的值还是关心多个最接近的值?如果您只是创建一个巨大的表并按 RMSE 对其进行排序,则每行的最接近值将是其上方的行或下方的行,并且最接近值的集合将只是从该行向上和向下增长。
我不完全确定为什么要在其中涉及数据库,除非您无法将所有数据放入内存中。如果是这种情况,您可以将原始数据放入数据库中,然后使用通过 order by 子句引用的选择,并将其存储在数据库外部的块中(如果您愿意)。
无论如何,有很多方法可以做到这一点,我自己只是使用 cython 模块来避免 python 中极其缓慢的数学运算(它明显比 numpy 快,并且几乎与 python 相同),并使用内存数据结构和完成所有这些操作也许是一些临时文件。
归档时间: |
|
查看次数: |
660 次 |
最近记录: |