百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Tensorflow中数据集(tf.data.Dataset)的入门使用示例

ztj100 2025-02-19 14:45 10 浏览 0 评论

Tensorflow中tf.data.Dataset是最常用的数据集类,我们也使用这个类做转换数据、迭代数据等操作。一般来说,在昨晚特征预处理之后,我们都是用这个类来加载数据,构造算法的输入,它本身自带的repeat/shuffle/batch等操作也非常方便我们使用。但是初学者可能容易搞混。本文构造了一个简单的数据来说明如何使用这个类,并循环迭代输出。

本文目录如下:

  1. 引入必要的包
  2. 使用numpy构造数据集
  3. 将numpy数据转换成Dataset
  4. 获取数据迭代器
  5. 创建了迭代器之后就可以循环数据了
  6. 使用tqdm循环输出

使用Dataset管理数据集需要首先定义数据来源,我们可以使用numpy或者tensor定义的数据作为数据来源来定义Dataset,假设我们有如下numpy定义的代码。

1、引入必要的包

import numpy as np
import tensorflow as tf

2、使用numpy构造数据集

seed = 1000 # 定义随机数产生的方式
data_size = 10 # 数据集大小
n_repeats = 10 # 数据集重复的次数,这个值就是平常我们见到的max_epoch
batch_size = 6 # 批处理的大小
np.random.seed(seed)
# 在这里我们定义两个特征集合和一个标签集合,features1有三列特征,features2有4列特征,labels是0-2之间的一种
features1 = np.random.random((data_size, 3))
features2 = np.random.random((data_size, 4))
labels = np.random.randint(0, 3, data_size)
# 打印测试
print(features1)
print(features2)
print(labels)

3、将numpy数据转换成Dataset

一般我们常使用
tf.data.Dataset.from_tensor_slices方法加载数据。同时,Dataset提供了repeat()和batch()方法方便我们建立循环的数据,repeat参数给定一个整型值就可以使数据重复几份,而batch则是将数据以多少条进行批处理,也就是按照batch参数大小切割数据。

注意,repeat和batch的先后顺序不一样 ,结果是不同的,先repeat再batch会把数据先复制N份变成一个大数据,然后batch是根据这个大的数据来做的。例如,上面我们构造了10个数据,先repeat10份就有100个,再假设batch设置为6,那么最终数据是100/6+1=17份,那么也就是循环17次,如果先batch设置为6,那么数据先变成了10/6+1=2份,再repeat10次就有了20份数据了,循环要20次。这个一定要注意。

# dataset = tf.data.Dataset.from_tensor_slices((features1, features2, labels)).repeat(10).batch(6)
dataset = tf.data.Dataset.from_tensor_slices((features1, features2, labels)).batch(batch_size).repeat(n_repeats)

4、获取数据迭代器

数据准备完成之后需要获取数据迭代器供后面迭代使用,Tensorflow创建迭代器的方法有四种,其中单词迭代器和可初始化的迭代器是最常见的两种:

# 单次迭代器只能循环使用一次数据,而且单次迭代器不需要手动显示调用sess.run()进行初始化即可使用
iterator = dataset.make_one_shot_iterator()
# 可初始化的迭代器可以重新初始化进行循环,但是需要手动显示调用sess.run()才能循环
iterator = dataset.make_initializable_iterator()
# 创建了迭代器之后,我们获取迭代器结果便于后面的运行,注意,这里不会产生迭代,只是建立tensorflow的计算图,因此不会消耗迭代
next_element = iterator.get_next()

5、创建了迭代器之后就可以循环数据了

迭代器循环的停止通过捕获数据越界的错误进行

count = 0
with tf.Session() as sess:
 # 这是显示初始化,当我们的迭代器是dataset.make_initializable_iterator()的时候,才需要调用这个方法,否则不需要
 sess.run(iterator.initializer)
 # 无线循环数据,直到越界
 while True:
 try:
 features1_batch, features2_batch, labels_batch = sess.run(next_element)
 count += 1
 print(count)
 except tf.errors.OutOfRangeError:
 break

这里的count输出与上面repeat和batch的先后顺序有关,大家可以自己更换代码查看。

6、使用tqdm循环输出

除了上述捕获越界错误外,我们也可手动计算epoch循环次数和batch循环次数来确定终止的情况。可以配合tqdm包进行输出。tqdm是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator)即可。我们先引入必要的包:

import time
from tqdm import trange

接下来我们使用自己计算的结果循环:

# 注意,这里实例总数显然是先repeat再batch的结果,要根据实际情况做改变
total_instances = data_size * n_repeats
steps_per_epoch = data_size // batch_size if data_size / batch_size == 0 else data_size // batch_size + 1
with tf.Session() as sess:
 sess.run(iterator.initializer)
 for epoch in range(n_repeats):
 tqr = trange(steps_per_epoch, desc="%2d" % (epoch + 1), leave=False)
 for _ in tqr:
 features1_batch, features2_batch, labels_batch = sess.run(next_element)
 # 由于这里循环没有计算过程,速度很快,看不到进度条,我们加了暂停0.5秒便于观察结果
 time.sleep(0.5)
 # 由于所有数据都已经循环完毕,如下代码将会报越界的错误,证明我们是对的
 sess.run(next_element)

我们可以看到如下的进度条:

以上就是Tensorflow中dataset的读取、循环使用的基本概念。

完整代码点击了解更多,并在原文底部中有Github的链接。

相关推荐

Vue3非兼容变更——函数式组件(vue 兼容)

在Vue2.X中,函数式组件有两个主要应用场景:作为性能优化,因为它们的初始化速度比有状态组件快得多;返回多个根节点。然而在Vue3.X中,有状态组件的性能已经提高到可以忽略不计的程度。此外,有状态组...

利用vue.js进行组件化开发,一学就会(一)

组件原理/组成组件(Component)扩展HTML元素,封装可重用的代码,核心目标是为了可重用性高,减少重复性的开发。组件预先定义好行为的ViewModel类。代码按照template\styl...

Vue3 新趋势:10 个最强 X 操作!(vue.3)

Vue3为前端开发带来了诸多革新,它不仅提升了性能,还提供了...

总结 Vue3 组件管理 12 种高级写法,灵活使用才能提高效率

SFC单文件组件顾名思义,就是一个.vue文件只写一个组件...

前端流行框架Vue3教程:17. _组件数据传递

_组件数据传递我们之前讲解过了组件之间的数据传递,...

前端流行框架Vue3教程:14. 组件传递Props效验

组件传递Props效验Vue组件可以更细致地声明对传入的props的校验要求...

前端流行框架Vue3教程:25. 组件保持存活

25.组件保持存活当使用...

5 个被低估的 Vue3 实战技巧,让你的项目性能提升 300%?

前端圈最近都在卷性能优化和工程化,你还在用老一套的Vue3开发方法?作为摸爬滚打多年的老前端,今天就把私藏的几个Vue3实战技巧分享出来,帮你在开发效率、代码质量和项目性能上实现弯道超车!一、...

绝望!Vue3 组件频繁崩溃?7 个硬核技巧让性能暴涨 400%!

前端的兄弟姐妹们五一假期快乐,谁还没在Vue3项目上栽过跟头?满心欢喜写好的组件,一到实际场景就频频崩溃,页面加载慢得像蜗牛,操作卡顿到让人想砸电脑。用户疯狂吐槽,领导脸色难看,自己改代码改到怀疑...

前端流行框架Vue3教程:15. 组件事件

组件事件在组件的模板表达式中,可以直接使用...

Vue3,看这篇就够了(vue3 从入门到实战)

一、前言最近很多技术网站,讨论的最多的无非就是Vue3了,大多数都是CompositionAPI和基于Proxy的原理分析。但是今天想着跟大家聊聊,Vue3对于一个低代码平台的前端更深层次意味着什么...

前端流行框架Vue3教程:24.动态组件

24.动态组件有些场景会需要在两个组件间来回切换,比如Tab界面...

前端流行框架Vue3教程:12. 组件的注册方式

组件的注册方式一个Vue组件在使用前需要先被“注册”,这样Vue才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册...

焦虑!Vue3 组件频繁假死?6 个奇招让页面流畅度狂飙 500%!

前端圈的朋友们,谁还没在Vue3项目上踩过性能的坑?满心期待开发出的组件,一到高并发场景就频繁假死,用户反馈页面点不动,产品经理追着问进度,自己调试到心态炸裂!别以为这是个例,不少人在电商大促、数...

前端流行框架Vue3教程:26. 异步组件

根据上节课的代码,我们在切换到B组件的时候,发现并没有网络请求:异步组件:...

取消回复欢迎 发表评论: