Tensorflow的DataSet的使用详解

   2023-02-07 学习力322
核心提示:Dataset类是TensorFlow非常流行的存储数据的格式。常用来作为输入输出。data模块主要的用途就是通过这种方法创建Dataset。Dataset使用过程中的一些心得:经常将自变量X数据以及target数据以元组的形式包裹,如db_train=tf.data.Dataset.from_tensor_slices((x

Dataset类是TensorFlow非常流行的存储数据的格式。常用来作为输入输出。data模块主要的用途就是通过这种方法创建Dataset。

Dataset使用过程中的一些心得:

经常将自变量X数据以及target数据以元组的形式包裹,如db_train=tf.data.Dataset.from_tensor_slices((x_train,y_train)),创建Dataset。模型的fit()方法可以自动的解包。

Dataset能够包括比较灵活的类型,比如db_train=tf.data.Dataset.from_tensor_slices(({"features":features_train,"biomass_start":biomass_start_trarin},y_train))。因为数据最外部依然是最外部包裹,所以model的fit()依然可以自动的对x以及target解包。但由于dataset保存component是以原始数据的形式保存的。所以,fit()里的inputs一般是这个样子:

{'features': <tf.Tensor 'my_rnn/Cast_1:0' shape=(None, 5, 4) dtype=float32>, 'biomass_start': <tf.Tensor 'my_rnn/Cast:0' shape=(None, 1) dtype=float32>}

对于字典内部部分,需要手动的自己解包。这样的好处是,给我们自定义模型的结构提供的很大的遍历,输入一部分导入A网络,一部分导入不同的B网络。

Dataset作为模型的输入,需要设定batch()。而不在模型内设定batch。更加方便。然而Dataset作为迭代器,迭代完成后再次迭代数据,生成数据的前后数据是不一样的。需要注意。

batch的drop_remainder=True参数比较重要,只有设定为True,input接下来的层还能正确的识别shape

Dataset的常用属性

Dataset.element_spec

这个属性可以检测每一个元素中的component的类型。返回的是一个tf.TypeSpec对象。这个对象的结构跟元素的结构是一致的。

dataset1 = tf.data.Dataset.from_tensor_slices(tf.random.uniform([4, 10]))

dataset1.element_spec
#TensorSpec(shape=(10,), dtype=tf.float32, name=None)
dataset2 = tf.data.Dataset.from_tensor_slices(
   (tf.random.uniform([4]),
    tf.random.uniform([4, 100], maxval=100, dtype=tf.int32)))

dataset2.element_spec
# 标量和向量
# (TensorSpec(shape=(), dtype=tf.float32, name=None),
#TensorSpec(shape=(100,), dtype=tf.int32, name=None))
dataset = tf.data.Dataset.from_tensor_slices(([1, 2], [3, 4], [5, 6]))
dataset.element_spec 
#(TensorSpec(shape=(), dtype=tf.int32, name=None),
# TensorSpec(shape=(), dtype=tf.int32, name=None),
# TensorSpec(shape=(), dtype=tf.int32, name=None))

# 注意这里是字典类型
dataset = tf.data.Dataset.from_tensor_slices({"a": [1, 2], "b": [3, 4]})
dataset.element_spec
#{'a': TensorSpec(shape=(), dtype=tf.int32, name=None),
# 'b': TensorSpec(shape=(), dtype=tf.int32, name=None)}

Dataset的常用方法

apply方法

对dataset进行转换。

dataset = tf.data.Dataset.range(100)
def dataset_fn(ds):
  return ds.filter(lambda x: x < 5)
dataset = dataset.apply(dataset_fn)
list(dataset.as_numpy_iterator())

as_numpy_iterator

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
for element in dataset.as_numpy_iterator():
  print(element)

这个在dataset比较常用。就是将dataset变成迭代器,将所有元素都变成numy对象输出

shuffle

shuffle(
    buffer_size, seed=None, reshuffle_each_iteration=None, name=None
)

参数:

  • buffer_size:缓冲区大小
  • seed:随机种子
  • reshuffle_each_iteration:bool. 如果为真,表示每次迭代时数据集完成后都应该是进行伪随机重新洗牌的。控制每个epoch的洗牌顺序是否不同。

这个方法用来随机打乱数据集的元素顺序。数据集用buffer_size元素填充一个缓冲区,然后从这个缓冲区随机取样元素,用新元素替换选中的元素。例如,如果您的数据集包含10,000个元素,但是buffer_size被设置为1,000,那么shuffle将首先从缓冲区中的前1,000个元素中选择一个随机元素。一旦一个元素被选中,它在缓冲区中的空间就会被下一个(比如第1001个)元素替换,从而保持这个1,000元素缓冲区。为了实现完美的洗牌,需要一个大于或等于数据集完整大小的缓冲区。

dataset = tf.data.Dataset.range(3)
# 每个每个epoch重新洗牌
dataset = dataset.shuffle(3, reshuffle_each_iteration=True)
list(dataset.as_numpy_iterator())
# [1, 0, 2]
list(dataset.as_numpy_iterator())
# [1, 2, 0]
dataset = tf.data.Dataset.range(3)
# 每个每个epoch不重新洗牌
dataset = dataset.shuffle(3, reshuffle_each_iteration=False)
list(dataset.as_numpy_iterator())
# [1, 0, 2]
list(dataset.as_numpy_iterator())
# [1, 0, 2]

batch

batch(
    batch_size,
    drop_remainder=False,
    num_parallel_calls=None,
    deterministic=None,
    name=None
)

参数:

  • batch_size: 批处理大小
  • drop_remainder:是否删除最后一个短batch。==这个比较重要,只有设定为Ture,model才能正确的判断其输入的shape。==这也比较合理,指定为Falsel,因为谁也不知道后面是不是有一个比较短的batch,只有第一维是None,才能提高程序的稳定性。
  • num_parallel_calls:并行计算的数量。不指定会顺序执行。如果有 tf.data.AUTOTUNE,会自动动态的制定这个值。
  • deterministic:bool. 指定了num_parallel_calls,才有效。如果设置为False,则允许转换产生无序元素,以牺牲确定性来换取性能。如果不指定,tf.data.Options.deterministic控制这个行为(默认为True)
  • name: 标识符

这个方法经常使用,将dataset进行批处理化。因为数据集比较大的时候,一下子完全进行训练占用大量的内存。所以用分批处理。输出的元素增加了一个额外的维度,就是batch维,shape是batch的size.

batch支持一个drop_remainder=True关键字,为真意味着,最后一个batch的size如果小于我们指定值,就会被舍弃。

之所以要删掉最后一个短的batch,是因为如果我们的项目依赖这个batch的size,那最后一个batch不等长,可能会出错。

import tensorflow as tf
from tensorflow.python.data import Dataset

dataset = tf.data.Dataset.range(8)
dataset = dataset.batch(3)
print(list(dataset.as_numpy_iterator()))
# 通过这个看到这个elem也已经是分批了
for elem in dataset:
    print(elem)

# tf.Tensor([0 1 2], shape=(3,), dtype=int64)
# tf.Tensor([3 4 5], shape=(3,), dtype=int64)
# tf.Tensor([6 7], shape=(2,), dtype=int64)

for elem in dataset.as_numpy_iterator():
    print(elem)

# [0 1 2]
# [3 4 5]
# [6 7]
dataset = tf.data.Dataset.range(8)
# drop_remainder舍掉最后一个长度不够的batch
dataset = dataset.batch(3, drop_remainder=True)
list(dataset.as_numpy_iterator())

一般情况下,shuffle跟batch是连续使用的,实现随机读取并批量处理数据:dataset.shuffle(buffer_size).batch(batchsize)

不能对已经batch的dataset进行连续的batch操作,其batchsize不会改变,而是生成了新的异常数据

unbatch

unbatch(
    name=None
)

这里是将Batchdataset这样的dataset分割为一个个元素,元素的格式跟定义时的格式是一样的。而且,这里固定的是对第1个维度进行split操作,且生成shape[0]个元素。

reduce方法

reduce(
    initial_state, reduce_func, name=None
)

将输入数据集简化为一个元素。 reduce_func作用于dataset中每一个元素,输出其dataset的聚合信息。

参数initial_state代表进行reduce之前的初始状态。reduce_func要接收old_state, input_element两个参数,然后生成新的状态newstate。old_state和new_state的结构要一致。

dataset = tf.data.Dataset.from_tensor_slices([8, 3, 0, 8, 2, 1])
print(dataset.reduce(0, lambda state, value: state + value).numpy())
# 22

dataset不支持tf.split属性,也不能直接把dataset给切分为训练集和测试集。

原文地址:https://blog.csdn.net/yue81560/article/details/128691866
 
标签: Tensorflow DataSet
反对 0举报 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Tensorflow--一维离散卷积 tensorflow一维卷积神经网络
    Tensorflow--一维离散卷积 tensorflow一维卷积
    一维离散卷积的运算是一种主要基于向量的计算方式一.一维离散卷积的计算原理一维离散卷积通常有三种卷积类型:full卷积,same卷积和valid卷积1.full卷积full卷积的计算过程如下:K沿着I顺序移动,每移动一个固定位置,对应位置的值相乘,然后对其求和其中K称
    03-08
  • TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类
    TensorFlow系列专题(十四): 手把手带你搭建卷积
    目录:冰山图片识别背景数据介绍数据预处理模型搭建结果分析总结 一、冰山图片识别背景这里我们要解决的任务是来自于Kaggle上的一道赛题(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge),简单介绍一下赛题的背景:在加拿大的东海岸经常
    03-08
  • 深度学习-Tensorflow2.2-多分类{8}-多输出模型实例-20
    深度学习-Tensorflow2.2-多分类{8}-多输出模型
    import tensorflow as tffrom tensorflow import kerasimport matplotlib.pyplot as plt%matplotlib inlineimport numpy as npimport pathlibimport osimport randomos.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'import IPython.display as display
    03-08
  • TensorFlow与Flask结合识别手写体数字
    TensorFlow与Flask结合识别手写体数字
    阅读本文约“2.2分钟”TensorFlow框架        ——TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统        ——可被用于语音识别或图像识别等多项机器学习和深度学习领域        ——TensorFlow是将复杂的数据结构
    03-08
  • 在 GPU 上运行 TensorFlow 教程 (MNIST)
    在 GPU 上运行 TensorFlow 教程 (MNIST)
    介绍我想接触TensorFlow,暂时想运行教程。有GPU!这就是我的想法,但是我很难让它发挥作用,所以我将把信息留在这里。它是为谁准备的?想要在 GPU 上运行 TensorFlow 的人概述基本遵循TensorFlow官方教程它是作为初学者编写的,所以如果它顺利,它很容易!ht
    03-08
  • TensorFlow 开发者证书 PyCharm 相关环境创建与错误斗争+复习
    TensorFlow 开发者证书 PyCharm 相关环境创建与
    介绍2022 年 11 月TensorFlow 开发者证书通过了特定于测试PyCharm我遇到了一个相关的问题,所以我写了这篇文章,因为我想为将来参加考试的人提供有用的信息。 目标:即将考取TensorFlow开发者证书的人 环境:Windows 11 内容:考试过程中出现的错误及解决方法
    03-08
  • 学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现 - 利炳根
    学习笔记TF052:卷积网络,神经网络发展,AlexNe
    学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现卷积神经网络(convolutional neural network,CNN),权值共享(weight sharing)网络结构降低模型复杂度,减少权值数量,是语音分析、图像识别热点。无须人工特征提取、数据重建,直接把图片作输
    02-12
  • tensorflow2.0——LSTM,GRU(Sequential层版)
    前面都是写的cell版本的GRU和LSTM,比较底层,便于理解原理。下面的Sequential版不用自定义state参数的形状,使用更简便: import tensorflow as tfimport osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'assert tf.__version__.startswith('2.')# 设置相关底层
    02-10
  • 循环神经网络系列(二)Tensorflow中dynamic_rnn
    循环神经网络系列(二)Tensorflow中dynamic_rn
    1.回顾上一篇博文(循环神经网络系列(一)Tensorflow中BasicRNNCell)中我们介绍了在Tensoflow中,每个RNN单元的实现,以及对应各个参数的含义。自那之后,我们就能通过Tensorflow实现一个单元的计算了。import tensorflow as tfimport numpy as npx = np.array
    02-09
  • TensorFlow(十):卷积神经网络实现手写数字识别以及可视化
    TensorFlow(十):卷积神经网络实现手写数字识别
    上代码:import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets(\'MNIST_data\',one_hot=True)#每个批次的大小batch_size = 100#计算一共有多少个批次n_batch = mnist.train.num_examples //
    02-09
点击排行