###基础概念

在tensorflow的官方文档是这样介绍Dataset数据对象的:

Dataset可以用来表示输入管道元素集合(张量的嵌套结构)和“逻辑计划“对这些元素的转换操作。在Dataset中元素可以是向量,元组或字典等形式。

另外,Dataset需要配合另外一个类Iterator进行使用,Iterator对象是一个迭代器,可以对Dataset中的元素进行迭代提取。

看个简单的示例:

  1. #创建一个Dataset对象
  2. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  3. #创建一个迭代器
  4. iterator = dataset.make_one_shot_iterator()
  5. #get_next()函数可以帮助我们从迭代器中获取元素
  6. element = iterator.get_next()
  7. #遍历迭代器,获取所有元素
  8. with tf.Session() as sess:
  9. for i in range(9):
  10. 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维中具有相同的大小。

具体例子

  1. #创建切片形式的dataset
  2. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  3. #创建一个迭代器
  4. iterator = dataset.make_one_shot_iterator()
  5. #get_next()函数可以帮助我们从迭代器中获取元素
  6. element = iterator.get_next()
  7. #遍历迭代器,获取所有元素
  8. with tf.Session() as sess:
  9. for i in range(3):
  10. print(sess.run(element))

以上代码运行结果:1 2 3

####2.from_tensors

创建一个Dataset包含给定张量的单个元素。

函数形式:from_tensors(tensors)

参数tensors:张量的嵌套结构。

具体例子

  1. dataset = tf.data.Dataset.from_tensors([1,2,3,4,5,6,7,8,9])
  2. iterator = concat_dataset.make_one_shot_iterator()
  3. element = iterator.get_next()
  4. with tf.Session() as sess:
  5. for i in range(1):
  6. 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数组参数传递的对象元组。

具体例子

  1. #定义一个生成器
  2. def data_generator():
  3. dataset = np.array(range(9))
  4. for i in dataset:
  5. yield i
  6. #接收生成器,并生产dataset数据结构
  7. dataset = tf.data.Dataset.from_generator(data_generator, (tf.int32))
  8. iterator = concat_dataset.make_one_shot_iterator()
  9. element = iterator.get_next()
  10. with tf.Session() as sess:
  11. for i in range(3):
  12. print(sess.run(element))

以上代码运行结果:0 1 2

####4.batch

batch可以将数据集的连续元素合成批次。

函数形式:batch(batch_size,drop_remainder=False)

参数batch_size:表示要在单个批次中合并的此数据集的连续元素个数。

参数drop_remainder:表示在少于batch_size元素的情况下是否应删除最后一批 ; 默认是不删除。

具体例子:

  1. #创建一个Dataset对象
  2. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  3. '''合成批次'''
  4. dataset=dataset.batch(3)
  5. #创建一个迭代器
  6. iterator = dataset.make_one_shot_iterator()
  7. #get_next()函数可以帮助我们从迭代器中获取元素
  8. element = iterator.get_next()
  9. #遍历迭代器,获取所有元素
  10. with tf.Session() as sess:
  11. for i in range(9):
  12. print(sess.run(element))

以上代码运行结果为:

[1 2 3]

[4 5 6]

[7 8 9]

即把目标对象合成3个批次,返回的对象是传入Dataset对象。

####5.concatenate

concatenate可以将两个Dataset对象进行合并或连接.

函数形式:concatenate(dataset)

参数dataset:表示需要传入的dataset对象。

具体例子:

  1. #创建dataset对象
  2. dataset_a=tf.data.Dataset.from_tensor_slices([1,2,3])
  3. dataset_b=tf.data.Dataset.from_tensor_slices([4,5,6])
  4. #合并dataset
  5. concat_dataset=dataset_a.concatenate(dataset_b)
  6. iterator = concat_dataset.make_one_shot_iterator()
  7. element = iterator.get_next()
  8. with tf.Session() as sess:
  9. for i in range(6):
  10. print(sess.run(element))

以上代码运行结果:1 2 3 4 5 6

####6.filter

filter可以对传入的dataset数据进行条件过滤.

函数形式:filter(predicate)

