首页 > 解决方案 > 尝试创建从多个文件加载并将数据拆分为训练/验证的 tensorflow 数据集管道时出现 RAM 问题

问题描述

我正在尝试为多输出回归 CNN 构建管道。输入非常大,不适合内存,所以我在磁盘上得到了不同的 tf.data.Datasets,我正在加载它们以用于训练。

当我加载数据时,我并不知道我拥有的样本数量,所以我尝试实施@phemmer建议的这个解决方案。但是,RAM 在第一批用于训练之前就已满,我无法让它运行。这是导致 RAM 问题的加载管道的代码:

element_spec = (
    tf.TensorSpec(shape=(32, 27), dtype=float32),
    tf.TensorSpec(shape=(20000), dtype=float64)
)

files = [join(dir, f) for f in listdir(dir) if ".dataset" in f]

files_ds = tf.data.Dataset.from_tensor_slices(files)
dataset =  files_ds.interleave(
    lambda path:
    tf.data.experimental.load(
     path=path,
     element_spec=element_spec,
     compression='GZIP'
    )
).shuffle(10000)

train_split = 0.8
frac = Fraction(train_split)
train_split = frac.numerator
val_split = frac.denominator - frac.numerator

dataset_train = dataset.window(train_split, train_split + val_split)\
    .flat_map(lambda *ds: ds[0] if len(ds) == 1 else tf.data.Dataset.zip(ds))\
    .batch(1024)\
    .prefetch(tf.data.experimental.AUTOTUNE)

dataset_validation = dataset.skip(train_split).window(val_split, train_split + val_split)\
    .flat_map(lambda *ds: ds[0] if len(ds) == 1 else tf.data.Dataset.zip(ds)) \
    .batch(1024)\
    .prefetch(tf.data.experimental.AUTOTUNE)

然而,当我用下面的代码替换代码的最后一部分(拆分为训练/验证)时,它在同一台机器上运行,根本没有 RAM 问题。此代码可以正常工作:

train_size = int(0.8 * dataset_size)
val_size = int(0.2 * dataset_size)

dataset_train = dataset.take(train_size).batch(1024).prefetch(tf.data.experimental.AUTOTUNE)

dataset_validation = dataset.skip(val_size).batch(1024).prefetch(tf.data.experimental.AUTOTUNE)

我假设我在设置管道的顺序上犯了一些错误。

可能有用的附加信息:

  1. 除了 RAM 问题,我还遇到以下错误消息:
E tensorflow/core/framework/dataset.cc:825] Unimplemented: Cannot merge options for dataset of type LoadDataset, because the dataset does not implement InputDatasets.
  1. 我正在使用具有 High Ram 设置的 GPU 实例在 Colab Pro 上训练模型(不要判断,我没有任何其他选择)。

如果有任何进一步的信息或代码来回答这个问题,请告诉我。

标签: pythontensorflowramtensorflow-datasets

解决方案


推荐阅读