前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow2.0(6):利用data模块进行数据预处理

TensorFlow2.0(6):利用data模块进行数据预处理

作者头像
统计学家
发布2019-12-23 14:30:38
1.8K0
发布2019-12-23 14:30:38
举报
文章被收录于专栏:机器学习与统计学

TensorFlow2.0(1):基本数据结构——张量

TensorFlow2.0(2):数学运算

TensorFlow2.0(3):张量排序、最大最小值

TensorFlow2.0(4):填充与复制

TensorFlow2.0(5):张量限幅

在整个机器学习过程中,除了训练模型外,应该就属数据预处理过程消耗的精力最多,数据预处理过程需要完成的任务包括数据读取、过滤、转换等等。为了将用户从繁杂的预处理操作中解放处理,更多地将精力放在算法建模上,TensorFlow中提供了data模块,这一模块以多种方式提供了数据读取、数据处理、数据保存等功能。本文重点是data模块中的Dataset对象。

1 创建

对于创建Dataset对象,官方文档中总结为两种方式,我将这两种方式细化后总结为4中方式:

(1)通过Dataset中的range()方法创建包含一定序列的Dataset对象。

  • range()

range()方法是Dataset内部定义的一个的静态方法,可以直接通过类名调用。另外,Dataset中的range()方法与Python本身内置的range()方法接受参数形式是一致的,可以接受range(begin)、range(begin, end)、range(begin, end, step)等多种方式传参。

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
代码语言:javascript
复制
dataset1 = tf.data.Dataset.range(5)
type(dataset1)
代码语言:javascript
复制
tensorflow.python.data.ops.dataset_ops.RangeDataset

注:RangeDataset是Dataset的一个子类。Dataset对象属于可迭代对象, 可通过循环进行遍历:

代码语言:javascript
复制
for i in dataset1:
    print(i)
    print(i.numpy())
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
0
tf.Tensor(1, shape=(), dtype=int64)
1
tf.Tensor(2, shape=(), dtype=int64)
2
tf.Tensor(3, shape=(), dtype=int64)
3
tf.Tensor(4, shape=(), dtype=int64)
4

可以看到,range()方法创建的Dataset对象内部每一个元素都以Tensor对象的形式存在,可以通过numpy()方法访问真实值。

  • from_generator()

如果你觉得range()方法不够灵活,功能不够强大,那么你可以尝试使用from_generator()方法。from_generator()方法接收一个可调用的生成器函数最为参数,在遍历from_generator()方法返回的Dataset对象过程中不断生成新的数据,减少内存占用,这在大数据集中很有用。

代码语言:javascript
复制
def count(stop):
  i = 0
  while i<stop:
    print('第%s次调用……'%i)
    yield i
    i += 1
代码语言:javascript
复制
dataset2 = tf.data.Dataset.from_generator(count, args=[3], output_types=tf.int32, output_shapes = (), )
代码语言:javascript
复制
a = iter(dataset2)
代码语言:javascript
复制
next(a)
代码语言:javascript
复制
第0次调用……
<tf.Tensor: id=46, shape=(), dtype=int32, numpy=0>
代码语言:javascript
复制
next(a)
代码语言:javascript
复制
第1次调用……

<tf.Tensor: id=47, shape=(), dtype=int32, numpy=1>
代码语言:javascript
复制
for i in dataset2:
    print(i)
    print(i.numpy())
代码语言:javascript
复制
第0次调用……
tf.Tensor(0, shape=(), dtype=int32)
0
第1次调用……
tf.Tensor(1, shape=(), dtype=int32)
1
第2次调用……
tf.Tensor(2, shape=(), dtype=int32)
2

**(2)通过接收其他类型的集合类对象创建Dataset对象。**这里所说的集合类型对象包含Python内置的list、tuple,numpy中的ndarray等等。这种创建Dataset对象的方法大多通过from_tensors()和from_tensor_slices()两个方法实现。这两个方法很常用,重点说一说。

  • from_tensors() from_tensors()方法接受一个集合类型对象作为参数,返回值为一个TensorDataset类型对象,对象内容、shape因传入参数类型而异。

