为LSTMS(python)制作时间步时的内存错误

时间:2017-07-22 07:43:26

标签: numpy memory-management keras python-3.5 lstm

这是我用来形成我的lstm输入的功能

需要两个输入rucio_data(一个2-d numpy数组)和durations(一维numpy数组)。 rucio_data数组的大小约为(2000000,9)。

def prepare_model_inputs(rucio_data,durations, num_timesteps=50):                                                                                                                                                                                                     

print(rucio_data.shape[0], durations.shape)                                                                                    
n_examples = rucio_data.shape[0]                                                                                               
n_batches = (n_examples - num_timesteps +1)                                                                                    
print('Total Data points for training/testing : {} of {} timesteps each.'.format(n_batches, num_timesteps))                    

inputs=[]                                                                                                                      
outputs=[]                                                                                                                     
for i in range(0,n_batches):                                                                                                   
    v = rucio_data[i:i+num_timesteps]                                                                                          
    w = durations[i+num_timesteps-1]                                                                                           
    inputs.append(v)                                                                                                           
    outputs.append(w)                                                                                                          
print(len(inputs))                                                                                                             
inputs = np.stack(inputs)                                                                                                      
outputs = np.stack(outputs)                                                                                                    
print(inputs.shape, outputs.shape)                                                                                             

return inputs, outputs

问题是我的系统在inputs=np.stack(inputs)步骤耗尽了内存。

我需要一种更有效的内存方式。

1 个答案:

答案 0 :(得分:2)

为什么不尝试为每次调用生成一批缩小的大小,而不是准备好对一个变量的所有输入。

In [1]: def prepare_model_inputs(rucio_data,durations, batch_size=150, num_timesteps=50):
   ...:     n = rucio_data.shape[0]
   ...:     while True:
   ...:         inputs, outputs =[], []
   ...:         for i in range(0, n, batch_size):
   ...:             inputs = rucio_data[i:i+batch_size] #batch_size is 3xnum_timesteps
   ...:             outputs = durations[i+num_timesteps-1]
   ...:             # split your inputs, and outputs as you wish
   ...:                             
   ...:             yield inputs, outputs

现在,在您的火车脚本上,您可以调用此生成器将数据提供给您的模型。在keras中,这会产生类似的结果:

>> generator = prepare_model_inputs(rucio_data,durations)
>> model.fit_generator(generator,...)