tensorflow Dataset的使用

参考

https://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/79342369

https://cloud.tencent.com/developer/article/1096597

使用 Dataset 一般包含以下几个方面:

  1. 载入数据:为数据创建一个Dataset实例

  2. 创建一个迭代器:使用创建的数据集来构造一个Iterator实例以遍历数据集

  3. 使用数据:使用创建的迭代器,我们可以从数据集中获取数据元素,从而输入到模型中去。

1. 载入数据:为数据创建一个Dataset实例

https://cloud.tencent.com/developer/article/10965972. 创建一个迭代器:使用创建的数据集来构造一个Iterator实例以遍历数据集

3. 使用数据:使用创建的迭代器,我们可以从数据集中获取数据元素,从而输入到模型中去。

载入数据

方式有多种,看程序

import numpy as np
import tensorflow as tf
#最直观的就是从 numpy 载入,我们可以利用 numpy 定义好一个数组,然后将定义好的数组载入 dataset
# create a random vector of shape (5,2),5
x = np.random.sample((5,2)) #5行2列的2维矩阵
print(x)
# [[0.151589   0.11253274]
#  [0.76125935 0.98683329]
#  [0.52536542 0.23779264]
#  [0.71895855 0.57306437]
#  [0.00825521 0.56919228]]
# make a dataset from a numpy array
dataset = tf.data.Dataset.from_tensor_slices(x)

#另外一种比较常见的载入方式是利用 placeholder,有的时候,我们需要从外部载入数据,可以利用 placeholder 来实现:
x = tf.placeholder(tf.float32, shape=[None,2])#Tensor("Placeholder:0", shape=(?, 2), dtype=float32)
print(x)
dataset = tf.data.Dataset.from_tensor_slices(x)

#从tensors中载入,我们当然也可以用一些张量初始化数据集
# using a tensor
x=tf.random_uniform([5, 2])#Tensor("random_uniform:0", shape=(5, 2), dtype=float32)
dataset = tf.data.Dataset.from_tensor_slices(x)


#或者可以同时传递 feature 和 label,
features, labels = (np.random.sample((5,2)), np.random.sample((5,3))) #
dataset = tf.data.Dataset.from_tensor_slices((features,labels)) #feature 和 labels 需要在第一个维度上保持,否则会报错

创建迭代,还没paotong

import numpy as np
import tensorflow as tf
# initializable iterator to switch between dataset
EPOCHS = 10
x, y = tf.placeholder(tf.float32, shape=[None,2]), tf.placeholder(tf.float32, shape=[None,1])
dataset = tf.data.Dataset.from_tensor_slices((x, y))
train_data = (np.random.sample((5,2)), np.random.sample((5,1)))
test_data = (np.array([[1,2]]), np.array([[0]]))



iter = dataset.make_initializable_iterator()
features, labels = iter.get_next()
with tf.Session() as sess:
#     initialise iterator with train data
    sess.run(iter.initializer, feed_dict={ x: train_data[0], y: train_data[1]})
    for _ in range(EPOCHS):
        sess.run([features, labels])
    #     switch to test data
        sess.run(iter.initializer, feed_dict={ x: test_data[0], y: test_data[1]})
        print('pp',sess.run([features, labels]))

应用

import numpy as np
import tensorflow as tf
# initializable iterator to switch between dataset
BATCH_SIZE=32
#.random.sample封装到另外一个numpy数组中,因此会增加一个维度以用于数据batch。
features, labels = (np.array([np.random.sample((5,2))]), np.array([np.random.sample((5,1))]))
dataset =tf.data.Dataset.from_tensor_slices((features,labels)).repeat().batch(BATCH_SIZE)

#接下来和平时一样,创建一个迭代器
iter = dataset.make_one_shot_iterator()
x, y = iter.get_next()

#建立一个简单的神经网络模型
# make a simple model
net = tf.layers.dense(x, 8) # pass the first value from iter.get_next() as input
net = tf.layers.dense(net, 8)
prediction = tf.layers.dense(net, 1)
loss = tf.losses.mean_squared_error(prediction, y) # pass the second value from iter.get_net() as label
train_op = tf.train.AdamOptimizer().minimize(loss)

#直接使用来自iter.get_next()的张量作为神经网络第一层的输入和损失函数的标签。将上面的综合起来可以得到:
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(3):
        _, loss_value = sess.run([train_op, loss])
        print("Iter: {}, Loss: {:.4f}".format(i, loss_value))

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/88747401