这是我用来形成我的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)
步骤耗尽了内存。
我需要一种更有效的内存方式。
答案 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,...)