参数predicate:条件过滤函数

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. #对dataset内的数据进行条件过滤
  3. dataset=dataset.filter(lambda x:x>3)
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(6):
  8. 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:表示要并行处理的数字元素。如果未指定,将按顺序处理元素。

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. #进行map操作
  3. dataset=dataset.map(lambda x:x+1)
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(6):
  8. 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:映射函数

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. #进行flat_map操作
  3. dataset=dataset.flat_map(lambda x:tf.data.Dataset.from_tensor_slices(x+[1]))
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(6):
  8. print(sess.run(element))

以上代码运行结果:2 3 4 5 6 7

####9.make_one_shot_iterator

创建Iterator用于枚举此数据集的元素。(可自动初始化)

函数形式:make_one_shot_iterator()

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. iterator = dataset.make_one_shot_iterator()
  3. element = iterator.get_next()
  4. with tf.Session() as sess:
  5. for i in range(6):
  6. print(sess.run(element))

####10.make_initializable_iterator

创建Iterator用于枚举此数据集的元素。(使用此函数前需先进行迭代器的初始化操作)

函数形式:make_initializable_iterator(shared_name=None)

参数shared_name:(可选)如果非空,则返回的迭代器将在给定名称下共享同一设备的多个会话(例如,使用远程服务器时)

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. iterator = dataset.make_initializable_iterator()
  3. element = iterator.get_next()
  4. with tf.Session() as sess:
  5. #对迭代器进行初始化操作
  6. sess.run(iterator.initializer)
  7. for i in range(5):
  8. 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元素的情况下是否应删除最后一批 ; 默认行为是不删除较小的批处理。

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. dataset=dataset.padded_batch(2,padded_shapes=[])
  3. iterator = dataset.make_one_shot_iterator()
  4. element = iterator.get_next()
  5. with tf.Session() as sess:
  6. for i in range(6):
  7. print(sess.run(element))

以上代码运行结果:

[1 2]

[3 4]

####12.repeat

重复此数据集count次数

函数形式:repeat(count=None)

参数count:(可选)表示数据集应重复的次数。默认行为(如果count是None或-1)是无限期重复的数据集。

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. #无限次重复dataset数据集
  3. dataset=dataset.repeat()
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(3035):
  8. 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。)

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. #随机混洗数据
  3. dataset=dataset.shuffle(3)
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(3035):
  8. print(sess.run(element))

以上代码运行结果:3 2 4

####15.skip

生成一个跳过count元素的数据集。

函数形式:skip(count)

参数count:表示应跳过以形成新数据集的此数据集的元素数。如果count大于此数据集的大小,则新数据集将不包含任何元素。如果count 为-1,则跳过整个数据集。

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,3,4,5,6,7,8,9])
  2. #跳过前5个元素
  3. dataset=dataset.skip(5)
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(3035):
  8. print(sess.run(element))

以上代码运行结果: 6 7 8

####16.take

提取前count个元素形成性数据集

函数形式:take(count)

参数count:表示应该用于形成新数据集的此数据集的元素数。如果count为-1,或者count大于此数据集的大小,则新数据集将包含此数据集的所有元素。

具体例子

  1. dataset = tf.data.Dataset.from_tensor_slices([1,2,2,3,4,5,6,7,8,9])
  2. #提取前5个元素形成新数据
  3. dataset=dataset.take(5)
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(3035):
  8. print(sess.run(element))

以上代码运行结果: 1 2 2

####17.zip

将给定数据集压缩在一起

函数形式:zip(datasets)

参数datesets:数据集的嵌套结构。

具体例子

  1. dataset_a=tf.data.Dataset.from_tensor_slices([1,2,3])
  2. dataset_b=tf.data.Dataset.from_tensor_slices([2,6,8])
  3. zip_dataset=tf.data.Dataset.zip((dataset_a,dataset_b))
  4. iterator = dataset.make_one_shot_iterator()
  5. element = iterator.get_next()
  6. with tf.Session() as sess:
  7. for i in range(3035):
  8. print(sess.run(element))

以上代码运行结果:

(1, 2)

(2, 6)

(3, 8)

