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): |