Dataset学习
import tensorflow as tf
import numpy as np
a = np.random.uniform(size=(5, 2))
print(a)
[[0.0483624 0.06583819]
[0.02226427 0.04434701]
[0.21813774 0.69337174]
[0.53861135 0.23749001]
[0.86036676 0.96004531]]
- tf.data.Dataset.from_tensor_slices: 切分传入Tensor的第一个维度,生成相应的dataset。
- 传入的数值是一个矩阵:它的形状为(5, 2),tf.data.Dataset.from_tensor_slices就会切分它形状上的第一个维度,最后生成的dataset中一个含有5个元素,每个元素的形状是(2, ),即每个元素是矩阵的一行。
dataset = tf.data.Dataset.from_tensor_slices(a)
print(dataset)
for item in dataset:
print(item)
<TensorSliceDataset shapes: (2,), types: tf.float64>
tf.Tensor([0.0483624 0.06583819], shape=(2,), dtype=float64)
tf.Tensor([0.02226427 0.04434701], shape=(2,), dtype=float64)
tf.Tensor([0.21813774 0.69337174], shape=(2,), dtype=float64)
tf.Tensor([0.53861135 0.23749001], shape=(2,), dtype=float64)
tf.Tensor([0.86036676 0.96004531], shape=(2,), dtype=float64)
x = np.array([[1, 2],[3, 4],[5, 6]])
y = np.array(['cat', 'dog', 'fox'])
dataset3 = tf.data.Dataset.from_tensor_slices((x, y))
print(dataset3)
for item_x,item_y in dataset3:
print(item_x.numpy(), item_y.numpy())
<TensorSliceDataset shapes: ((2,), ()), types: (tf.int32, tf.string)>
[1 2] b'cat'
[3 4] b'dog'
[5 6] b'fox'
dataset4 = tf.data.Dataset.from_tensor_slices({'feature':x,
'label':y})
for item in dataset4:
print(item['feature'].numpy(),item['label'].numpy())
[1 2] b'cat'
[3 4] b'dog'
[5 6] b'fox'
- map:接收一个函数,Dataset中的每个元素都会被当作这个函数的输入,并将函数返回值作为新的Dataset。如下,对每个元素加1。
dataset_1 = dataset.map(lambda x: x + 1)
for item in dataset_1:
print(item)
tf.Tensor([1.0483624 1.06583819], shape=(2,), dtype=float64)
tf.Tensor([1.02226427 1.04434701], shape=(2,), dtype=float64)
tf.Tensor([1.21813774 1.69337174], shape=(2,), dtype=float64)
tf.Tensor([1.53861135 1.23749001], shape=(2,), dtype=float64)
tf.Tensor([1.86036676 1.96004531], shape=(2,), dtype=float64)
dataset_2 = dataset_1.batch(3)
for item in dataset_2:
print(item)
tf.Tensor(
[[1.0483624 1.06583819]
[1.02226427 1.04434701]
[1.21813774 1.69337174]], shape=(3, 2), dtype=float64)
tf.Tensor(
[[1.53861135 1.23749001]
[1.86036676 1.96004531]], shape=(2, 2), dtype=float64)
- repeat:repeat的功能就是将整个序列重复多次,主要用来处理机器学习中的epoch。
dataset_3 = dataset_1.repeat(2)
for item in dataset_3:
print(item)
tf.Tensor([1.0483624 1.06583819], shape=(2,), dtype=float64)
tf.Tensor([1.02226427 1.04434701], shape=(2,), dtype=float64)
tf.Tensor([1.21813774 1.69337174], shape=(2,), dtype=float64)
tf.Tensor([1.53861135 1.23749001], shape=(2,), dtype=float64)
tf.Tensor([1.86036676 1.96004531], shape=(2,), dtype=float64)
tf.Tensor([1.0483624 1.06583819], shape=(2,), dtype=float64)
tf.Tensor([1.02226427 1.04434701], shape=(2,), dtype=float64)
tf.Tensor([1.21813774 1.69337174], shape=(2,), dtype=float64)
tf.Tensor([1.53861135 1.23749001], shape=(2,), dtype=float64)
tf.Tensor([1.86036676 1.96004531], shape=(2,), dtype=float64)
- shuffle:打乱dataset中的元素,它有一个参数buffersize,表示打乱时使用的buffer的大小。
dataset_4 = dataset_1.shuffle(buffer_size=3)
for item in dataset_4:
print(item)
tf.Tensor([1.21813774 1.69337174], shape=(2,), dtype=float64)
tf.Tensor([1.0483624 1.06583819], shape=(2,), dtype=float64)
tf.Tensor([1.53861135 1.23749001], shape=(2,), dtype=float64)
tf.Tensor([1.02226427 1.04434701], shape=(2,), dtype=float64)
tf.Tensor([1.86036676 1.96004531], shape=(2,), dtype=float64)