【发布时间】:2018-04-05 10:35:23
【问题描述】:
我正在尝试处理 Keras 中的大型训练数据集。
我将model.fit_generator 与从 SQL 文件读取数据的自定义生成器一起使用。
我收到一条错误消息,告诉我不能在两个不同的线程中使用 SQLite 对象:
ProgrammingError: SQLite objects created in a thread can only be used in that
same thread.The object was created in thread id 140736714019776 and this is
thread id 123145449209856
我尝试对 HDF5 文件执行相同操作,但遇到了分段错误,我现在认为这也与 fit_generator 的多线程字符有关(请参阅报告的错误 here)。
使用这些生成器的正确方法是什么,因为我认为对于不适合内存的数据集,必须从文件中批量读取数据是很常见的。
这里是生成器的代码:
class DataGenerator:
def __init__(self, inputfile, batch_size, **kwargs):
self.inputfile = inputfile
self.batch_size = batch_size
def generate(self, labels, idlist):
while 1:
for batch in self._read_data_from_hdf(idlist):
batch = pandas.merge(batch, labels, how='left', on=['id'])
Y = batch['label']
X = batch.drop(['id', 'label'], axis=1)
yield (X, Y)
def _read_data_from_hdf(self, idlist):
chunklist = [idlist[i:i + self.batch_size] for i in range(0, len(idlist), self.batch_size)]
for chunk in chunklist:
yield pandas.read_hdf(self.inputfile, key='data', where='id in {}'.format(chunk))
# [...]
model.fit_generator(generator=training_generator,
steps_per_epoch=len(partitions['train']) //
config['batch_size'],
validation_data=validation_generator,
validation_steps=len(partitions['validation']) //
config['batch_size'],
epochs=config['epochs'])
请参阅full example repository here。
感谢您的支持。
干杯,
本
【问题讨论】:
-
您找到解决问题的方法了吗?我有同样的...
-
到目前为止,我结束的解决方案是使用 model.train_on_batch 方法。
标签: python multithreading dataset deep-learning keras