我有一个Python类SceneGenerator
,它有多个成员函数用于预处理和生成器函数generate_data()
。基本结构如下:
class SceneGenerator(object):
def __init__(self):
# some inits
def generate_data(self):
"""
Generator. Yield data X and labels y after some preprocessing
"""
while True:
# opening files, selecting data
X,y = self.preprocess(some_params, filenames, ...)
yield X, y
我在keras的model.fit_generator()函数中使用类成员函数sceneGenerator.generate_data()从磁盘读取数据,对其进行预处理并输出。在keras中,如果将model.fit_generator()
的参数workers
设置为大于1的值,则会使用多个CPU线程。
现在我想在tensorflow中使用相同的SceneGenerator
类。我的当前方法是:
sceneGenerator = SceneGenerator(some_params)
for X, y in sceneGenerator.generate_data():
feed_dict = {ops['data']: X,
ops['labels']: y,
ops['is_training_pl']: True
}
summary, step, _, loss, prediction = sess.run([optimization_op, loss_op, pred_op],
feed_dict=feed_dict)
然而,这种方法较慢且不使用多个线程。我发现了tf.data.Dataset
API以及一些文档,但我无法实现这些方法。
编辑:请注意,我不处理图像,因此具有文件路径等的图像加载机制在此处不起作用。我的SceneGenerator
从hdf5文件中加载数据。但不是完整的数据集,而是根据初始化参数只加载部分数据集。我想保留生成器函数的基本形式,并了解如何将其直接用作tensorflow的输入,并在CPU上运行多个线程。将数据从hdf5文件重写为csv不是一个好选择,因为它会复制大量数据。
编辑2:我认为类似于这样的方法可能有所帮助:parallelising tf.data.Dataset.from_generator