使用Keras的fit_generator - 一次传递一个小批量数据

2024-06-26 14:28:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在大型数据集上运行的模型——从大数据标准来看并不是那么大,但比我的家庭服务器在内存中所能容纳的要多得多。{1}一次装入一个小的数据块,这样我就永远不会在一次内存中存储一次。在

。。。至少,这是理论。但是,当Keras在Epoch 1/10上挂起时,甚至没有启动“训练”动画,我(最终)出现内存不足的异常——小批量很大,但我仍然可以在内存中同时保存其中几个而不会出现问题——我产生了怀疑,并将一堆测试语句print放入我的生成器中。瞧,凯拉斯在启动之前已经调用了三到四次发电机(似乎启动了?)。在

所以。。。这是怎么回事?这是正常的,还是我的生成器实现错误了?我怎样才能不尝试一次加载多个批次?在

代码如下,以防有帮助:

def data_gen(directory):
    def epsilon_div(x, y):
        return (x + K.epsilon()) / (y + K.epsilon())

    while(True):
        filelist = os.listdir(directory + "/data")
        order = np.random.permutation(len(filelist))

        for i in order:
            dataf = directory + "/data/" + filelist[i]
            labelf = directory + "/labels/" + filelist[i]

            with open(dataf, 'rb') as f:
                databook = sb.Songbook.FromString(f.read())

            with open(labelf, 'rb') as f:
                labelbook = sb.Songbook.FromString(f.read())

            print('Booked')

            l, _, r, _ = sb_np_extract(databook)
            ll, _, lr, _ = sb_np_extract(labelbook)

            databook = None
            labelbook = None

            print('Extracted')

            l = l.transpose([0, 2, 1])
            r = r.transpose([0, 2, 1])
            ll = ll.transpose([0, 2, 1])
            lr = lr.transpose([0, 2, 1])

            print('Chosen')

            mask_l = epsilon_div(ll, l)
            mask_r = epsilon_div(lr, r)

            print('Done')

            yield [[l, r], [mask_l, mask_r]]

Tags: 数据内存divdatanpmaskdirectorysb
1条回答
网友
1楼 · 发布于 2024-06-26 14:28:39

我建议您将文件名保存在一个数组中,然后对其进行无序处理。我用完整路径调用文件列表,并对listname_datalistname_labels进行无序处理。在

步骤=文件数

def发生器(步骤):

i = 1

while True:

     dataf = filelist_data[i]
     labelf = filelist_labels[i]

     ...

     if i == steps:

        i = 1
        c = list(zip(listname_data,listname_data))

        shuffle(c)

        listname_data, listname_data = zip(*c)

     else:

        i +=1

     yield [[l, r], [mask_l, mask_r]]

相关问题 更多 >