数据集的基本使用方法
import tempfile
import tensorflow as tf
input_data = [1, 2, 3, 5, 8] # 这不是列表吗,为什么书里叫数组
dataset = tf.data.Dataset.from_tensor_slices(input_data) # 这是构建Dataset内存中的数据
# 定义迭代器。
iterator = dataset.make_one_shot_iterator()
# get_next() 返回代表一个输入数据的张量。
x = iterator.get_next()
y = x * x
with tf.Session() as sess:
for i in range(len(input_data)):
print(sess.run(y))
先生成两个文件:file1,file2
import tempfile
import tensorflow as tf
# 创建文本文件作为本例的输入。
with open("./test1.txt", "w") as file:
file.write("File1, line1.\n")
file.write("File1, line2.\n")
with open("./test2.txt", "w") as file:
file.write("File2, line1.\n")
file.write("File2, line2.\n")
再读取两个文件并放到一个dataset,然后输出(注意iterator。get_next()获得的是张量)
import tempfile
import tensorflow as tf
# 从文本文件创建数据集。这里可以提供多个文件。
input_files = ["./text1.txt", "./text2.txt"]
dataset = tf.data.TextLineDataset(input_files) # 注意,注意,这里换了,
# tf.data.Dataset.from_tensor_slices(input_data) 是读取数变为张量
# 定义迭代器。
iterator = dataset.make_one_shot_iterator()
# 这里get_next()返回一个字符串类型的张量,代表文件中的一行。
# 注意,张量,张量,凡是iterator出来的都是张量
x = iterator.get_next()
with tf.Session() as sess:
for i in range(4):
print(sess.run(x))
TFRecoard读取:
import tempfile
import tensorflow as tf
# 以下解析TFRecord文件里的数据。读取文件为本章第一节创建的文件
def parser(record):
features = tf.parse_single_example(
record,
features={
'image_raw': tf.FixedLenFeature([], tf.string),
'pixels': tf.FixedLenFeature([], tf.int64),
'label': tf.FixedLenFeature([], tf.int64)
}
)
decoded_images = tf.decode_raw(features['image_raw'], tf.uint8)
retyped_images = tf.cast(decoded_images, tf.float32)
images = tf.reshape(retyped_images, [784])
labels = tf.cast(features['label'], tf.int32)
pixels = tf.cast(features['pixels'], tf.int32)
return images, labels, pixels
# 从TFRecord文件创建数据集。这里可以提供多个文件。
input_files = ["output.tfrecords"]
dataset = tf.data.TFRecordDataset(input_files) # 看,看,看,这次又换了
# map()函数表示对数据集中的每一条数据进行调用解析方法。
dataset = dataset.map(parser) # 这是一个很常用的套路,要学会, 表示对dataset中的数据进行parser操作
# 定义遍历数据集的迭代器。
iterator = dataset.make_one_shot_iterator()
# 读取数据,可用于进一步计算
image, label, _ = iterator.get_next()
with tf.Session() as sess:
for i in range(10):
x, y = sess.run([image, label])
print(y)
结果为:
下面是用到placeholder的操作,因为是placeholder所以要initializer,所以使用了iterator = dataset.make_initializable_iterator()
还有一个点,在Session下要用 sess.run(iterator. feed_dict={input_files: ["output.tfrecords"]})
import tempfile
import tensorflow as tf
# 以下为使用initializable_iterator来动态初始化数据集
def parser(record):
features = tf.parse_single_example(
record,
features={
'image_raw':tf.FixedLenFeature([],tf.string),
'pixels':tf.FixedLenFeature([],tf.int64),
'label':tf.FixedLenFeature([],tf.int64)
})
decoded_images = tf.decode_raw(features['image_raw'],tf.uint8)
retyped_images = tf.cast(decoded_images, tf.float32)
images = tf.reshape(retyped_images, [784])
labels = tf.cast(features['label'],tf.int32)
#pixels = tf.cast(features['pixels'],tf.int32)
return images, labels
# 从TFRecord文件创建数据集,具体文件路径是一个placeholder,稍后再提供具体路径。
input_files = tf.placeholder(tf.string)
dataset = tf.data.TFRecordDataset(input_files)
dataset = dataset.map(parser)
# 定义遍历dataset的initializable_iterator。
# 因为前面的例子使用了最简单的one_shot_iterator来遍历数据集,数据集的所有参数必须是确定的,
# 如果需要placeholder来初始化数据集, 那就需要用到initializable_iterator
iterator = dataset.make_initializable_iterator()
image, label = iterator.get_next()
with tf.Session() as sess:
# 首先初始化iterator,并给出input_files的值。
sess.run(iterator.initializer,
feed_dict={input_files: ["output.tfrecords"]})
# 遍历所有数据一个epoch。当遍历结束时,程序会抛出OutOfRangeError。
while True:
try:
x, y = sess.run([image, label])
except tf.errors.OutOfRangeError:
break