我有一行代码看起来像这样:
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_y
和test_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(不正确)。
尽管这不是内联处理的答案,但仍可能是您的问题的答案:
您确定您的内存不足,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。如果花费更多,那么以同样的方式将其拉入自己的中间变量也将有所帮助。
如果这还不够,请仍然将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] 删除。
我来说两句