当接收参数为list或Tensor对象时,返回的情况是一样的,因为TensorFlow内部会将list先转为Tensor对象,然后实例化一个Dataset对象:

代码语言:javascript
复制
a = [0,1,2,3,4]
dataset1 = tf.data.Dataset.from_tensors(a)
dataset1_n = tf.data.Dataset.from_tensors(np.array(a))
dataset1_t = tf.data.Dataset.from_tensors(tf.constant(a))
代码语言:javascript
复制
dataset1,next(iter(dataset1))
代码语言:javascript
复制
(<TensorDataset shapes: (5,), types: tf.int32>,
 <tf.Tensor: id=67, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4], dtype=int32)>)
代码语言:javascript
复制
dataset1_n,next(iter(dataset1_n))
代码语言:javascript
复制
(<TensorDataset shapes: (5,), types: tf.int64>,
 <tf.Tensor: id=73, shape=(5,), dtype=int64, numpy=array([0, 1, 2, 3, 4])>)
代码语言:javascript
复制
dataset1_t,next(iter(dataset1_t))
代码语言:javascript
复制
(<TensorDataset shapes: (5,), types: tf.int32>,
 <tf.Tensor: id=79, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4], dtype=int32)>)

多维结构也是一样的:

代码语言:javascript
复制
a = [0,1,2,3,4]
b = [5,6,7,8,9]
dataset2 = tf.data.Dataset.from_tensors([a,b])
dataset2_n = tf.data.Dataset.from_tensors(np.array([a,b]))
dataset2_t = tf.data.Dataset.from_tensors(tf.constant([a,b]))
代码语言:javascript
复制
dataset2,next(iter(dataset2))
代码语言:javascript
复制
(<TensorDataset shapes: (2, 5), types: tf.int32>,
 <tf.Tensor: id=91, shape=(2, 5), dtype=int32, numpy=
 array([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]], dtype=int32)>)
代码语言:javascript
复制
dataset2_n,next(iter(dataset2_n))
代码语言:javascript
复制
(<TensorDataset shapes: (2, 5), types: tf.int64>,
 <tf.Tensor: id=97, shape=(2, 5), dtype=int64, numpy=
 array([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]])>)
代码语言:javascript
复制
dataset2_t,next(iter(dataset2_t))
代码语言:javascript
复制
(<TensorDataset shapes: (2, 5), types: tf.int32>,
 <tf.Tensor: id=103, shape=(2, 5), dtype=int32, numpy=
 array([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]], dtype=int32)>)

当接收参数为数组就不一样了,此时Dataset内部内容为一个tuple,tuple的元素是原来tuple元素转换为的Tensor对象:

代码语言:javascript
复制
a = [0,1,2,3,4]
b = [5,6,7,8,9]
dataset3 = tf.data.Dataset.from_tensors((a,b))
代码语言:javascript
复制
for i in dataset3:
    print(type(i))
    print(i)
    for j in i:
        print(j)
代码语言:javascript
复制
<class 'tuple'>
(<tf.Tensor: id=112, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4], dtype=int32)>, <tf.Tensor: id=113, shape=(5,), dtype=int32, numpy=array([5, 6, 7, 8, 9], dtype=int32)>)
tf.Tensor([0 1 2 3 4], shape=(5,), dtype=int32)
tf.Tensor([5 6 7 8 9], shape=(5,), dtype=int32)
  • from_tensor_slices() from_tensor_slices()方法返回一个TensorSliceDataset类对象,TensorSliceDataset对象比from_tensors()方法返回的TensorDataset对象支持更加丰富的操作,例如batch操作等,因此在实际应用中更加广泛。返回的TensorSliceDataset对象内容、shape因传入参数类型而异。

当传入一个list时,时将list中元素逐个转换为Tensor对象然后依次放入Dataset中,所以Dataset中有多个Tensor对象:

代码语言:javascript
复制
a = [0,1,2,3,4]
dataset1 = tf.data.Dataset.from_tensor_slices(a)
代码语言:javascript
复制
dataset1
代码语言:javascript
复制
<TensorSliceDataset shapes: (), types: tf.int32>
代码语言:javascript
复制
for i,elem in enumerate(dataset1):
    print(i, '-->', elem)
