将大数据加载到 TensorFlow 2.0 中,而不将其加载到 RAM 上

2023-11-23

我已经处理并保存了大量视频和音频文件数据集(大约 8 到 9 GB 的数据) 数据保存为 2 个 numpy 数组,每个数组对应一种模态 文件的形状为(number_of_examples、maximum_time_length、feature_length)

我想使用这些数据来训练我的神经网络以执行分类任务 我使用的是 TensorFlow 2.0 Beta 版本 我在 Google Colab 上运行所有代码(安装 tf-2.0 beta 后) 每次我在 tf.data 中加载数据时,都会使用虚拟机的整个 RAM,并强制重新启动会话。

以前的方法:

我尝试了两种方法

1)将两个变量全部加载到RAM中并将其转换为张量

2)将数据加载为内存映射数组(从磁盘)并将其加载到 tf.data

然而,这两种方法都会加载 RAM 并强制虚拟机重新启动

Code:

# Access the Audio memory from disk without loading
X_audio = np.memmap('gdrive/My Drive/Codes/audio_data.npy', dtype='float32', mode='r').reshape(2198,3860,74)

# Access the Video memory from disk without loading
X_video = np.memmap('gdrive/My Drive/Codes/video_data.npy', dtype='float32', mode='r').reshape(2198,1158,711)

# Load labels
with open('gdrive/My Drive/Codes/label_data_3','rb') as f:
    Y = pkl.load(f)

dataset = tf.data.Dataset.from_tensor_slices((X_audio, X_video, Y)).shuffle(2198).batch(32)

错误:您的会话在使用所有可用 RAM 后崩溃


With tensorflow 2.x.x您可以使用的数据集 APItf.data.Dataset.from_generator从生成器函数创建数据集。该生成器函数将通过 numpy memap 完成读取工作。

下面的代码创建一个虚拟数据文件,然后从磁盘上的文件中一次读取一个示例。它可以轻松更新以读取多个示例以增加 IO 吞吐量(如果您需要在下面的代码示例中实现这一点,请告诉我)。

# imports
import numpy as np
import pathlib
import tensorflow as tf

# create huge numpy array and save it to disk
file = pathlib.Path("huge_data.npy")
examples = 5000
example_shape = (256, 256)
huge_data_shape = (examples, *example_shape)
huge_data_dtype = np.float64

# create file if does not exist
if not file.is_file():
    print("creating file with random data and saving to disk")
    numpy_data = np.random.rand(*huge_data_shape).astype(huge_data_dtype)
    np.save(file, numpy_data)

# memmap the file
numpy_data_memmap = np.load(file, mmap_mode='r')


# generator function
def data_generator():
    return iter(numpy_data_memmap)


# create tf dataset from generator fn
dataset = tf.data.Dataset.from_generator(
    generator=data_generator,
    output_types=huge_data_dtype,
    output_shapes=example_shape,
)

# consume huge dataset
for i, ex in enumerate(dataset):
    print(i, ex.shape, ex.dtype)

Output:

0 (256, 256) <dtype: 'float64'>
1 (256, 256) <dtype: 'float64'>
2 (256, 256) <dtype: 'float64'>
3 (256, 256) <dtype: 'float64'>
...
4995 (256, 256) <dtype: 'float64'>
4996 (256, 256) <dtype: 'float64'>
4997 (256, 256) <dtype: 'float64'>
4998 (256, 256) <dtype: 'float64'>
4999 (256, 256) <dtype: 'float64'>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将大数据加载到 TensorFlow 2.0 中,而不将其加载到 RAM 上 的相关文章

