tf.data
建立tf.data.Dataset
代表数据:建立方法:tf.data.Dataset.from_tensors()
或tf.data.Dataset.from_tensor_slices()
,或tf.data.TFRecordDataset()
.
只要建立了Dataset
后,就可以像Scala一样进行数据变换生成新的数据;此外,Dataset
是可迭代的:
1 | dataset = tf.data.Dataset.from_tensor_slices([8, 3, 0, 8, 2, 1]) |
1 | print(dataset.reduce(0, lambda state, value: state + value).numpy()) |
Dataset structure
Dataset
里的每个元素类型为tf.Tensor
,tf.sparse.SparseTensor
,tf.RaggedTensor
等。
element_spec
属性可以告知元素的的类型信息:
1 | dataset2 = tf.data.Dataset.from_tensor_slices( |
创建data
情况1:内存里可以放下,先转变为tf.Tensor
,然后用Dataset.from_tensor_slices()
处理为Dataset
:
1 | train, test = tf.keras.datasets.fashion_mnist.load_data() |
TFRecord文件:是二进制的文件,可与tf.data.TFRecordDataset
配合使用,形成pipeline:
1 | # Creates a dataset that reads all of the examples from two files. |
文本数据:对应的接口tf.data.TextLineDataset
:
1 | directory_url = 'https://storage.googleapis.com/download.tensorflow.org/data/illiad/' |
- 打乱这样的文本文件
Dataset.interleave
对于CSV数据:
1 | titanic_file = tf.keras.utils.get_file("train.csv", "https://storage.googleapis.com/tf-datasets/titanic/train.csv")df = pd.read_csv(titanic_file, index_col=None) |
数据集分为Batch
:
- 下面的例子用
dataset.batch(4)
将数据集分割为4个批量的大小;
1 | inc_dataset = tf.data.Dataset.range(100) |
但是Dataset
的shape可能是None
,原因是最后一个batch可能不足:
1 | batched_dataset |
可以用drop_remainder
忽略掉最后一个batch,这样所有的data都是一样的大小为batch
;
1 | batched_dataset = dataset.batch(7, drop_remainder=True) |
处理的数据集里,如文本序列长度不一,可以用padded_batch
接口,对长度不一的进行padding操作:
1 | dataset = tf.data.Dataset.range(100) |
1 | dataset.repeat(3).batch(128) #这样的batch可能会跨越重复的dataset |
打乱数据:Dataset.shuffle()
;
预处理data
Dataset.map(f)
,其中f
处理tf.Tensor
型数据;
tf.py_function()
:传python函数作为函数f
;
1 | import scipy.ndimage as ndimage |
加载数据集时,可以选择从训练集的某部分开始:
1 | range_ds = tf.data.Dataset.range(20) |
tf.data.TextLineDataset
读取本地文本文件:
1 | def parse(x): |