我在Ubuntu 17.04 VM上使用带有tensorflow-gpu后端的keras。 我创建了一个自定义生成器,以从泡菜文件中读取输入和类,但是似乎出现以下错误:
抛出'std :: ba实例后调用terminate d_alloc' what():std :: bad_alloc
加载数据的代码可以在这里查看:
def data_gen(self, pklPaths, batch_size=16):
while True:
data = []
labels = []
for i, pklPath in enumerate(pklPaths):
# print(pklPath)
image = pickle.load(open(pklPath, 'rb'))
for i in range(batch_size):
# Set a label
data.append(image[0][0])
labels.append(image[1][1])
yield np.array(data), np.array(labels)
然后在火车部分,我正在使用拟合发生器:
vm_model.fit_generator(vm.data_gen(pkl_train), validation_data=vm.data_gen(pkl_validate), epochs=15, verbose=2,
steps_per_epoch=(5000/16), validation_steps=(1000/16), callbacks=[tb])
生成器应该比加载所有内容具有更好的内存管理,但是事实并非如此!有什么想法吗?
答案 0 :(得分:0)
好的,所以我找到了问题,所以我在回答自己的问题。 基本上,上一个循环有一个不必要的循环,并且还不断增加数据的大小,而标签实际上将整个数据加载到内存中。
def data_gen(self, pklPaths, batch_size=16):
while True:
data = []
labels = []
for i, pklPath in enumerate(pklPaths):
# load pickle
image = pickle.load(open(pklPath, 'rb'))
# append
data.append(image[0][0])
labels.append(image[1])
# if batch is complete yield data and labels and reset
if i % batch_size == 0 and i != 0:
yield np.array(data), np.array(labels)
data.clear()
labels.clear()