随机推荐

  • 在 C 源文件中包含带有命名空间的 C++ 头文件会导致编译错误

    我不是专业的 C 程序员 而且我最近在 C 中做了一些技巧 这导致了我出现以下问题 我的任务目标 复制特定的非系统线程 实际上是协作线程 安全模块以创建系统线程安全版本以支持系统中的不同需求 但我们没有创建 sys XXX 函数来保持兼容性
  • 维基百科 API 是否支持搜索特定模板?

    是否可以在 Wikipedia API 中查询包含特定模板的文章 文档没有描述任何将搜索结果过滤到包含模板的页面的操作 具体来说 我正在寻找包含以下内容的页面Template Persondata 之后 我希望能够检索该特定模板 以便填充族
  • 将字节数组转换为图像 Node.js

    我有一个很长的字节数组 数字从 0 到 255 而且我知道这是一个图像 所以我怎样才能像文件一样保存它 我尝试了很多事情 但都没有成功 图像已创建 但由于已损坏而无法打开 File js function saveImage filenam
  • 无法在旧版本的 JUnit 上运行简单的 JUnit TestCase

    我正在尝试在 JUnit 3 7 版本上运行一个简单的 JUnit 测试用例 我无法将其升级到最新版本 运行 IntelliJ 当我尝试运行 JUnit 测试用例时出现以下异常 Exception in thread main java l
  • Javascript 线程处理和竞争条件

    假设我有如下代码 var shared 100 function workWithIt shared 100 setTimeout workWithIt 500 setTimeout workWithIt 500 理想情况下 这段代码应该向
  • PHP PDO简单插入或更新函数

    在尝试创建一个简单的 PHP PDO 更新函数 如果未找到该字段将插入它 时 我创建了这个小片段 function updateorcreate table name value global sodb pro sodb gt prepar
  • 在VB.NET中用“”分割字符串

    假设这是我的字符串 1 2 3 我想用 空格 分割字符串并每次显示字符串的一部分 这将满足您的需要 Dim str As String 1 2 3 Dim strarr As String strarr str Split c For Ea
  • SQL 连接表值函数与表,其中表字段是函数输入

    我有一个名为 fn SplitCommaSep 的表值函数 它用逗号分隔文本字段 从 a b c 到 3 行 a b c 如何将其连接到表中 将表列作为输入 为此 假设表 MyTable 有 2 列 即 Id 和 TextWithComma
  • 如果表的长度不同,如何对多个表中的列值求和?

    好吧 这应该是一个简单的问题 但我正在寻找一种尽可能快的解决方案 假设我有 3 个表 表的数量会更大 tab1 lt table c 1 1 1 2 2 3 3 3 tab2 lt table c 1 1 4 4 4 tab3 lt tab
  • WPF 位图性能

    我试图了解为什么我的图像不活泼 因此我构建了一个示例来测试 WPF 性能 我使用计时器来计算 显示图像 事件处理程序执行的时间 并使用秒表来测量图像出现在屏幕上所需的时间 底线 显示 100 1600 2500 和 3600 个图像时 WP
  • 循环摩卡测试

    我正在尝试使用摩卡中的数据提供程序来编写更少的代码 var should require should var assert require assert var request require supertest var mongoose
  • 使用 LocationClient 定期获取更新的最节省电池效率的方法是什么?

    我正在考虑设置两个单独的警报 每小时收集用户的位置数据 一个每 59 分钟发出一次以 连接 客户端 另一个警报用于实际获取位置 然后断开客户端连接 就电池寿命而言 如果获取用户位置将成为应用程序的主要消耗 我还应该考虑做什么 或者 是否有不
  • 如何编写异步LINQ查询?

    当我读了一堆LINQ相关的东西后 我突然意识到没有文章介绍如何编写异步LINQ查询 假设我们使用 LINQ to SQL 下面的语句很清楚 但是 如果 SQL 数据库响应缓慢 那么使用该代码块的线程就会受到阻碍 var result fro
  • log4j ConversionPattern 时间戳(微秒)

    我想在使用 log4j 生成的日志文件的每个条目的时间戳中添加微秒 这可能吗 我查过官方文档 但没有提到毫秒以下的单位 现在我有一个如下所示的转换模式 d dd MM yyyy HH mm ss SSS 5p t m n 在日期转换模式中
  • 您建议将哪个数据库与 C# (.NET) 应用程序一起使用?

    我正在制定一个小项目计划 当我需要决定使用什么本地数据库系统时 输入数据将存储在网络服务器上 托管 MySQL DB 这个想法是建立一个流程来下载所有必要的数据 例如在午夜 并处理它们 然而 会有很多输入和处理阶段 所以我需要使用某种本地数
  • 处理器有哪些优化代码的技巧?

    我正在寻找诸如代码重新排序之类的东西 这些东西甚至可能在多处理器的情况下破坏代码 最重要的一个是内存访问重新排序 如果没有内存栅栏或序列化指令 处理器可以自由地重新排序内存访问 某些处理器架构对其可以重新排序的数量有限制 Alpha 因最弱
  • 如何使用 lambda 初始化映射?

    我想在单个语句中声明一个完全填充的映射字段 可能包含多个嵌套语句 如下所示 private static final Map
  • Ruby 字符串连接问题

    这有效 irb main 001 0 gt name Rohit Sharma gt Rohit Sharma 但这并不 irb main 001 0 gt fname Rohit gt Rohit irb main 002 0 gt ln
  • 根据眼睛图像进行注视估计

    到目前为止我已经能够准确地检测瞳孔和眼角 您可以在此处看到我在回答自己的问题时上传的一些快照 执行稳定的眼角检测 这是我到目前为止所做的 我通过查看 TLCP TRCP 和 BLCP 来校准用户的视线 在哪里 CP calibration
  • 将大数据加载到 TensorFlow 2.0 中,而不将其加载到 RAM 上

    我已经处理并保存了大量视频和音频文件数据集 大约 8 到 9 GB 的数据 数据保存为 2 个 numpy 数组 每个数组对应一种模态 文件的形状为 number of examples maximum time length featur