Keras:带有自定义生成器的badalloc

时间:2018-07-11 20:18:56

标签: python-3.x tensorflow keras

我在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])

生成器应该比加载所有内容具有更好的内存管理,但是事实并非如此!有什么想法吗?

1 个答案:

答案 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()
相关问题