gpt4 book ai didi

python - Numpy 表示 'inplace'

转载 作者:行者123 更新时间:2023-11-28 18:34:33 27 4
gpt4 key购买 nike

我有一行代码看起来像这样:

te_succ_rate = np.mean(np.argmax(test_y, axis=1) == self.predictor(test_x))

其中 test_y 是数组的 numpy 数组,self.predictor(test_x) 返回一个 numpy 数组。整行代码返回 test_y 中子数组的百分比,其最大值等于从 self.predictor(test_x) 返回的数组中相应位置的值.

问题是对于大尺寸的 test_ytest_x,它会耗尽内存。它适用于 10 000,但不适用于 60 000。

有没有办法避免这种情况?

我试过这个:

tr_res = []
for start, end in zip(range(0, len(train_x), subsize), range(subsize, len(train_x), subsize)):
tr_res.append(self.predictor(train_x[start:end]))
tr_res = np.asarray(tr_res)
tr_res = tr_res.flatten()
tr_succ_rate = np.mean(np.argmax(train_y, axis=1) == tr_res)

但它不起作用,因为结果不知何故为 0(这是不正确的)。

最佳答案

一级:

虽然这不是内联的答案,但它可能仍然是您问题的答案:

您确定内存不足的原因是 mean 而不是 argmax

test_y 中的每个附加维度都将存储额外的 N 个数据类型。假设您的数据中有 5 个维度,您必须存储 5N 个值(大概是 float )。 self.predictor(test_x) 的结果将占用第 6 个 N 的内存。作为条件答案的临时数组是第 7 个 N。我实际上不知道 np.mean 的内存使用情况是什么,但我认为它不是另一个 N。但为了论证,假设是。如果您仅内联 np.mean,您最多只能节省 N 的内存,而您已经需要 7N 的内存了。

或者,尝试将您的 np.argmax(test_y, axis=1) 拉出到上一步中的中间变量中,之后不要再次引用 test_y计算 argmax 以便 test_y 被垃圾收集。 (或执行任何 python 3 强制删除该变量的操作)这应该为您节省数据的维数减去 1 N 的内存使用量。 (您将减少大约 3N 或最多 4N 的内存使用量,这比仅内联 np.mean 所能达到的效果要好。

我假设运行 self.predictor(test_x) 只需要 1N。如果需要更多,然后以相同的方式将其拉出到它自己的中间变量中也会有所帮助。

2 级:

如果这还不够,仍然将你的 np.argmax(test_y, axis=1)self.predictor(test_x) 拉出它们自己的变量,然后自己遍历两个数组并自己进行条件和聚合。像这样的东西:

sum = 0.
n = 0
correct_ans = np.argmax(test_y, axis=1)
returned_ans = self.predictor(test_x)
for c, r in zip(correct_ans, returned_ans):
if c == r:
sum += 1
n += 1
avg = sum / n

(不确定 zip 是否是最好的方法。np 可能有更有效的方法来做同样的事情。这是你尝试的第二件事,但在不存储额外数组的情况下累积聚合)这样,您还无需存储条件生成的临时 bool 值列表。

如果这还不够,您将不得不从根本上改变存储实际结果和目标结果的方式,因为问题是您无法仅将目标和结果放入内存。

关于python - Numpy 表示 'inplace',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33739541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com