Google老师亲授 TensorFlow2.0入门到进阶笔记- (dataset)

Posted 一杯敬朝阳一杯敬月光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google老师亲授 TensorFlow2.0入门到进阶笔记- (dataset)相关的知识,希望对你有一定的参考价值。

 版本:numpy 1.16.6         tensorflow 2.2.0         tensorflow.keras 2.3.0-tf

1. 引入

  • DataSet基础使用
    • tf.data.Dataset.from_tensor_slices # 构建dataset
    • repeat, batch, interleave, map, shuffle, list_files,...
  • csv
    • tf.data.TextLineDataset, # 读取文本文件
    • tf.io.decode_csv # 解析csv
  • tfrecord
    • tf.train.FloatList, tf.train.Int64List, tf.train.BytesList
    • tf.train.Feature, tf.train.Features, tf.train.Example # 封装tfexample写到文件中去
    • example.SerializeToString # 序列化
    • tf.io.ParseSingleExample # 解析一个具体的tf example
    • tf.io.VarLenFeature, tf.io.FixedLenFeature
    • tf.data.TFRecoredDataset, tf.io.TFRecoredOptions

2. 基础API使用

2.1 从内存中构建数据

从内存中构建数据集,参数可以是普通的列表、numpy的一个数组、元组或字典,其中元组形如(x,y),字典形如key1: x, key2:y,其中x和y的第一个维度需要相同

# 普通的列表
# TensorSliceDataset shapes: (), types: tf.int32
dataset = tf.data.Dataset.from_tensor_slices(list(range(10)))
# numpy数组
dataset = tf.data.Dataset.from_tensor_slices(np.arange(10))

x = np.array([[1, 2], [3, 4], [5, 6]])
y = np.array(['cat', 'dog', 'fox'])
# 元祖
# TensorSliceDataset shapes: ((2,), ()), types: (tf.int64, tf.string)
dataset = tf.data.Dataset.from_tensor_slices((x, y))
# 字典
# TensorSliceDataset 
# shapes: feature: (2,), label: (), 
# types: feature: tf.int32, label: tf.string
dataset = tf.data.Dataset.from_tensor_slices('feature': x, 'label': y)

2.2 遍历数据

列表 or numpy数组

dataset = tf.data.Dataset.from_tensor_slices(list(range(10)))
for item in dataset:
    print(item)
    print(item.shape, type(item))
    print(item.numpy())
    print()

其中,dataset的类型是:class 'tensorflow.python.data.ops.dataset_ops.TensorSliceDataset',里面的每一个元素的类型是:class 'tensorflow.python.framework.ops.EagerTensor'

输出:形如:

tf.Tensor(0, shape=(), dtype=int32)
() <class 'tensorflow.python.framework.ops.EagerTensor'>
0

tf.Tensor(1, shape=(), dtype=int32)
() <class 'tensorflow.python.framework.ops.EagerTensor'>
1
.
.
.
tf.Tensor(9, shape=(), dtype=int32)
() <class 'tensorflow.python.framework.ops.EagerTensor'>
9

 元组

x = np.array([[1, 2], [3, 4], [5, 6]])
y = np.array(['cat', 'dog', 'fox'])
dataset = tf.data.Dataset.from_tensor_slices((x, y))
for item in dataset:
    print(item)
    print("=" * 40)
    break
    
for item_x, item_y in dataset:
    print(item_x)
    print(item_y)
    print("=" * 20)

 输出:

(<tf.Tensor: shape=(2,), dtype=int32, numpy=array([1, 2], dtype=int32)>, <tf.Tensor: shape=(), dtype=string, numpy=b'cat'>)
========================================
tf.Tensor([1 2], shape=(2,), dtype=int32)
tf.Tensor(b'cat', shape=(), dtype=string)
====================
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(b'dog', shape=(), dtype=string)
====================
tf.Tensor([5 6], shape=(2,), dtype=int32)
tf.Tensor(b'fox', shape=(), dtype=string)
====================

字典

x = [[1, 2], [3, 4], [5, 6]]
y = ['cat', 'dog', 'fox']
dataset = tf.data.Dataset.from_tensor_slices('feature': x, 'label': y)
for item in dataset:
    print(item)
    print(item['feature'])
    print(item['label'])
    print("=" * 20)

输出:

'feature': <tf.Tensor: shape=(2,), dtype=int32, numpy=array([1, 2], dtype=int32)>, 'label': <tf.Tensor: shape=(), dtype=string, numpy=b'cat'>
tf.Tensor([1 2], shape=(2,), dtype=int32)
tf.Tensor(b'cat', shape=(), dtype=string)
====================
'feature': <tf.Tensor: shape=(2,), dtype=int32, numpy=array([3, 4], dtype=int32)>, 'label': <tf.Tensor: shape=(), dtype=string, numpy=b'dog'>
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(b'dog', shape=(), dtype=string)
====================
'feature': <tf.Tensor: shape=(2,), dtype=int32, numpy=array([5, 6], dtype=int32)>, 'label': <tf.Tensor: shape=(), dtype=string, numpy=b'fox'>
tf.Tensor([5 6], shape=(2,), dtype=int32)
tf.Tensor(b'fox', shape=(), dtype=string)
====================

2.2 repeat

重复

