用于Keras / Tensorflow培训的生成器包括sqlite3连接,该连接产生与线程相关的错误

时间:2017-10-12 01:22:36

标签: multithreading sqlite keras

摘要:我编写了一个有时yields与开放sqlite3连接的生成器。但是,我不启用多线程。尽管如此,我收到一个错误,表明我的sqlite3数据库连接被多个线程访问。该怎么办?

我试图像这样训练一个模型:

model3.fit_generator(train_gen3, round(TOTAL_SIZE * (1 - VALID_PCT) / BATCH_SIZE), 
                epochs = 1, verbose = 1, 
                validation_data = valid_gen3, validation_steps = round(TOTAL_SIZE * VALID_PCT / BATCH_SIZE))

请注意,我保留了默认的use_multiprocessing设置,这意味着它应该根据Keras documentation设置为false。然而,在我的第一个训练时代结束时,这个错误被吐出:

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140487084246784 and this is thread id 140468885124864

在我的生成器中,我确实打开sqlite3连接,如下所示:

 with sqlite3.connect(self.data_dir + f) as conn:
                            results = conn.execute("SELECT * FROM tbl")
                            rows = results.fetchall()
                            df = pd.DataFrame(rows)
...

                                if len(x_return_list) == batch_size:
                                    yield (np.array(x_return_list), np.array(y_return_list))
                                    x_return_list = []
                                    y_return_list = []

所以我确实以一个开放的sqlite3连接屈服,但我认为这不应该是一个问题,因为我没有启用任何形式的线程/多处理。这里发生了什么,最好的解决方法是什么?

0 个答案:

没有答案