Tensorflow中的数据对象Dataset
###基础概念
在tensorflow的官方文档是这样介绍Dataset数据对象的:
Dataset可以用来表示输入管道元素集合(张量的嵌套结构)和“逻辑计划“对这些元素的转换操作。在Dataset中元素可以是向量,元组或字典等形式。
另外,Dataset需要配合另外一个类Iterator进行使用,Iterator对象是一个迭代器,可以对Dataset中的元素进行迭代提取。
看个简单的示例:
#创建一个Dataset对象
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#创建一个迭代器
iterator = dataset.make_one_shot_iterator()
#get_next()函数可以帮助我们从迭代器中获取元素
element = iterator.get_next()
#遍历迭代器,获取所有元素
with tf.Session() as sess:
for i in range(9):
print(sess.run(element))
以上打印结果为:1 2 3 4 5 6 7 8 9
###Dataset方法
####1.from_tensor_slices
from_tensor_slices用于创建dataset,其元素是给定张量的切片的元素。
函数形式:from_tensor_slices(tensors)
参数tensors:张量的嵌套结构,每个都在第0维中具有相同的大小。
具体例子
#创建切片形式的dataset
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#创建一个迭代器
iterator = dataset.make_one_shot_iterator()
#get_next()函数可以帮助我们从迭代器中获取元素
element = iterator.get_next()
#遍历迭代器,获取所有元素
with tf.Session() as sess:
for i in range(3):
print(sess.run(element))
以上代码运行结果:1 2 3
####2.from_tensors
创建一个Dataset包含给定张量的单个元素。
函数形式:from_tensors(tensors)
参数tensors:张量的嵌套结构。
具体例子
dataset = tf.data.Dataset.from_tensors([1,2,3,4,5,6,7,8,9])
iterator = concat_dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(1):
print(sess.run(element))
以上代码运行结果:[1,2,3,4,5,6,7,8,9]
即from_tensors是将tensors作为一个整体进行操纵,而from_tensor_slices可以操纵tensors里面的元素。
####3.from_generator
创建Dataset由其生成元素的元素generator。
函数形式:from_generator(generator,output_types,output_shapes=None,args=None)
参数generator:一个可调用对象,它返回支持该iter()协议的对象 。如果args未指定,generator则不得参数; 否则它必须采取与有值一样多的参数args。
参数output_types:tf.DType对应于由元素生成的元素的每个组件的对象的嵌套结构generator。
参数output_shapes:tf.TensorShape 对应于由元素生成的元素的每个组件的对象 的嵌套结构generator
参数args:tf.Tensor将被计算并将generator作为NumPy数组参数传递的对象元组。
具体例子
#定义一个生成器
def data_generator():
dataset = np.array(range(9))
for i in dataset:
yield i
#接收生成器,并生产dataset数据结构
dataset = tf.data.Dataset.from_generator(data_generator, (tf.int32))
iterator = concat_dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(3):
print(sess.run(element))
以上代码运行结果:0 1 2
####4.batch
batch可以将数据集的连续元素合成批次。
函数形式:batch(batch_size,drop_remainder=False)
参数batch_size:表示要在单个批次中合并的此数据集的连续元素个数。
参数drop_remainder:表示在少于batch_size元素的情况下是否应删除最后一批 ; 默认是不删除。
具体例子:
#创建一个Dataset对象
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
'''合成批次'''
dataset=dataset.batch(3)
#创建一个迭代器
iterator = dataset.make_one_shot_iterator()
#get_next()函数可以帮助我们从迭代器中获取元素
element = iterator.get_next()
#遍历迭代器,获取所有元素
with tf.Session() as sess:
for i in range(9):
print(sess.run(element))
以上代码运行结果为:
[1 2 3]
[4 5 6]
[7 8 9]
即把目标对象合成3个批次,返回的对象是传入Dataset对象。
####5.concatenate
concatenate可以将两个Dataset对象进行合并或连接.
函数形式:concatenate(dataset)
参数dataset:表示需要传入的dataset对象。
具体例子:
#创建dataset对象
dataset_a=tf.data.Dataset.from_tensor_slices([1,2,3])
dataset_b=tf.data.Dataset.from_tensor_slices([4,5,6])
#合并dataset
concat_dataset=dataset_a.concatenate(dataset_b)
iterator = concat_dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(6):
print(sess.run(element))
以上代码运行结果:1 2 3 4 5 6
####6.filter
filter可以对传入的dataset数据进行条件过滤.
函数形式:filter(predicate)
参数predicate:条件过滤函数
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#对dataset内的数据进行条件过滤
dataset=dataset.filter(lambda x:x>3)
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(6):
print(sess.run(element))
以上代码运行结果:4 5 6 7 8 9
####7.map
map可以将map_func函数映射到数据集
函数形式:flat_map(map_func,num_parallel_calls=None)
参数map_func:映射函数
参数num_parallel_calls:表示要并行处理的数字元素。如果未指定,将按顺序处理元素。
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#进行map操作
dataset=dataset.map(lambda x:x+1)
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(6):
print(sess.run(element))
以上代码运行结果:2 3 4 5 6 7
####8.flat_map
flat_map可以将map_func函数映射到数据集(与map不同的是flat_map传入的数据必须是一个dataset)。
函数形式:flat_map(map_func)
参数map_func:映射函数
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#进行flat_map操作
dataset=dataset.flat_map(lambda x:tf.data.Dataset.from_tensor_slices(x+[1]))
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(6):
print(sess.run(element))
以上代码运行结果:2 3 4 5 6 7
####9.make_one_shot_iterator
创建Iterator用于枚举此数据集的元素。(可自动初始化)
函数形式:make_one_shot_iterator()
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(6):
print(sess.run(element))
####10.make_initializable_iterator
创建Iterator用于枚举此数据集的元素。(使用此函数前需先进行迭代器的初始化操作)
函数形式:make_initializable_iterator(shared_name=None)
参数shared_name:(可选)如果非空,则返回的迭代器将在给定名称下共享同一设备的多个会话(例如,使用远程服务器时)
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
iterator = dataset.make_initializable_iterator()
element = iterator.get_next()
with tf.Session() as sess:
#对迭代器进行初始化操作
sess.run(iterator.initializer)
for i in range(5):
print(sess.run(element))
####11.padded_batch
将数据集的连续元素组合到填充批次中,此转换将输入数据集的多个连续元素组合为单个元素。
函数形式:padded_batch(batch_size,padded_shapes,padding_values=None,drop_remainder=False)
参数batch_size:表示要在单个批次中合并的此数据集的连续元素数。
参数padded_shapes:嵌套结构tf.TensorShape或 tf.int64类似矢量张量的对象,表示在批处理之前应填充每个输入元素的相应组件的形状。任何未知的尺寸(例如,tf.Dimension(None)在一个tf.TensorShape或-1类似张量的物体中)将被填充到每个批次中该尺寸的最大尺寸。
参数padding_values:(可选)标量形状的嵌套结构 tf.Tensor,表示用于各个组件的填充值。默认值0用于数字类型,空字符串用于字符串类型。
参数drop_remainder:(可选)一个tf.bool标量tf.Tensor,表示在少于batch_size元素的情况下是否应删除最后一批 ; 默认行为是不删除较小的批处理。
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
dataset=dataset.padded_batch(2,padded_shapes=[])
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(6):
print(sess.run(element))
以上代码运行结果:
[1 2]
[3 4]
####12.repeat
重复此数据集count次数
函数形式:repeat(count=None)
参数count:(可选)表示数据集应重复的次数。默认行为(如果count是None或-1)是无限期重复的数据集。
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#无限次重复dataset数据集
dataset=dataset.repeat()
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(30,35):
print(sess.run(element))
以上代码运行结果: 1 2 3 4 5
####13.shard
将Dataset分割成num_shards个子数据集。这个函数在分布式训练中非常有用,它允许每个设备读取唯一子集。
函数形式:shard( num_shards,index)
参数num_shards:表示并行运行的分片数。
参数index:表示工人索引。
####14.shuffle
随机混洗数据集的元素。
函数形式:shuffle(buffer_size,seed=None,reshuffle_each_iteration=None)
参数buffer_size:表示新数据集将从中采样的数据集中的元素数。
参数seed:(可选)表示将用于创建分布的随机种子。
参数reshuffle_each_iteration:(可选)一个布尔值,如果为true,则表示每次迭代时都应对数据集进行伪随机重组。(默认为True。)
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#随机混洗数据
dataset=dataset.shuffle(3)
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(30,35):
print(sess.run(element))
以上代码运行结果:3 2 4
####15.skip
生成一个跳过count元素的数据集。
函数形式:skip(count)
参数count:表示应跳过以形成新数据集的此数据集的元素数。如果count大于此数据集的大小,则新数据集将不包含任何元素。如果count 为-1,则跳过整个数据集。
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
#跳过前5个元素
dataset=dataset.skip(5)
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(30,35):
print(sess.run(element))
以上代码运行结果: 6 7 8
####16.take
提取前count个元素形成性数据集
函数形式:take(count)
参数count:表示应该用于形成新数据集的此数据集的元素数。如果count为-1,或者count大于此数据集的大小,则新数据集将包含此数据集的所有元素。
具体例子
dataset = tf.data.Dataset.from_tensor_slices([1,2,2,3,4,5,6,7,8,9])
#提取前5个元素形成新数据
dataset=dataset.take(5)
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(30,35):
print(sess.run(element))
以上代码运行结果: 1 2 2
####17.zip
将给定数据集压缩在一起
函数形式:zip(datasets)
参数datesets:数据集的嵌套结构。
具体例子
dataset_a=tf.data.Dataset.from_tensor_slices([1,2,3])
dataset_b=tf.data.Dataset.from_tensor_slices([2,6,8])
zip_dataset=tf.data.Dataset.zip((dataset_a,dataset_b))
iterator = dataset.make_one_shot_iterator()
element = iterator.get_next()
with tf.Session() as sess:
for i in range(30,35):
print(sess.run(element))
以上代码运行结果:
(1, 2)
(2, 6)
(3, 8)
到这里Dataset中大部分方法 都在这里做了初步的解释,当然这些方法的配合使用才能够在建模过程中发挥大作用。
更多信息可查看tensorflow官方文档
https://www.tensorflow.org/api_docs/python/tf/data/Dataset
Tensorflow中的数据对象Dataset的更多相关文章
- oracle中的数据对象
oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...
- 读取Excel中的数据到DataSet
读取Excel中的数据到DataSet 1.引用命名空间 using System.Data.OleDb; 2.输入Excel文件,输出DataSet public DataSet ExecleDs( ...
- Redis中的数据对象
redis对象 redis中有五种常用对象 我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的 redisObjec ...
- 针对vue中请求数据对象新添加的属性不能响应式的解决方法
1.需要给对象添加属性时,不能采用传统的obj.属性=值,obj[属性]=值 来添加属性,在vue页面时需要这样使用 this.$set(obj,"propertyName",&q ...
- Excel中的数据与DataSet的互换
using System;using System.Collections.Generic;using System.Data;using System.Drawing;using System.IO ...
- echarts设置option中的数据对象优化
if(tab.name == 'first'){ myChart.setOption({ legend: { selected:{ [this.playNumber]:true, [this.cove ...
- DataSet 中的数据排序 及 DataRow装成DataTable
1.DataSet 中的数据排序 DataSet ds = new DataSet(); // 获取当前排口的数据 ds = _xiaobill.GetHistoryData(yinZiBianm, ...
- Tensorflow中Tensor对象的常用方法(持续更新)
Tensor是Tensorflow中重要的对象.下面是Tensor的常用方法,后面还会写一篇随笔记录Variable的用法. 1. 生成一个(常)Tensor对象 >>>A = tf ...
- tensorflow中张量_常量_变量_占位符
1.tensor 在tensorflow中,数据是被封装在tensor对象中的.tensor是张量的意思,即包含从0到任意维度的张量.常数是0维度的张量,向量是1维度的张量,矩阵是二维度的张量,以及还 ...
随机推荐
- ZT 基于git的版本管理思路
http://nvie.com/posts/a-successful-git-branching-model/ 分为5种分支: feature:功能分支,开发人员在此种分支下开发新的功能,开发完成后m ...
- BlockingCollection 集合随记
BlockingCollection 集合是一个并发安全的集合,而且设计用来实现类似于消息队列的功能,生产者.消费者模式. static void Main(string[] args) { Bloc ...
- ie7间隙问题
正常浏览器显示,如谷歌浏览器: ie7浏览器效果如图: html代码: <ul> <li class="current"><a href=" ...
- 并发编程---线程 ;python中各种锁
一,概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 --车间负责把资源整合到 ...
- centos7 docker 安装 zookeeper 3.4.13 单机standalone
假设一台单机主机的ip分别为: 单机主机:192.168.0.200 1. 查找zookeeper镜像: docker search zookeeper 2. 下载官方zookeeper镜像: doc ...
- 区分Web服务器、HTTP服务器、应用程序服务器
在学习前端的过程中.进程听到和看到web服务器.HTTP服务器.应用程序服务器,但一直不知道它们有什么区别,迷惑了好久,今天查看的很多博客,终于算是梳理通了,下面我就来总结一下它们的区别,顺别了解一些 ...
- JAVA 集合随笔
JAVA中提供了现成操纵数据的集合,使得我们在开发中基本不用自己动手实现复杂的数据结构,来保存和操纵数据. 所以当我们有了基本的数据结构知识,会合理利用JAVA提供的集合就好啦. JDK1.8;(仅列 ...
- Using Request Headers for Metadata Address
问题描述 我将一个在本地调试正常的service部署到服务器后遇到了添加服务引用失败的问题.在把配置文件中基址使用的localhost替换成服务器的ip地址后问题得到了解决.但我感觉这并不是一个因为粗 ...
- 博弈论教程(A Course in Game Theory)摘录
P4 在我们所研究的模型中,决策主体往往要在不确定条件下进行决策.参与人可能: 不能确定环境的客观因素: 对博弈中发生的事件不很清楚: 不能确定别的不确定参与人的行动: 不能确定别的参与人的推理. 为 ...
- Vs.net 常用命令行
下面的是从 devenv /? 看到的 用法: devenv [解决方案文件 | 项目文件 | 任意文件.扩展名] [开关] devenv 的第一个参数通常是一个解决方案文件或项目文件. 如果 ...