青未了分享 http://blog.sciencenet.cn/u/yanghang

博文

[转载]TensorFlow的几个函数from_tensor_slices()、batch()、map()、shuffle()

已有 2329 次阅读 2021-7-5 20:45 |个人分类:Python|系统分类:科研笔记|文章来源:转载

1、tf.data.Data.from_tensor_slices(data).batch(size)

将data数据进行切片,并在引用时按size大小输出迭代。


data = [[0,0,0,0,0],[1,1,1,1,1],[2,2,2,2,2]]

dataset = tf.data.Dataset.from_tensor_slices(data).batch(1)

 

for index,line in enumerate(dataset):

    print(index," ",line)

    print('------------------')

输出为(tf.tensor):


0   tf.Tensor([[0 0 0 0 0]], shape=(1, 5), dtype=int32)

------------------

1   tf.Tensor([[1 1 1 1 1]], shape=(1, 5), dtype=int32)

------------------

2   tf.Tensor([[2 2 2 2 2]], shape=(1, 5), dtype=int32)

------------------

如果将batch参数改为2,则输出如下,数据不足时输出全部剩余


0   tf.Tensor(

[[0 0 0 0 0]

 [1 1 1 1 1]], shape=(2, 5), dtype=int32)

------------------

1   tf.Tensor([[2 2 2 2 2]], shape=(1, 5), dtype=int32)

------------------

 (如果不加上batch打包,默认一个一个输出,所以size为1时没有意义)


1.1data数据为字典时

输入为字典时,输出按“key"值索引:


data = {"a":np.array([1.,2.,3.,4.,5.]),"b":np.random.random(size=(5,3))}

dataset = tf.data.Dataset.from_tensor_slices(data)

 

for index,line in enumerate(dataset):

    print(index," ",line["a"],"****",line["b"])

    print('------------------')

输出为(tf.tensor):


0   tf.Tensor(1.0, shape=(), dtype=float64) **** tf.Tensor([0.30519996 0.39658704 0.91462395], shape=(3,), dtype=float64)

------------------

1   tf.Tensor(2.0, shape=(), dtype=float64) **** tf.Tensor([0.3949131  0.37497861 0.58271534], shape=(3,), dtype=float64)

------------------

2   tf.Tensor(3.0, shape=(), dtype=float64) **** tf.Tensor([0.50861414 0.556261   0.22094466], shape=(3,), dtype=float64)

------------------

3   tf.Tensor(4.0, shape=(), dtype=float64) **** tf.Tensor([0.71673955 0.96458281 0.53815042], shape=(3,), dtype=float64)

------------------

4   tf.Tensor(5.0, shape=(), dtype=float64) **** tf.Tensor([0.93950987 0.87853242 0.05198704], shape=(3,), dtype=float64)

------------------

 1.2data数据为元组时

输入为元组时,按元组形式解包


data = ((np.array([1.,2.,3.,4.,5.]),(np.random.random(size=(5,3)))))

dataset = tf.data.Dataset.from_tensor_slices(data)

 

for xs,ys in dataset:

    print(xs,"****",ys)

    print('------------------')

 输出为(tf.tensor):


tf.Tensor(1.0, shape=(), dtype=float64) **** tf.Tensor([0.65001678 0.09153465 0.06510237], shape=(3,), dtype=float64)

------------------

tf.Tensor(2.0, shape=(), dtype=float64) **** tf.Tensor([0.9090613  0.88832908 0.11876647], shape=(3,), dtype=float64)

------------------

tf.Tensor(3.0, shape=(), dtype=float64) **** tf.Tensor([0.44002558 0.06128562 0.11221942], shape=(3,), dtype=float64)

------------------

tf.Tensor(4.0, shape=(), dtype=float64) **** tf.Tensor([0.39922175 0.11770404 0.89398157], shape=(3,), dtype=float64)

------------------

tf.Tensor(5.0, shape=(), dtype=float64) **** tf.Tensor([0.82551231 0.02455912 0.03370511], shape=(3,), dtype=float64)

------------------

2、map()、shuffle()、repeat()用法

2.1、map()

map用法与Python一样,接受一个函数对象参数,使用Dataset读取的每个数据都会被当成这个函数对象的参数,并进行计算输出,组成一个新的数据集。


def get_sum(dict):

    feat = dict['feat']

    label = dict['label']

    sum = tf.reduce_mean(label)

    return feat,sum

 

dataset = tf.data.Dataset.from_tensor_slices({

    "feat":np.array([1.,2.,3.,4.,5.]),

    "label":np.random.random(size=(5,3))})

 

dataset = dataset.map(get_sum)

for xs,ys in dataset:

    print(xs,"****",ys)

    print('------------------')

 输出为(tf.tensor):


tf.Tensor(1.0, shape=(), dtype=float64) **** tf.Tensor(0.4689615933870761, shape=(), dtype=float64)

------------------

