我有一个在大型数据集上运行的模型——从大数据标准来看并不是那么大,但比我的家庭服务器在内存中所能容纳的要多得多。{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]]
我建议您将文件名保存在一个数组中,然后对其进行无序处理。我用完整路径调用文件列表,并对
listname_data
和listname_labels
进行无序处理。在步骤=文件数
def发生器(步骤):
相关问题 更多 >
编程相关推荐