Python 来自生成器的tensorflow数据集

Python 来自生成器的tensorflow数据集,python,tensorflow,Python,Tensorflow,我正在使用这样的代码递归地从目录加载图像,并获得相关的标签-目录名。但当我有更多的图像,它崩溃由于内存错误。我想用发电机,但我实在受不了。有人能帮忙吗?不带发电机的代码为: import pathlib import random data_dir = "./images" print(data_dir) data_root = pathlib.Path(data_dir) all_image_paths = list(data_root.glob('*/*')) all_image_pat

我正在使用这样的代码递归地从目录加载图像,并获得相关的标签-目录名。但当我有更多的图像,它崩溃由于内存错误。我想用发电机,但我实在受不了。有人能帮忙吗?不带发电机的代码为:

import pathlib
import random

data_dir = "./images"

print(data_dir)
data_root = pathlib.Path(data_dir)
all_image_paths = list(data_root.glob('*/*'))
all_image_paths = [str(path) for path in all_image_paths]

label_names = sorted(item.name for item in data_root.glob('*/') if item.is_dir())
label_to_index = dict((name, index) for index,name in enumerate(label_names))

all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_image_paths]

path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
image_ds = path_ds.map(load_and_preprocess_image, num_parallel_calls=8)
label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64))
dataset = tf.data.Dataset.zip((image_ds, label_ds))
dataset = dataset.shuffle(params.train_size)buffer
dataset = dataset.repeat(params.num_epochs)
dataset = dataset.batch(params.batch_size)
dataset = dataset.prefetch(1) to serve

return dataset
您不需要从_生成器使用tf.data.Dataset.from。使用tf.data.dataset.from_tensor_slices从图像创建数据集将数据块作为tf.constant写入图形中,从而浪费内存。使用足够大的数据集,您可以达到Tensorflow的2GB GraphDef限制。 您只需要使用占位符定义数据集

features_placeholder = tf.placeholder(features.dtype, features.shape)
labels_placeholder = tf.placeholder(labels.dtype, labels.shape)

dataset = tf.data.Dataset.from_tensor_slices((features_placeholder, labels_placeholder))
正如这里所解释的

您的代码可能没有问题。。您可能有太大的洗牌缓冲区。如果您拥有tensorflow操作中的所有内容,而python中没有任何内容,那么为什么要使用generator?我对tensorflow不是很有经验,我更喜欢Keras。我试图使用Facenet实现来学习224,3图片的嵌入。当我使用2000张图片时,就可以了。但我需要25k和更高版本的250k照片。即使我有像5k这样的图片,代码也会冻结。我将尝试删除洗牌,也许会有帮助,也许只是尝试一次添加一行代码,看看是哪行导致冻结。如果您在其中使用python函数,那么加载和预处理图像也可能会有一些副作用。好的,所以我删除了shuffle行,我能够处理500k图像。谢谢我试试看。谢谢你,这无关紧要。他只将“数据集切片”用于总共不应超过2gb的图像路径。这是官方文档中的常见做法。缓冲区大小可能会影响数据解析,但250K图像的数量太小,不会导致任何问题,因为图像的大小大约为224,3英寸size@TomasBatrla,让我们随时了解它的最新工作原理。大型数据集应在运行中处理。。您从文档中引用的内容是用于小数据集和足够大的RAM之间的内容。但这甚至无关紧要,因为这个示例并没有将数据集加载到RAM中。它只加载最多几兆字节的文件名。