python - 尝试创建从多个文件加载并将数据拆分为训练/验证的 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)
我假设我在设置管道的顺序上犯了一些错误。
可能有用的附加信息:
- 除了 RAM 问题,我还遇到以下错误消息:
E tensorflow/core/framework/dataset.cc:825] Unimplemented: Cannot merge options for dataset of type LoadDataset, because the dataset does not implement InputDatasets.
- 我正在使用具有 High Ram 设置的 GPU 实例在 Colab Pro 上训练模型(不要判断,我没有任何其他选择)。
如果有任何进一步的信息或代码来回答这个问题,请告诉我。
解决方案
推荐阅读
- wxpython - 如何设置 wx.TextEntryDialog 按钮的标签
- java - Spring Boot公共库项目中的单元测试
- java - 似乎无法让 Eclipse IDE 在我的 Mac 上找到 geckodriver
- c# - 如何从 CSV 文件中获取特定列的索引 ID
- node.js - 如何绕过express中的中间件
- qt - 使用 Qt 和 cmake 构建非控制台 Windows 应用程序
- python - 如何保留当前的 tkinter 窗口并使用按钮更新它?
- javascript - 在 Angular 2+ 中进行 DOM 操作的正确方法
- python - 使用 Pandas 的唯一连接数据框
- android - 空指针异常 - 动态壁纸