一、因为无论怎么改kinect的图像调用方式都无法解决机械上的精度问题,所以项目放弃用kinect,over!!
二、Dataset使用
首先学到了通过队列进行多线程输入的方法,也就是合理利用run(),但是在平时大多数处理中,还是得用高级一些的数据处理方法,所以每一个数据来源被抽象成的那个东西就是Dataset。。。
其次要知道数据种类都有啥,主要是张量、TFRecord文件,文本文件或者经过sharding的文件,因为训练数据通常无法全部写入内存中,从数据集中读取数据时需要使用一个迭代器按顺序进行读取
从数组创建一个数据集,这里的数据集是从一个张量中构建的
input_data = [1, 2, 3, 5, 8]
dataset = tf.data.Dataset.from_tensor_slices(input_data)
定义一个迭代器用来遍历数据集
iterator = dataset.make_one_shot_iterator()
x = iterator.get_next()
y = x * x
也可以从本地的文本文件中进行构建
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")
# 从文本文件创建数据集。这里可以提供多个文件。
input_files = ["./test1.txt", "./test2.txt"]
dataset = tf.data.TextLineDataset(input_files)
iterator = dataset.make_one_shot_iterator()
# 这里get_next()返回一个字符串类型的张量,代表文件中的一行。
x = iterator.get_next()
with tf.Session() as sess:
for i in range(4):
print(sess.run(x))
还可以从TFRecord中构建数据集,利用TFRecordDataset来读取数据,与文本文件不同,每一个TFRecord都有自己的feature,所以需要提供一个parser函数来解析所读取的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
# 从TFRecord文件创建数据集。这里可以提供多个文件。
input_files = ["output.tfrecords"]
dataset = tf.data.TFRecordDataset(input_files)
最后要注意的是文件路径是通过占位符函数placeholder传给数据集的,使用这种方法在实际项目中就不需要总是将参数写入计算图的定义,而可以使用程序参数的方式动态制定参数,具体还要很多itreator方法,具体碰见了还是好好看看Google的API吧。。。