脾气暴躁的意思是“就地”

佐恩

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

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,它运行的内存不足。它可以正常工作10000,但不能工作60000。

有办法避免这种情况吗?

我尝试了这个:

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(不正确)。

格林科学家

1级:

尽管这不是内联处理的答案,但仍可能是您的问题的答案:

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

每个额外的维度test_y将存储N个您要使用的数据类型的N个。假设数据中有5个维度,则必须存储5N个值(可能是浮点型)。您的结果self.predictor(test_x)将占用内存的第六个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,这比通过内联just可以达到的更好np.mean

我假设运行self.predictor(test_x)只需要1N。如果花费更多,那么以同样的方式将其拉入自己的中间变量也将有所帮助。

2级:

如果这还不够,请仍然将yournp.argmax(test_y, axis=1)和theself.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可能有一种更有效的方法来执行相同的操作。这是您尝试的第二件事,但是在不存储其他数组的情况下累积了聚合)这样,您还将节省需要存储由条件产生的布尔值的临时列表。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章