代码语言:javascript
复制
0 --> tf.Tensor(0, shape=(), dtype=int32)
1 --> tf.Tensor(1, shape=(), dtype=int32)
2 --> tf.Tensor(2, shape=(), dtype=int32)
3 --> tf.Tensor(3, shape=(), dtype=int32)
4 --> tf.Tensor(4, shape=(), dtype=int32)
代码语言:javascript
复制
a = [0,1,2,3,4]
b = [5,6,7,8,9]
dataset2 = tf.data.Dataset.from_tensor_slices([a,b])
代码语言:javascript
复制
dataset2
代码语言:javascript
复制
<TensorSliceDataset shapes: (5,), types: tf.int32>
代码语言:javascript
复制
for i,elem in enumerate(dataset2):
    print(i, '-->', elem)
代码语言:javascript
复制
0 --> tf.Tensor([0 1 2 3 4], shape=(5,), dtype=int32)
1 --> tf.Tensor([5 6 7 8 9], shape=(5,), dtype=int32)

当传入参数为tuple时,会将tuple中各元素转换为Tensor对象,然后将第一维度对应位置的切片进行重新组合成一个tuple依次放入到Dataset中,所以在返回的Dataset中有多个tuple。这种形式在对训练集和测试集进行重新组合是非常实用。

代码语言:javascript
复制
a = [0,1,2,3,4]
b = [5,6,7,8,9]
dataset1 = tf.data.Dataset.from_tensor_slices((a,b))
代码语言:javascript
复制
dataset1
代码语言:javascript
复制
<TensorSliceDataset shapes: ((), ()), types: (tf.int32, tf.int32)>
代码语言:javascript
复制
for i in dataset1:
    print(i)
代码语言:javascript
复制
(<tf.Tensor: id=143, shape=(), dtype=int32, numpy=0>, <tf.Tensor: id=144, shape=(), dtype=int32, numpy=5>)
(<tf.Tensor: id=145, shape=(), dtype=int32, numpy=1>, <tf.Tensor: id=146, shape=(), dtype=int32, numpy=6>)
(<tf.Tensor: id=147, shape=(), dtype=int32, numpy=2>, <tf.Tensor: id=148, shape=(), dtype=int32, numpy=7>)
(<tf.Tensor: id=149, shape=(), dtype=int32, numpy=3>, <tf.Tensor: id=150, shape=(), dtype=int32, numpy=8>)
(<tf.Tensor: id=151, shape=(), dtype=int32, numpy=4>, <tf.Tensor: id=152, shape=(), dtype=int32, numpy=9>)
代码语言:javascript
复制
c = ['a','b','c','d','e']
dataset3 = tf.data.Dataset.from_tensor_slices((a,b,c))
代码语言:javascript
复制
dataset3
代码语言:javascript
复制
<TensorSliceDataset shapes: ((), (), ()), types: (tf.int32, tf.int32, tf.string)>
代码语言:javascript
复制
for i in dataset3:
    print(i)
代码语言:javascript
复制
(<tf.Tensor: id=162, shape=(), dtype=int32, numpy=0>, <tf.Tensor: id=163, shape=(), dtype=int32, numpy=5>, <tf.Tensor: id=164, shape=(), dtype=string, numpy=b'a'>)
(<tf.Tensor: id=165, shape=(), dtype=int32, numpy=1>, <tf.Tensor: id=166, shape=(), dtype=int32, numpy=6>, <tf.Tensor: id=167, shape=(), dtype=string, numpy=b'b'>)
(<tf.Tensor: id=168, shape=(), dtype=int32, numpy=2>, <tf.Tensor: id=169, shape=(), dtype=int32, numpy=7>, <tf.Tensor: id=170, shape=(), dtype=string, numpy=b'c'>)
(<tf.Tensor: id=171, shape=(), dtype=int32, numpy=3>, <tf.Tensor: id=172, shape=(), dtype=int32, numpy=8>, <tf.Tensor: id=173, shape=(), dtype=string, numpy=b'd'>)
(<tf.Tensor: id=174, shape=(), dtype=int32, numpy=4>, <tf.Tensor: id=175, shape=(), dtype=int32, numpy=9>, <tf.Tensor: id=176, shape=(), dtype=string, numpy=b'e'>)

