一、tf.data介绍
TensorFlow官方文档中对于tf.data的介绍是“一款高性能,易用性,可扩展性,可组合性很好的框架,用于构建输入队列和管道”,这种描述非常的简洁。就个人理解来说,tf.data主要是为了解决TensorFlow在数据处理阶段的瓶颈问题而被开发出来的,同时可以使数据处理变得简单易用。在构建模型的时候不仅涉及到各种复杂的模型结构的搭建,还需要考虑数据的质量和有效性,因此在数据处理阶段使用tf.data,可以使这个过程更加流畅、可靠和提高效率。
二、tf.dataset与迭代器
tf.data包含三种数据形式:tf.data.Dataset, tf.data.Iterator, tf.data.TFRecordDataset。其中Dataset是我们要处理的主要数据形式,而Iterator是用来对Dataset进行处理的工具。
tf.data.Dataset 表示一个元素序列,其中的每个元素包含一个或多个Tensor对象。tf.data.Iterator 是一个可重复初始化的对象,它为tf.data.Dataset 提供了一种迭代方式。
使用tf.data.Dataset.from_tensor_slices() 创建Dataset后,可以使用make_one_shot_iterator方法创建一个 Iterator对象,Iterator可以迭代这个 Dataset。
import tensorflow as tf
data = np.array([[1, 2], [3, 4], [5, 6]])
dataset = tf.data.Dataset.from_tensor_slices(data)
iterator = tf.compat.v1.data.make_one_shot_iterator(dataset)
next_item = iterator.get_next()
with tf.compat.v1.Session() as sess:
for i in range(3):
val = sess.run(next_item)
print(val)
上段代码将一个NumPy数组转换为tf.data.Dataset,为了迭代这个数据集,我们创建了一个位于数据集顶端的迭代器,这种迭代方式被称作“One-shot Iteration”,因为它可以完整地遍历数据集仅一次。
三、tf.data.dataset函数、tf.data.AUTOTUNE
tf.data.Dataset接受的数据源可以是numpy数组、Pandas DataFrame、Python生成器或者TFRecord文件等等。另外,tf.data.Dataset还有若干个非常有用的处理函数,如map()、shuffle()、batch()、zip()等,允许您根据需要对数据集进行一系列转换。
map() 函数使用一个函数将一个元素转换为另一个元素。shuffle() 函数从数据集样本中随机地提取和重组数据。batch() 函数收集多个元素并将它们组合在一起形成小 batch。
tf.data.AUTOTUNE 这个值会自动决定当前操作需要多少CPU资源来执行。在新版本的TensorFlow中,这个参数会自动计算最佳的CPU资源数量。这种动态调整资源的方法可以更好地利用计算机的资源。
四、TFRecordDataset
TFRecord是一种处理大量数据的格式,可以更好地存储和处理大量的样本。.tfrecords格式文件是tensorflow官方提供的一种序列化文件格式,该文件格式存储的数据类型只有tf.train.Example,tf.train.Example是一组特征与标签。而使用TFRecordDataset的一大作用便是可以读取这种文件格式。
import tensorflow as tf
filenames = ["file1.tfrecords", "file2.tfrecords", "file3.tfrecords"]
dataset = tf.data.TFRecordDataset(filenames)
上述代码中,我们将TFRecord文件放在第一层的列表中作为参数传递给TFRecordDataset的构造函数。然后,我们就可以使用这个 Dataset 了。
五、tf.data.Dataset.from、tf.data.dataset.from_tensor
tf.data.Dataset.from_tensor() 函数将张量转换为数据集。与from_tensor_slices()不同,from_tensor() 会将整个张量作为一个元素,这在许多情况下会更加方便。
tf.data.Dataset.from_generator() 函数使用 Python 生成器中的值作为Dataset的处理入口。
import tensorflow as tf
import numpy as np
x = np.array([[1, 2], [3, 4]])
y = np.array([[0], [1]])
dataset = tf.data.Dataset.from_tensor_slices((x, y))
这个代码通过创建一个元组 (x, y),使用 from_tensor_slices() 去创建了一个 Dataset。微调,我们可以通过 dataset.take() 和 list(dataset) 函数来看一下这个转换得如何:
for element in dataset:
print(element)
tf.data.Dataset.from_generator() 的工作方式和 from_tensor() 相似。它需要的参数是一个 Python 函数,并且可以接受额外参数。这个 Python 函数需要通过 yield 返回元素。
def count(stop):
i = 0
while i
六、tf.data函数与matlab
TensorFlow提供了 tf.data.experimental.CsvDataset,tf.data.experimental.SqlDataset 等多个数据集组件,以满足不同用户的数据处理需求。而matlab与TensorFlow之间的数据交互则是使用matlabengineforpython桥接实现的
import tensorflow as tf
csv_file_path = 'iris_training.csv'
BATCH_SIZE = 32
def parse_csv(line):
example_defaults = [[0.0], [0.0], [0.0], [0.0], [0]]
parsed_line = tf.io.decode_csv(line, example_defaults)
features = tf.reshape(parsed_line[:-1], shape=(4,))
label = tf.reshape(parsed_line[-1], shape=())
return features, label
ds = tf.data.TextLineDataset(csv_file_path).skip(1).map(parse_csv).shuffle(buffer_size=10000).batch(BATCH_SIZE).prefetch(buffer_size=tf.data.AUTOTUNE)
此外,TensorFlow支持在Python and Google Colaboratory环境下使用Matlab。使用TensorFlow开源库中的‘matlabengineforpython’,可以将Python和Matlab整合在一起。可通过使用Python脚本和Matlab代码的混合来介绍TensorFlow工具,将底层和高层加以结合。这也使得Matlab的数据处理和可视化功能应用到了TensorFlow。这对于matlab用户来说是非常便利的。