Python 3.x tensorflow中的海量数据批处理

Python 3.x tensorflow中的海量数据批处理,python-3.x,tensorflow,Python 3.x,Tensorflow,我正在尝试使用来自的代码/教程执行二进制分类 这里的示例从IMDB电影评论加载数据。我有自己的文本形式的数据集,大约2GB。现在在这个例子中 x_train_变量,y_train,x_test_变量,y_test=imdb.load_datanum_words=vocab_size尝试将整个数据集加载到内存中。如果我尝试做同样的事情,我会耗尽内存。如何重新构造此逻辑以从磁盘中批量读取数据?您想更改dataset=tf.data.dataset.from\u tensor\u slicesx\u

我正在尝试使用来自的代码/教程执行二进制分类

这里的示例从IMDB电影评论加载数据。我有自己的文本形式的数据集,大约2GB。现在在这个例子中 x_train_变量,y_train,x_test_变量,y_test=imdb.load_datanum_words=vocab_size尝试将整个数据集加载到内存中。如果我尝试做同样的事情,我会耗尽内存。如何重新构造此逻辑以从磁盘中批量读取数据?

您想更改dataset=tf.data.dataset.from\u tensor\u slicesx\u train、x\u len\u train、y\u train行。有很多方法可以创建数据集-从张量切片是最简单的,但是如果无法将整个数据集加载到内存中,则无法单独工作

最好的方法取决于您如何存储数据,或者您希望如何存储/操作数据。我认为,除非在多个GPU上运行,否则最简单的方法是让原始数据集只为数据提供索引,并编写一个普通的numpy函数来加载第i个示例

dataset = tf.data.Dataset.from_tensor_slices(tf.range(epoch_size))

def tf_map_fn(i):
    def np_map_fn(i):
        return load_ith_example(i)

    inp1, inp2 = tf.py_func(np_map_fn, (i,), Tout=(tf.float32, tf.float32), stateful=False)
    # other preprocessing/data augmentation goes here.

    # unbatched sizes
    inp1.set_shape(shape1)
    inp2.set_shape(shape2)
    return inp1, inp2

dataset = dataset.repeat().shuffle(epoch_size).map(tf_map_fn, 8)

dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)  # start loading data as GPU trains on previous batch

inp1, inp2 = dataset.make_one_shot_iterator().get_next()
这里我假设你的输出是float32张量Tout=。。。。set_shape调用并不是绝对必要的,但如果您知道该形状,它会做更好的错误检查

只要预处理的运行时间不超过网络的运行时间,它就应该和单个GPU机器上的任何其他方法一样快


另一个明显的方法是将数据转换为tfrecords,但这会占用更多磁盘空间,而且如果您问我的话,管理起来会更麻烦。

有没有我可以实现的示例。顺便说一下,如果我们考虑IMDB数据集的话,这个地图会在什么情况下起作用?下面是keras中加载函数的实现,我发布了一个类似的、更扩展的答案。我不熟悉imdb,但这个答案中的示例只要求您使用示例实现load_。您可能需要更改如何将数据存储在磁盘上,或者将它们写入TFRead中,就像刚才链接的另一个答案中所解释的那样。
dataset = tf.data.Dataset.from_tensor_slices(tf.range(epoch_size))

def tf_map_fn(i):
    def np_map_fn(i):
        return load_ith_example(i)

    inp1, inp2 = tf.py_func(np_map_fn, (i,), Tout=(tf.float32, tf.float32), stateful=False)
    # other preprocessing/data augmentation goes here.

    # unbatched sizes
    inp1.set_shape(shape1)
    inp2.set_shape(shape2)
    return inp1, inp2

dataset = dataset.repeat().shuffle(epoch_size).map(tf_map_fn, 8)

dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)  # start loading data as GPU trains on previous batch

inp1, inp2 = dataset.make_one_shot_iterator().get_next()