对比总结一下from_generator()、from_tensor()、from_tensor_slices()这三个方法:

  • from_tensors()在形式上与from_tensor_slices()很相似,但其实from_tensors()方法出场频率上比from_tensor_slices()差太多,因为from_tensor_slices()的功能更加符合实际需求,且返回的TensorSliceDataset对象也提供更多的数据处理功能。from_tensors()方法在接受list类型参数时,将整个list转换为Tensor对象放入Dataset中,当接受参数为tuple时,将tuple内元素转换为Tensor对象,然后将这个tuple放入Dataset中。
  • from_generator()方法接受一个可调用的生成器函数作为参数,在遍历Dataset对象时,通过通用生成器函数继续生成新的数据供训练和测试模型使用,这在大数据集合中很实用。
  • from_tensor_slices()方法接受参数为list时,将list各元素依次转换为Tensor对象,然后依次放入Dataset中;更为常见的情况是接受的参数为tuple,在这种情况下,要求tuple中各元素第一维度长度必须相等,from_tensor_slices()方法会将tuple各元素第一维度进行拆解,然后将对应位置的元素进行重组成一个个tuple依次放入Dataset中,这一功能在重新组合数据集属性和标签时很有用。另外,from_tensor_slices()方法返回的TensorSliceDataset对象支持batch、shuffle等等功能对数据进一步处理。

**(3)通过读取磁盘中的文件(文本、图片等等)来创建Dataset。**tf.data中提供了TextLineDataset、TFRecordDataset等对象来实现此功能。这部分内容比较多,也比较重要,我打算后续用专门一篇博客来总结这部分内容。

2 功能函数

(1)take()

功能:用于返回一个新的Dataset对象,新的Dataset对象包含的数据是原Dataset对象的子集。

参数:

  • count:整型,用于指定前count条数据用于创建新的Dataset对象,如果count为-1或大于原Dataset对象的size,则用原Dataset对象的全部数据创建新的对象。
代码语言:javascript
复制
dataset = tf.data.Dataset.range(10)
dataset_take = dataset.take(5)
代码语言:javascript
复制
for i in dataset_take:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(3, shape=(), dtype=int64)
tf.Tensor(4, shape=(), dtype=int64)

(2)batch()

功能:将Dataset中连续的数据分割成批。

参数:

  • batch_size:在单个批次中合并的此数据集的连续元素数。
  • drop_remainder:如果最后一批的数据量少于指定的batch_size,是否抛弃最后一批,默认为False,表示不抛弃。
代码语言:javascript
复制
dataset = tf.data.Dataset.range(11)
dataset_batch = dataset.batch(3)
代码语言:javascript
复制
for i in dataset_batch:
    print(i)
代码语言:javascript
复制
tf.Tensor([0 1 2], shape=(3,), dtype=int64)
tf.Tensor([3 4 5], shape=(3,), dtype=int64)
tf.Tensor([6 7 8], shape=(3,), dtype=int64)
tf.Tensor([ 9 10], shape=(2,), dtype=int64)
代码语言:javascript
复制
dataset_batch = dataset.batch(3,drop_remainder=True)
代码语言:javascript
复制
for i in dataset_batch:
    print(i)
代码语言:javascript
复制
tf.Tensor([0 1 2], shape=(3,), dtype=int64)
tf.Tensor([3 4 5], shape=(3,), dtype=int64)
tf.Tensor([6 7 8], shape=(3,), dtype=int64)
代码语言:javascript
复制
train_x = tf.random.uniform((10,3),maxval=100, dtype=tf.int32)
train_y = tf.range(10)
代码语言:javascript
复制
dataset = tf.data.Dataset.from_tensor_slices((train_x, train_y))
代码语言:javascript
复制
for i in dataset.take(3):
    print(i)