tf.Tensor(2.0, shape=(), dtype=float64) **** tf.Tensor(0.31919237915828286, shape=(), dtype=float64)

------------------

tf.Tensor(3.0, shape=(), dtype=float64) **** tf.Tensor(0.5887782150986411, shape=(), dtype=float64)

------------------

tf.Tensor(4.0, shape=(), dtype=float64) **** tf.Tensor(0.46332159001270884, shape=(), dtype=float64)

------------------

tf.Tensor(5.0, shape=(), dtype=float64) **** tf.Tensor(0.7071242889720469, shape=(), dtype=float64)

------------------

2.2、shuffle()

shuffle的作用是打乱数据集中的元素,它有一个参数buffer_size,表示打乱时使用的缓冲区大小。


dataset = tf.data.Dataset.from_tensor_slices({

    "feat":np.array([1.,2.,3.,4.,5.]),

    "label":np.random.random(size=(5,3))}).shuffle(buffer_size=100).batch(2)

 

for line in dataset:

    print(line['feat'],"****",line['label'])

    print('------------------')

第一次输出为(tf.tensor):


tf.Tensor([4. 5.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.54950238 0.50334572 0.59974542]

 [0.10169851 0.98936089 0.42366309]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([1. 2.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.52764501 0.40446342 0.39633686]

 [0.6714302  0.03449827 0.99175639]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([3.], shape=(1,), dtype=float64) **** tf.Tensor([[0.62605223 0.9765801  0.11661118]], shape=(1, 3), dtype=float64)

------------------

再运行一次,输出为(tf.tensor):


tf.Tensor([5. 4.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.24737827 0.99113837 0.78126015]

 [0.29884487 0.12049342 0.8041113 ]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([3. 1.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.29074631 0.18683898 0.11682108]

 [0.97275326 0.15158869 0.29526389]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([2.], shape=(1,), dtype=float64) **** tf.Tensor([[0.03444436 0.8773693  0.81584051]], shape=(1, 3), dtype=float64)

------------------

两次输出结果并不相同。缓冲区大小表示打乱时的数据容量,打乱之后,再从中取batch(2)个数据。


2.3、repeat()

repeat将数据集重复若干次。


dataset = tf.data.Dataset.from_tensor_slices({

    "feat":np.array([1.,2.,3.,4.,5.]),

    "label":np.random.random(size=(5,3))})

dataset = dataset.repeat(2).shuffle(buffer_size=100).batch(2)

for line in dataset:

    print(line['feat'],"****",line['label'])

    print('------------------')

输出为(tf.tensor):


tf.Tensor([4. 4.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.7149274  0.83963519 0.20180617]

 [0.7149274  0.83963519 0.20180617]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([3. 1.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.81400672 0.9411397  0.11000945]

 [0.48605118 0.30965208 0.4316607 ]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([1. 3.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.48605118 0.30965208 0.4316607 ]

 [0.81400672 0.9411397  0.11000945]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([5. 2.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.54118115 0.27571944 0.31600973]

 [0.88704058 0.94115315 0.52538436]], shape=(2, 3), dtype=float64)

------------------

tf.Tensor([2. 5.], shape=(2,), dtype=float64) **** tf.Tensor(

[[0.88704058 0.94115315 0.52538436]

 [0.54118115 0.27571944 0.31600973]], shape=(2, 3), dtype=float64)

------------------


原文链接:

https://blog.csdn.net/weixin_42253874/article/details/107717589



2、tf.data.Dataset.from_tensor_slices

该函数是dataset核心函数之一,它的作用是把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。


假设我们现在有两组数据,分别是特征和标签,为了简化说明问题,我们假设每两个特征对应一个标签。之后把特征和标签组合成一个tuple,那么我们的想法是让每个标签都恰好对应2个特征,而且像直接切片,比如:[f11, f12] [t1]。f11表示第一个数据的第一个特征,f12表示第1个数据的第二个特征,t1表示第一个数据标签。那么tf.data.Dataset.from_tensor_slices就是做了这件事情:

 


import tensorflow as tf

import numpy as np

 

features, labels = (np.random.sample((6, 3)),  # 模拟6组数据,每组数据3个特征

                    np.random.sample((6, 1)))  # 模拟6组数据,每组数据对应一个标签,注意两者的维数必须匹配

 

print((features, labels))  #  输出下组合的数据

data = tf.data.Dataset.from_tensor_slices((features, labels))

print(data)  # 输出张量的信息

输出结果如下:(略)


从结果可以看出,该函数将数据分为了shape为((3,),(1,))的数据形式,即每三个特征对应一个标签。

原文链接:https://blog.csdn.net/Dr_jiabin/article/details/93366661



https://blog.sciencenet.cn/blog-346157-1294191.html

上一篇:[转载]Python 实现定时任务
下一篇:[转载]OS 及OS.path
收藏 IP: 210.72.27.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-12 04:07

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部