我正在尝试加载数据以优化对象检测+实例分割的模型。然而,使用tf.data.Dataset让我在加载实例分割掩码时有点头疼。对于一个小数据集,tf.data.Dataset正在使用服务器上的所有内存(大于128 GB)。
是否有一种方法可以有效地以更有效的内存方式加载数据,现在我们正在使用这段代码:
train_dataset, train_examples = dataset.load_train_datasets()
ds = (
train_dataset.shuffle(min(100, train_examples), reshuffle_each_iteration=True)
.map(dataset.decode, num_parallel_calls=args.num_parallel_calls)
.map(train_processing.prepare_for_batch, num_parallel_calls=args.num_parallel_calls)
.batch(args.batch_size)
.map(train_processing.preprocess_batch, num_parallel_calls=args.num_parallel_calls)
.prefetch(AUTOTUNE)
)
问题是,使用train_processing的第二个map调用。Prepare_for_batch(接受单个元素)和train_processing。Preprocess_batch(接受批处理元素)正在为使用所有内存的分段创建大量二进制掩码。
是否有办法重新组织映射函数以节省内存?我在想:1;取前100个样本,2。解码样本,3。准备一个样品的遮罩和边框。取其中的5个。每批数据的最后准备FIT一步/一批数据清除内存中的数据
手动
首先创建一个数据集中所有文件名的列表和数据集中所有标签的列表。
filenames = [abc.png, def.png, ...]
labels = [0, 1, ...]
然后从张量切片中创建数据集
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.shuffle(len(filenames))
dataset = dataset.map(PARSE_FUNCTION, num_parallel_calls=PARALLEL_CALLS)
dataset = dataset.batch(BATCH_SIZE)
dataset = dataset.prefetch(1)
通过函数
def dataset(csv, parse):
filenames = []
labels = []
for i, row in csv.iterrows():
filename = row[0]
filenames.append(filename)
label = row[1]
labels.append(label)
encoder = LabelEncoder()
labels = encoder.fit_transform(labels)
labels = np_utils.to_categorical(labels)
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.shuffle(len(filenames))
dataset = dataset.map(PARSE_FUNCTION, num_parallel_calls=PARALLEL_CALLS)
dataset = dataset.batch(BATCH_SIZE)
dataset = dataset.prefetch(1)
return dataset
免责声明:此方法假定csv的格式为