代码语言:javascript
复制
(<tf.Tensor: id=236, shape=(3,), dtype=int32, numpy=array([81, 53, 85], dtype=int32)>, <tf.Tensor: id=237, shape=(), dtype=int32, numpy=0>)
(<tf.Tensor: id=238, shape=(3,), dtype=int32, numpy=array([13,  7, 25], dtype=int32)>, <tf.Tensor: id=239, shape=(), dtype=int32, numpy=1>)
(<tf.Tensor: id=240, shape=(3,), dtype=int32, numpy=array([83, 25, 55], dtype=int32)>, <tf.Tensor: id=241, shape=(), dtype=int32, numpy=2>)
代码语言:javascript
复制
dataset_batch = dataset.batch(4)
代码语言:javascript
复制
for i in dataset_batch:
    print(i)
代码语言:javascript
复制
(<tf.Tensor: id=250, shape=(4, 3), dtype=int32, numpy=
array([[81, 53, 85],
       [13,  7, 25],
       [83, 25, 55],
       [53, 41, 11]], dtype=int32)>, <tf.Tensor: id=251, shape=(4,), dtype=int32, numpy=array([0, 1, 2, 3], dtype=int32)>)
(<tf.Tensor: id=252, shape=(4, 3), dtype=int32, numpy=
array([[41, 58, 39],
       [44, 68, 55],
       [52, 34, 22],
       [66, 39,  5]], dtype=int32)>, <tf.Tensor: id=253, shape=(4,), dtype=int32, numpy=array([4, 5, 6, 7], dtype=int32)>)
(<tf.Tensor: id=254, shape=(2, 3), dtype=int32, numpy=
array([[73,  8, 20],
       [67, 71, 98]], dtype=int32)>, <tf.Tensor: id=255, shape=(2,), dtype=int32, numpy=array([8, 9], dtype=int32)>)

为什么在训练模型时要将Dataset分割成一个个batch呢?

  • 对于小数据集是否使用batch关系不大,但是对于大数据集如果不分割成batch意味着将这个数据集一次性输入模型中,容易造成内存爆炸。
  • 通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
  • 单个epoch的迭代次数减少了,参数的调整也慢了,假如要达到相同的识别精度,需要更多的epoch。
  • 适当Batch Size使得梯度下降方向更加准确。

(3)padded_batch()

功能:batch()的进阶版,可以对shape不一致的连续元素进行分批。

参数:

  • batch_size:在单个批次中合并的此数据集的连续元素个数。
  • padded_shapes:tf.TensorShape或其他描述tf.int64矢量张量对象,表示在批处理之前每个输入元素的各个组件应填充到的形状。如果参数中有None,则表示将填充为每个批次中该尺寸的最大尺寸。
  • padding_values:要用于各个组件的填充值。默认值0用于数字类型,字符串类型则默认为空字符。
  • drop_remainder:如果最后一批的数据量少于指定的batch_size,是否抛弃最后一批,默认为False,表示不抛弃。
代码语言:javascript
复制
dataset = tf.data.Dataset.range(10)
代码语言:javascript
复制
dataset = dataset.map(lambda x: tf.fill([tf.cast(x, tf.int32)], x))
代码语言:javascript
复制
dataset_padded = dataset.padded_batch(4, padded_shapes=(None,))
代码语言:javascript
复制
for batch in dataset_padded:
    print(batch.numpy())
    print('---------------------')
代码语言:javascript
复制
[[0 0 0]
 [1 0 0]
 [2 2 0]
 [3 3 3]]
---------------------
[[4 4 4 4 0 0 0]
 [5 5 5 5 5 0 0]
 [6 6 6 6 6 6 0]
 [7 7 7 7 7 7 7]]
---------------------
[[8 8 8 8 8 8 8 8 0]
 [9 9 9 9 9 9 9 9 9]]
---------------------
代码语言:javascript
复制
dataset_padded = dataset.padded_batch(4, padded_shapes=(10,),padding_values=tf.constant(9,dtype=tf.int64))  # 修改填充形状和填充元素
代码语言:javascript
复制
for batch in dataset_padded:
    print(batch.numpy())
    print('---------------------')
代码语言:javascript
复制
[[9 9 9 9 9 9 9 9 9 9]
 [1 9 9 9 9 9 9 9 9 9]
 [2 2 9 9 9 9 9 9 9 9]
 [3 3 3 9 9 9 9 9 9 9]]
---------------------
[[4 4 4 4 9 9 9 9 9 9]
 [5 5 5 5 5 9 9 9 9 9]
 [6 6 6 6 6 6 9 9 9 9]
 [7 7 7 7 7 7 7 9 9 9]]
