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

Tensorflow: load images into memory only when needed

我正在使用带有新的高级 Estimator 界面的 TensorFlow V1.7。我能够使用自己的数据集创建和训练自己的网络。

但是,我用来加载图像的策略对我来说似乎并不合适。 到目前为止我使用的方法(很大程度上受到 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 张图像。

这种方法对我来说似乎很奇怪。我知道这种方式只能访问一次辅助内存,从而最大限度地提高性能;但是,如果我的数据集真的很大,这可能会使我的 RAM 超载,不是吗?

因此,我想使用一种懒惰的方法,只在需要时加载图像(即当它们恰好在一个批次中时)。 我怎样才能做到这一点?我已经搜索了 TF 文档,但到目前为止我还没有找到任何东西。

有没有我遗漏的东西?

建议使用 Dataset 模块,它使您能够(除其他外)使用队列、将少量示例预取到内存、线程数等等。