np.concatenate的内存错误

3
当我在 iPython 笔记本中运行以下代码时:

_x = np.concatenate([_batches.next() for i in range(_batches.samples)])

我收到了这个错误信息。
---------------------------------------------------------------
MemoryError                   Traceback (most recent call last)
<ipython-input-14-313ecf2ea184> in <module>()
----> 1 _x = np.concatenate([_batches.next() for i in 
range(_batches.samples)])

MemoryError:

迭代器有9200个元素。

next(_batch) 返回一个形状为(1, 400, 400, 3)的np.array。

我有30GB RAM和16GB GPU。

在使用Keras的predict_generator()时,我遇到了类似的问题。我运行以下代码:

bottleneck_features_train = bottleneck_model.predict_generator(batches, len(batches), verbose=1) 

当使用verbose=1时,我可以看到进度指示器一直在运行,但是接下来我遇到了以下错误:

2300/2300 [==============================] - 177s 77ms/step
---------------------------------------------------------------
MemoryError                   Traceback (most recent call last)
<ipython-input-19-d0e463f64f5a> in <module>()
----> 1 bottleneck_features_train = 
bottleneck_model.predict_generator(batches, len(batches), verbose=1)

~/anaconda3/lib/python3.6/site-packages/keras/legacy/interfaces.py in 
wrapper(*args, **kwargs)
     85                 warnings.warn('Update your `' + object_name +
     86                               '` call to the Keras 2 API: ' + 
signature, stacklevel=2)
---> 87             return func(*args, **kwargs)
     88         wrapper._original_function = func
     89         return wrapper

~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in 
predict_generator(self, generator, steps, max_queue_size, workers, 
use_multiprocessing, verbose)
   2345                 return all_outs[0][0]
   2346             else:
-> 2347                 return np.concatenate(all_outs[0])
   2348         if steps_done == 1:
   2349             return [out for out in all_outs]

MemoryError: 

你能提供一个解决这个内存问题的方案吗?谢谢!


是的,你说得对,这也是第二个错误的原因。大小不同,但数据也太大了。谢谢你的回答! - And
好的,Keras 的东西被称为“生成器”,可能表明它被设计成内存高效,但我对此一无所知。我会发布一个实际的答案,这样你就可以关闭问题了。 - user7138814
1个回答

2
对于第一个错误,数据量太大了。假设数据类型为int64或float64(每个元素8字节),总数据量为9200*400*400*3*8字节,即35GB。所有这些数据都被分块收集,然后通过连接复制到一个大数组中。
您可以预先分配数组,也许它会起作用:
x_ = np.empty((9200,400,400,3))
for i in range(9200): 
    x_[i] = batches.next()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接