---------------------
[[8 8 8 8 8 8 8 8 9 9]
 [9 9 9 9 9 9 9 9 9 9]]
---------------------

(4)map()

功能:以dataset中每一位元素为参数执行pap_func()方法,这一功能在数据预处理中修改dataset中元素是很实用。

参数:

  • map_func:回调方法。
代码语言:javascript
复制
def change_dtype(t):  # 将类型修改为int32
    return tf.cast(t,dtype=tf.int32)
代码语言:javascript
复制
dataset = tf.data.Dataset.range(3)
代码语言:javascript
复制
for i in dataset:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
代码语言:javascript
复制
dataset_map = dataset.map(change_dtype)
代码语言:javascript
复制
for i in dataset_map:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)

map_func的参数必须对应dataset中的元素类型,例如,如果dataset中元素是tuple,map_func可以这么定义:

代码语言:javascript
复制
def change_dtype_2(t1,t2):
    return t1/10,tf.cast(t2,dtype=tf.int32)*(-1)  # 第一位元素除以10,第二为元素乘以-1
代码语言:javascript
复制
dataset = tf.data.Dataset.from_tensor_slices((tf.range(3),tf.range(3)))
代码语言:javascript
复制
dataset_map = dataset.map(change_dtype_2)
代码语言:javascript
复制
for i in dataset_map:
    print(i)
代码语言:javascript
复制
(<tf.Tensor: id=347, shape=(), dtype=float64, numpy=0.0>, <tf.Tensor: id=348, shape=(), dtype=int32, numpy=0>)
(<tf.Tensor: id=349, shape=(), dtype=float64, numpy=0.1>, <tf.Tensor: id=350, shape=(), dtype=int32, numpy=-1>)
(<tf.Tensor: id=351, shape=(), dtype=float64, numpy=0.2>, <tf.Tensor: id=352, shape=(), dtype=int32, numpy=-2>)

(5)filter()

功能:对Dataset中每一个执行指定过滤方法进行过滤,返回过滤后的Dataset对象

参数:

  • predicate:过滤方法,返回值必须为True或False
代码语言:javascript
复制
dataset = tf.data.Dataset.range(5)
代码语言:javascript
复制
def filter_func(t):  # 过滤出值为偶数的元素
    if t % 2 == 0:
        return True
    else:
        return False
代码语言:javascript
复制
dataset_filter = dataset.filter(filter_func)
代码语言:javascript
复制
for i in dataset_filter:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(4, shape=(), dtype=int64)

(6)shuffle()

功能:随机打乱数据

参数:

  • buffer_size:缓冲区大小,姑且认为是混乱程度吧,当值为1时,完全不打乱,当值为整个Dataset元素总数时,完全打乱。
  • seed:将用于创建分布的随机种子。
  • reshuffle_each_iteration:如果为true,则表示每次迭代数据集时都应进行伪随机重排,默认为True。
代码语言:javascript
复制
dataset = tf.data.Dataset.range(5)
代码语言:javascript
复制
dataset_s = dataset.shuffle(1)
代码语言:javascript
复制
for i in dataset_s:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(3, shape=(), dtype=int64)
tf.Tensor(4, shape=(), dtype=int64)
代码语言:javascript
复制
dataset_s = dataset.shuffle(5)
代码语言:javascript
复制
for i in dataset_s:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(4, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(3, shape=(), dtype=int64)

(7)repeat()

功能:对Dataset中的数据进行重复,以创建新的Dataset

参数:

  • count:重复次数,默认为None,表示不重复,当值为-1时,表示无限重复。
代码语言:javascript
复制
dataset = tf.data.Dataset.range(3)
代码语言:javascript
复制
dataset_repeat = dataset.repeat(3)
代码语言:javascript
复制
for i in dataset_repeat:
    print(i)
代码语言:javascript
复制
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(0, shape=(), dtype=int64)
tf.Tensor(1, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64

作者博客园:

https://www.cnblogs.com/chenhuabin

作者github:

https://github.com/ChenHuabin321/tensorflow2_tutorials

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 创建
  • 2 功能函数
相关产品与服务
批量计算
批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档