Tensorflow:仅在需要时将图像加载到内存中

时间:2018-04-26 07:54:03

标签: python image memory tensorflow load

我使用TensorFlow V1.7和新的高级Estimator接口。我能够使用自己的数据集创建和训练自己的网络。

然而,我用来加载图片的政策对我来说似乎并不合适。 到目前为止我使用的方法(很大程度上受到MNIST教程的启发)是从一开始就将所有图像加载到内存中 (这是一个很小的代码片段,可以给你一个想法):

    for filename in os.listdir(folder):
        filepath = os.path.join(folder, filename)
        # using OpenCV to read image
        images.append(cv2.imread(filepath, cv2.IMREAD_GRAYSCALE))
        labels.append(<corresponding label>)

    # shuffle samples and labels in the same way
    temp = list(zip(images, labels))
    random.shuffle(temp)
    images, labels = zip(*temp)

    return images, labels

这意味着我必须在训练网之前将所有训练集加载到内存中,包含32k图像。 但是,由于我的批量大小为100,因此网络一次不需要超过100张图像。

这种做法对我来说似乎很奇怪。据我所知,这种方式只能访问一次二次存储器,从而最大限度地提高性能;但是,如果我的数据集非常大,这可能会使我的内存过载,不能吗?

因此,我想使用一种懒惰的方法,只在需要时加载图像(即当它们碰巧是一批时)。 我怎样才能做到这一点?我搜索过TF文档,但到目前为止我还没有找到任何内容。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:2)

建议使用Dataset模块,该模块为您提供使用队列,将少量示例预取到内存,线程数等等的能力(除其他外)。