我有一行代码如下:
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
,它会耗尽内存。它适用于10 000,但不是6万。
有没有办法避免这种情况?
我试过了:
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(这是不正确的)。
答案 0 :(得分:1)
虽然这不是内联的答案,但它仍然可以解决您的问题:
您确定mean
而非argmax
的内存不足吗?
test_y
中的每个附加维度都将存储您正在使用的任何数据类型的额外N个数量。假设您的数据中有5个维度,您必须存储5N值(可能是浮点数)。 self.predictor(test_x)
的结果将占用内存的第6个N.作为条件的答案的临时数组是第7个N.我实际上并不知道np.mean
的内存使用情况,但我认为它不是另一个N.但是对于参数为了这个,我们应该说。如果你只是内联np.mean
,那么你只需要节省N个内存,而你已经需要7N的价值。
另外,尝试在前一步骤中将np.argmax(test_y, axis=1)
拉出到中间变量中,并在计算argmax后再次引用test_y
,以便test_y
收集垃圾。 (或者做任何python 3强制删除该变量的操作)这应该可以节省数据的维数减去1 N的内存使用量。 (你的内存使用率会下降到3N左右或4N左右,这比内嵌np.mean
更好。
我假设运行self.predictor(test_x)
只需要1N。如果需要更多,那么以同样的方式将其拉出到自己的中间变量中也会有所帮助。
如果仍然不够,仍然将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
可能有更有效的方法来执行相同的操作。这是您尝试的第二件事,但累积了聚合而没有存储一个额外的数组)
这样,您还可以节省存储因条件而产生的临时布尔列表的需要。
如果仍然不够,您将不得不从根本上改变您存储实际和目标结果的方式,因为问题变得无法满足目标并将结果记录下来。