Tensorflow2.0: tf.Keras常用方法batch()、map()、shuffle()、repeat()

1、tf.data.Data.from_tensor_slices(data).batch(size)

将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时没有意义)

1.1data数据为字典时

输入为字典时,输出按“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)
------------------

 1.2data数据为元组时

输入为元组时,按元组形式解包

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

2、map()、shuffle()、repeat()用法

2.1、map()

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

2.2、shuffle()

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)个数据。

2.3、repeat()

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

 

你可能感兴趣的:(深度学习,深度学习,tensorflow)