到这里Dataset中大部分方法 都在这里做了初步的解释,当然这些方法的配合使用才能够在建模过程中发挥大作用。

更多信息可查看tensorflow官方文档
https://www.tensorflow.org/api_docs/python/tf/data/Dataset

Tensorflow中的数据对象Dataset的更多相关文章

  1. oracle中的数据对象

    oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...

  2. 读取Excel中的数据到DataSet

    读取Excel中的数据到DataSet 1.引用命名空间 using System.Data.OleDb; 2.输入Excel文件,输出DataSet public DataSet ExecleDs( ...

  3. Redis中的数据对象

    redis对象 redis中有五种常用对象 我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的 redisObjec ...

  4. 针对vue中请求数据对象新添加的属性不能响应式的解决方法

    1.需要给对象添加属性时,不能采用传统的obj.属性=值,obj[属性]=值 来添加属性,在vue页面时需要这样使用 this.$set(obj,"propertyName",&q ...

  5. Excel中的数据与DataSet的互换

    using System;using System.Collections.Generic;using System.Data;using System.Drawing;using System.IO ...

  6. echarts设置option中的数据对象优化

    if(tab.name == 'first'){ myChart.setOption({ legend: { selected:{ [this.playNumber]:true, [this.cove ...

  7. DataSet 中的数据排序 及 DataRow装成DataTable

    1.DataSet 中的数据排序 DataSet ds = new DataSet(); // 获取当前排口的数据 ds = _xiaobill.GetHistoryData(yinZiBianm, ...

  8. Tensorflow中Tensor对象的常用方法(持续更新)

    Tensor是Tensorflow中重要的对象.下面是Tensor的常用方法,后面还会写一篇随笔记录Variable的用法. 1. 生成一个(常)Tensor对象 >>>A = tf ...

  9. tensorflow中张量_常量_变量_占位符

    1.tensor 在tensorflow中,数据是被封装在tensor对象中的.tensor是张量的意思,即包含从0到任意维度的张量.常数是0维度的张量,向量是1维度的张量,矩阵是二维度的张量,以及还 ...

随机推荐

  1. .net core i上 K8S(二)运行简单.netcore程序

    上一章我们搭建了k8s集群,这一章我们开始在k8s集群上运行.netcore程序 1.kubectl run 在我的Docker系列教程里,我曾往docker hub中推送过一个镜像“webdokce ...

  2. .net core MVC接受来自自前端的GET和POST请求方法的区别

    小伙伴们都知道,常用的http请求有两种方式,即GET方法和POST方法,很多刚入门的童鞋难免都会有一个误区,是不是GET是从服务器上获取数据,POST是向服务器传送数据? 我的理解是:不论是GET还 ...

  3. ML.NET Cookbook --- 1.如何从文本文件中加载数据?

    使用ML.NET中的TextLoader扩展方法从文本文件中加载数据.你需要知道在文本文件中数据列在那里,它们的类型是什么,在文本文件中什么位置可以找到它们. 请注意:对于ML.NET只读取文件的某些 ...

  4. 虚拟化 - Docker

    Docker Desktop (for windows and mac) Docker Desktop 注意 安装时有可能卡主,可以关掉重新装 重启启动时,可能报错"VIRTUALIZATI ...

  5. 动态生成select框内容

    获取动态数据,显示在select选项中,当前select在jsp页面中 <select > <option>这里放选中或者当前的数据</option> <%f ...

  6. APIO2014 连珠线

    题目链接:戳我 换根DP 由于蒟蒻不会做这个题,所以参考了大佬. 本来想的是有三种情况,一种是该节点不作为两个蓝线的中点(我们称这种不是关键节点),一种是该节点作为关键点.连两个子节点,一种是作为关键 ...

  7. nowcoder(牛客网)提高组模拟赛第四场 解题报告

    T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是

  8. (1)python的基础认知

    Python程序员的信仰:人生苦短,我用python! (一)python的发展史 1989年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido).为了打发圣诞节假 ...

  9. “全栈2019”Java第九章:解释第一个程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. IO多路复用,协程,

    一.单线程的并发 import socket import select client1 = socket.socket() client1.setblocking(False) # 百度创建连接: ...