将data数据进行切片,并在引用时按size大小输出迭代。
data = [[0,0,0,0,0],[1,1,1,1,1],[2,2,2,2,2]]
dataset = tf.data.Dataset.from_tensor_slices(data).batch(1)
for index,line in enumerate(dataset):
print(index," ",line)
print('------------------')
输出为(tf.tensor):
0 tf.Tensor([[0 0 0 0 0]], shape=(1, 5), dtype=int32)
------------------
1 tf.Tensor([[1 1 1 1 1]], shape=(1, 5), dtype=int32)
------------------
2 tf.Tensor([[2 2 2 2 2]], shape=(1, 5), dtype=int32)
------------------
如果将batch参数改为2,则输出如下,数据不足时输出全部剩余
0 tf.Tensor(
[[0 0 0 0 0]
[1 1 1 1 1]], shape=(2, 5), dtype=int32)
------------------
1 tf.Tensor([[2 2 2 2 2]], shape=(1, 5), dtype=int32)
------------------
(如果不加上batch打包,默认一个一个输出,所以size为1时没有意义)
输入为字典时,输出按“key"值索引:
data = {"a":np.array([1.,2.,3.,4.,5.]),"b":np.random.random(size=(5,3))}
dataset = tf.data.Dataset.from_tensor_slices(data)
for index,line in enumerate(dataset):
print(index," ",line["a"],"****",line["b"])
print('------------------')
输出为(tf.tensor):
0 tf.Tensor(1.0, shape=(), dtype=float64) **** tf.Tensor([0.30519996 0.39658704 0.91462395], shape=(3,), dtype=float64)
------------------
1 tf.Tensor(2.0, shape=(), dtype=float64) **** tf.Tensor([0.3949131 0.37497861 0.58271534], shape=(3,), dtype=float64)
------------------
2 tf.Tensor(3.0, shape=(), dtype=float64) **** tf.Tensor([0.50861414 0.556261 0.22094466], shape=(3,), dtype=float64)
------------------
3 tf.Tensor(4.0, shape=(), dtype=float64) **** tf.Tensor([0.71673955 0.96458281 0.53815042], shape=(3,), dtype=float64)
------------------
4 tf.Tensor(5.0, shape=(), dtype=float64) **** tf.Tensor([0.93950987 0.87853242 0.05198704], shape=(3,), dtype=float64)
------------------
输入为元组时,按元组形式解包
data = ((np.array([1.,2.,3.,4.,5.]),(np.random.random(size=(5,3)))))
dataset = tf.data.Dataset.from_tensor_slices(data)
for xs,ys in dataset:
print(xs,"****",ys)
print('------------------')
输出为(tf.tensor):
tf.Tensor(1.0, shape=(), dtype=float64) **** tf.Tensor([0.65001678 0.09153465 0.06510237], shape=(3,), dtype=float64)
------------------
tf.Tensor(2.0, shape=(), dtype=float64) **** tf.Tensor([0.9090613 0.88832908 0.11876647], shape=(3,), dtype=float64)
------------------
tf.Tensor(3.0, shape=(), dtype=float64) **** tf.Tensor([0.44002558 0.06128562 0.11221942], shape=(3,), dtype=float64)
------------------
tf.Tensor(4.0, shape=(), dtype=float64) **** tf.Tensor([0.39922175 0.11770404 0.89398157], shape=(3,), dtype=float64)
------------------
tf.Tensor(5.0, shape=(), dtype=float64) **** tf.Tensor([0.82551231 0.02455912 0.03370511], shape=(3,), dtype=float64)
------------------
map用法与Python一样,接受一个函数对象参数,使用Dataset读取的每个数据都会被当成这个函数对象的参数,并进行计算输出,组成一个新的数据集。
def get_sum(dict):
feat = dict['feat']
label = dict['label']
sum = tf.reduce_mean(label)
return feat,sum
dataset = tf.data.Dataset.from_tensor_slices({
"feat":np.array([1.,2.,3.,4.,5.]),
"label":np.random.random(size=(5,3))})
dataset = dataset.map(get_sum)
for xs,ys in dataset:
print(xs,"****",ys)
print('------------------')
输出为(tf.tensor):
tf.Tensor(1.0, shape=(), dtype=float64) **** tf.Tensor(0.4689615933870761, shape=(), dtype=float64)
------------------
tf.Tensor(2.0, shape=(), dtype=float64) **** tf.Tensor(0.31919237915828286, shape=(), dtype=float64)
------------------
tf.Tensor(3.0, shape=(), dtype=float64) **** tf.Tensor(0.5887782150986411, shape=(), dtype=float64)
------------------
tf.Tensor(4.0, shape=(), dtype=float64) **** tf.Tensor(0.46332159001270884, shape=(), dtype=float64)
------------------
tf.Tensor(5.0, shape=(), dtype=float64) **** tf.Tensor(0.7071242889720469, shape=(), dtype=float64)
------------------
shuffle的作用是打乱数据集中的元素,它有一个参数buffer_size,表示打乱时使用的缓冲区大小。
dataset = tf.data.Dataset.from_tensor_slices({
"feat":np.array([1.,2.,3.,4.,5.]),
"label":np.random.random(size=(5,3))}).shuffle(buffer_size=100).batch(2)
for line in dataset:
print(line['feat'],"****",line['label'])
print('------------------')
第一次输出为(tf.tensor):
tf.Tensor([4. 5.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.54950238 0.50334572 0.59974542]
[0.10169851 0.98936089 0.42366309]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([1. 2.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.52764501 0.40446342 0.39633686]
[0.6714302 0.03449827 0.99175639]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([3.], shape=(1,), dtype=float64) **** tf.Tensor([[0.62605223 0.9765801 0.11661118]], shape=(1, 3), dtype=float64)
------------------
再运行一次,输出为(tf.tensor):
tf.Tensor([5. 4.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.24737827 0.99113837 0.78126015]
[0.29884487 0.12049342 0.8041113 ]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([3. 1.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.29074631 0.18683898 0.11682108]
[0.97275326 0.15158869 0.29526389]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([2.], shape=(1,), dtype=float64) **** tf.Tensor([[0.03444436 0.8773693 0.81584051]], shape=(1, 3), dtype=float64)
------------------
两次输出结果并不相同。缓冲区大小表示打乱时的数据容量,打乱之后,再从中取batch(2)个数据。
repeat将数据集重复若干次。
dataset = tf.data.Dataset.from_tensor_slices({
"feat":np.array([1.,2.,3.,4.,5.]),
"label":np.random.random(size=(5,3))})
dataset = dataset.repeat(2).shuffle(buffer_size=100).batch(2)
for line in dataset:
print(line['feat'],"****",line['label'])
print('------------------')
输出为(tf.tensor):
tf.Tensor([4. 4.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.7149274 0.83963519 0.20180617]
[0.7149274 0.83963519 0.20180617]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([3. 1.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.81400672 0.9411397 0.11000945]
[0.48605118 0.30965208 0.4316607 ]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([1. 3.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.48605118 0.30965208 0.4316607 ]
[0.81400672 0.9411397 0.11000945]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([5. 2.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.54118115 0.27571944 0.31600973]
[0.88704058 0.94115315 0.52538436]], shape=(2, 3), dtype=float64)
------------------
tf.Tensor([2. 5.], shape=(2,), dtype=float64) **** tf.Tensor(
[[0.88704058 0.94115315 0.52538436]
[0.54118115 0.27571944 0.31600973]], shape=(2, 3), dtype=float64)
------------------