遍历:repeat将原数据重复指定次数,在遍历的时候,每个元素的类型同未repeat的时候一致,只不过元素的数目变多了,是原来数据的制指定次数倍。

dataset = tf.data.Dataset.from_tensor_slices(np.arange(10))
dataset = dataset.repeat(3)
print(dataset)
print(type(dataset))

输出:

<RepeatDataset shapes: (), types: tf.int64>
<class 'tensorflow.python.data.ops.dataset_ops.RepeatDataset'>
dataset = tf.data.Dataset.from_tensor_slices('feature': x, 'label': y)
dataset = dataset.repeat(2)
print(dataset)
print(type(dataset))
for item in dataset:
    print(item['feature'])
    print(item['label'])
    print("=" * 40)

输出:

<RepeatDataset shapes: feature: (2,), label: (), types: feature: tf.int32, label: tf.string>
<class 'tensorflow.python.data.ops.dataset_ops.RepeatDataset'> 
tf.Tensor([1 2], shape=(2,), dtype=int32)
tf.Tensor(b'cat', shape=(), dtype=string)
========================================
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(b'dog', shape=(), dtype=string)
========================================
tf.Tensor([5 6], shape=(2,), dtype=int32)
tf.Tensor(b'fox', shape=(), dtype=string)
========================================
tf.Tensor([1 2], shape=(2,), dtype=int32)
tf.Tensor(b'cat', shape=(), dtype=string)
========================================
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(b'dog', shape=(), dtype=string)
========================================
tf.Tensor([5 6], shape=(2,), dtype=int32)
tf.Tensor(b'fox', shape=(), dtype=string)
========================================

2.3 batch

dataset = tf.data.Dataset.from_tensor_slices(np.arange(10))
dataset = dataset.repeat(3).batch(7, drop_remainder=True)
print(dataset)
print(type(dataset))
for item in dataset:
    print(item)
    print(item.shape, type(item))
    print(item.numpy())
    print()
<BatchDataset shapes: (7,), types: tf.int64>
<class 'tensorflow.python.data.ops.dataset_ops.BatchDataset'>tf.Tensor([0 1 2 3 4 5 6], shape=(7,), dtype=int64)
(7,) <class 'tensorflow.python.framework.ops.EagerTensor'>
[0 1 2 3 4 5 6]

tf.Tensor([7 8 9 0 1 2 3], shape=(7,), dtype=int64)
(7,) <class 'tensorflow.python.framework.ops.EagerTensor'>
[7 8 9 0 1 2 3]

tf.Tensor([4 5 6 7 8 9 0], shape=(7,), dtype=int64)
(7,) <class 'tensorflow.python.framework.ops.EagerTensor'>
[4 5 6 7 8 9 0]

tf.Tensor([1 2 3 4 5 6 7], shape=(7,), dtype=int64)
(7,) <class 'tensorflow.python.framework.ops.EagerTensor'>
[1 2 3 4 5 6 7]
dataset = tf.data.Dataset.from_tensor_slices('feature': x, 'label': y)
dataset = dataset.repeat(2).batch(5)
print(dataset)
print(type(dataset))
for item in dataset:
    print(item['feature'])
    print(item['label'])
    print(type(item), type(item['feature']), type(item['label']))
    print("=" * 40)

输出:

<BatchDataset shapes: feature: (None, 2), label: (None,), types: feature: tf.int32, label: tf.string>
<class 'tensorflow.python.data.ops.dataset_ops.BatchDataset'>
tf.Tensor(
[[1 2]
 [3 4]
 [5 6]
 [1 2]
 [3 4]], shape=(5, 2), dtype=int32)
tf.Tensor([b'cat' b'dog' b'fox' b'cat' b'dog'], shape=(5,), dtype=string)
<class 'dict'> <class 'tensorflow.python.framework.ops.EagerTensor'> <class 'tensorflow.python.framework.ops.EagerTensor'>
========================================
tf.Tensor([[5 6]], shape=(1, 2), dtype=int32)
tf.Tensor([b'fox'], shape=(1,), dtype=string)
<class 'dict'> <class 'tensorflow.python.framework.ops.EagerTensor'> <class 'tensorflow.python.framework.ops.EagerTensor'>
========================================

2.4 interleave 

interleave: 对现有dataset中的每一个元素做处理,每个元素做完处理会产生一个新的结果,interleave会把这些新的结果合并起来,形成一个新的数据集。
case: 例如现有的dataset里面存入的是一系列的文件名,用interleave去做一个变化,遍历文件名数据集中的所有元素集文件名,把文件名对应的文件的内容读取出来,这样每个文件名都形成新的数据集,interleave把新的数据集合并起来,成为一个总的大数据集。    

几个关键的参数:

  • map_fn: 做什么变换
  • cycle_length:并行程度,同时并行的处理该dataset中多少个元素
  • block_length:从上面变换的结果中每次取多少个出来

以上是关于Google老师亲授 TensorFlow2.0入门到进阶笔记- (dataset)的主要内容,如果未能解决你的问题,请参考以下文章

Google老师亲授 TensorFlow2.0入门到进阶笔记- (dataset)

请问下tensorflow2.0没有placeholder了吗,为啥我用1.9也有不兼容问题

TensorFlow怎样入门,怎样快速学习?

Android | TensorFlow2.0 入门1

Android | TensorFlow2.0 入门1

Android | TensorFlow2.0 入门1