考虑到要是本身去作一个项目,那么第一步是如何把数据导入到代码中,何种形式呢?是否须要作预处理?官网中给的实例mnist,数据导入都是写好的模块,那么本身的数据呢?python
1、从文件中读取数据(CSV文件、二进制文件、图片或其余格式)网络
读取文件,都须要一个阅读器reader和一个转换解码操做decode,不一样格式的文件对应不一样的接口API。架构
1)CSV文件:用的文件读取器和解码器是 TextLineReader 和 decode_csv 。 下面代码来自TensorFlow官网,加了注释。ui
filename_queue = tf.train.string_input_producer(["file0.csv", "file1.csv"]) #["file0.csv", "file1.csv"]是文件名列表,tf.train.string_input_producer()用来生成文件名队列,有参数shuffle=True可执行乱序,num_epochs=None可设置文件名字符串的生成次数
#对于输入管道,输出文件名字符串到队列中
reader = tf.TextLineReader()#阅读器,我的感受功能同Python的open()。 key, value = reader.read(filename_queue)#参数是文件名队列,返回一个tuple,key和value,每次返回阅读器的下一条记录(一行)。 # Default values, in case of empty columns. Also specifies the type of the # decoded result. record_defaults = [[1], [1], [1], [1], [1]] #定义解析的格式 col1, col2, col3, col4, col5 = tf.decode_csv( value, record_defaults=record_defaults) #将CSV解析为tensor,每列映射为一个tensor,返回一个tensor列表。 features = tf.concat(0, [col1, col2, col3, col4]) #0表明按行合并。参数1是在哪一个维度合并,参数2是待合并的值。 with tf.Session() as sess: # Start populating the filename queue. coord = tf.train.Coordinator() #建立一个线程协调器 threads = tf.train.start_queue_runners(coord=coord) #启动Graph中全部队列的线程 for i in range(1200): # Retrieve a single instance: example, label = sess.run([features, col5]) #运行,获取样本和标签 coord.request_stop() #请求中止全部线程 coord.join(threads) #等待线程结束
2)二进制文件:用的文件读取器和解码器是 tf.FixedLengthRecordReader 和 tf.decode_raw ,读取固定长度的文件。spa
decode_raw
操做能够将一个字符串转换为一个uint8的张量。线程
3)标准TensorFlow格式:code
能够将任意的数据转换为TensorFlow所支持的格式, 这种方法可使TensorFlow的数据集更容易与网络应用架构相匹配。方法就是使用TFRecords文件。blog
写入数据后,经过修改 tf.train.Example 的Features,将 protocol buffer 序列化为一个字符串,再经过 tf.python_io.TFRecordWriter 将序列化的字符串写入 TFRecords文件中。使用tf.TFRecordReader和
tf.parse_single_example
解析器,能够从TFRecords文件中读取数据。这个parse_single_example
操做能够将 protocol buffer 解析为张量。接口
2、供给数据feed_dict参数队列
定义了operation以后,使用sess.run()或tensor.eval()或op.run()时,经过参数feed_dict传递数据,该参数是和placeholder配套使用的。先声明一个占位符,好比x,y。而后在op中使用了x,y进行计算,等到op.run()时,op.run(feed_dict={x:x_batch,y:y_batch})便可。前提是x_batch和y_batch已知,已有数据。