阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

10 张图帮你搞定 TensorFlow 数据读取机制

265次阅读
没有评论

共计 3173 个字符,预计需要花费 8 分钟才能阅读完成。

导读 在学习 tensorflow 的过程中,有很多小伙伴反映读取数据这一块很难理解。确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料。今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下 tensorflow 的数据读取机制,文章的最后还会给出实战代码以供参考。
一、tensorflow 读取机制图解

首先需要思考的一个问题是,什么是数据读取?以图像数据为例,读取数据的过程可以用下图来表示:

10 张图帮你搞定 TensorFlow 数据读取机制

假设我们的硬盘中有一个图片数据集 0001.jpg,0002.jpg,0003.jpg……我们只需要把它们读取到内存中,然后提供给 GPU 或是 CPU 进行计算就可以了。这听起来很容易,但事实远没有那么简单。事实上,我们必须要把数据先读入后才能进行计算,假设读入用时 0.1s,计算用时 0.9s,那么就意味着每过 1s,GPU 都会有 0.1s 无事可做,这就大大降低了运算的效率。

如何解决这个问题?方法就是将读入数据和计算分别放在两个线程中,将数据读入内存的一个队列,如下图所示:

10 张图帮你搞定 TensorFlow 数据读取机制

读取线程源源不断地将文件系统中的图片读入到一个内存的队列中,而负责计算的是另一个线程,计算需要数据时,直接从内存队列中取就可以了。这样就可以解决 GPU 因为 IO 而空闲的问题!

而在 tensorflow 中,为了方便管理,在内存队列前又添加了一层所谓的“文件名队列”。

为什么要添加这一层文件名队列?我们首先得了解机器学习中的一个概念:epoch。对于一个数据集来讲,运行一个 epoch 就是将这个数据集中的图片全部计算一遍。如一个数据集中有三张图片 A.jpg、B.jpg、C.jpg,那么跑一个 epoch 就是指对 A、B、C 三张图片都计算了一遍。两个 epoch 就是指先对 A、B、C 各计算一遍,然后再全部计算一遍,也就是说每张图片都计算了两遍。

tensorflow 使用文件名队列 + 内存队列双队列的形式读入文件,可以很好地管理 epoch。下面我们用图片的形式来说明这个机制的运行方式。如下图,还是以数据集 A.jpg, B.jpg, C.jpg 为例,假定我们要跑一个 epoch,那么我们就在文件名队列中把 A、B、C 各放入一次,并在之后标注队列结束。

10 张图帮你搞定 TensorFlow 数据读取机制

程序运行后,内存队列首先读入 A(此时 A 从文件名队列中出队):

10 张图帮你搞定 TensorFlow 数据读取机制

再依次读入 B 和 C:

10 张图帮你搞定 TensorFlow 数据读取机制

10 张图帮你搞定 TensorFlow 数据读取机制

此时,如果再尝试读入,系统由于检测到了“结束”,就会自动抛出一个异常(OutOfRange)。外部捕捉到这个异常后就可以结束程序了。这就是 tensorflow 中读取数据的基本机制。如果我们要跑 2 个 epoch 而不是 1 个 epoch,那只要在文件名队列中将 A、B、C 依次放入两次再标记结束就可以了。

二、tensorflow 读取数据机制的对应函数

如何在 tensorflow 中创建上述的两个队列呢?

对于文件名队列,我们使用 tf.train.string_input_producer 函数。这个函数需要传入一个文件名 list,系统会自动将它转为一个文件名队列。

此外 tf.train.string_input_producer 还有两个重要的参数,一个是 num_epochs,它就是我们上文中提到的 epoch 数。另外一个就是 shuffle,shuffle 是指在一个 epoch 内文件的顺序是否被打乱。若设置 shuffle=False,如下图,每个 epoch 内,数据还是按照 A、B、C 的顺序进入文件名队列,这个顺序不会改变:

10 张图帮你搞定 TensorFlow 数据读取机制

如果设置 shuffle=True,那么在一个 epoch 内,数据的前后顺序就会被打乱,如下图所示:

10 张图帮你搞定 TensorFlow 数据读取机制

在 tensorflow 中,内存队列不需要我们自己建立,我们只需要使用 reader 对象从文件名队列中读取数据就可以了,具体实现可以参考下面的实战代码。

除了 tf.train.string_input_producer 外,我们还要额外介绍一个函数:tf.train.start_queue_runners。初学者会经常在代码中看到这个函数,但往往很难理解它的用处,在这里,有了上面的铺垫后,我们就可以解释这个函数的作用了。

在我们使用 tf.train.string_input_producer 创建文件名队列后,整个系统其实还是处于“停滞状态”的,也就是说,我们文件名并没有真正被加入到队列中(如下图所示)。此时如果我们开始计算,因为内存队列中什么也没有,计算单元就会一直等待,导致整个系统被阻塞。

10 张图帮你搞定 TensorFlow 数据读取机制

而使用 tf.train.start_queue_runners 之后,才会启动填充队列的线程,这时系统就不再“停滞”。此后计算单元就可以拿到数据并进行计算,整个程序也就跑起来了,这就是函数 tf.train.start_queue_runners 的用处。

10 张图帮你搞定 TensorFlow 数据读取机制

三、实战代码

我们用一个具体的例子感受 tensorflow 中的数据读取。如图,假设我们在当前文件夹中已经有 A.jpg、B.jpg、C.jpg 三张图片,我们希望读取这三张图片 5 个 epoch 并且把读取的结果重新存到 read 文件夹中。

10 张图帮你搞定 TensorFlow 数据读取机制

对应的代码如下:

# 导入 tensorflow
import tensorflow as tf 

# 新建一个 Session
with tf.Session() as sess:
    # 我们要读三幅图片 A.jpg, B.jpg, C.jpg
    filename = ['A.jpg', 'B.jpg', 'C.jpg']
    # string_input_producer 会产生一个文件名队列
    filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)
    # reader 从文件名队列中读数据。对应的方法是 reader.read
    reader = tf.WholeFileReader()
    key, value = reader.read(filename_queue)
    # tf.train.string_input_producer 定义了一个 epoch 变量,要对它进行初始化
    tf.local_variables_initializer().run()
    # 使用 start_queue_runners 之后,才会开始填充队列
    threads = tf.train.start_queue_runners(sess=sess)
    i = 0
    while True:
        i += 1
        # 获取图片数据并保存
        image_data = sess.run(value)
        with open('read/test_%d.jpg' % i, 'wb') as f:
            f.write(image_data)

我们这里使用 filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5) 建立了一个会跑 5 个 epoch 的文件名队列。并使用 reader 读取,reader 每次读取一张图片并保存。

运行代码后,我们得到就可以看到 read 文件夹中的图片,正好是按顺序的 5 个 epoch:

10 张图帮你搞定 TensorFlow 数据读取机制

如果我们设置 filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5) 中的 shuffle=True,那么在每个 epoch 内图像就会被打乱,如图所示:

10 张图帮你搞定 TensorFlow 数据读取机制

我们这里只是用三张图片举例,实际应用中一个数据集肯定不止 3 张图片,不过涉及到的原理都是共通的。

四、总结

这篇文章主要用图解的方式详细介绍了 tensorflow 读取数据的机制,最后还给出了对应的实战代码,希望能够给大家学习 tensorflow 带来一些实质性的帮助。如果各位小伙伴还有什么疑问,欢迎评论或私信告诉我,谢谢~

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计3173字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7806899
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
免费领取huggingface的2核16G云服务器,超简单教程

免费领取huggingface的2核16G云服务器,超简单教程

免费领取 huggingface 的 2 核 16G 云服务器,超简单教程 前言 HuggingFace.co...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...