zoukankan      html  css  js  c++  java
  • TensorFlow中数据读取—如何载入样本

      考虑到要是自己去做一个项目,那么第一步是如何把数据导入到代码中,何种形式呢?是否需要做预处理?官网中给的实例mnist,数据导入都是写好的模块,那么自己的数据呢?

      一、从文件中读取数据(CSV文件、二进制文件、图片或其他格式)

      读取文件,都需要一个阅读器reader和一个转换解码操作decode,不同格式的文件对应不同的接口API。

      1)CSV文件:用的文件读取器和解码器是 TextLineReader 和 decode_csv 。 下面代码来自TensorFlow官网,加了注释。

    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 ,读取固定长度的文件。

      decode_raw操作可以将一个字符串转换为一个uint8的张量。

      3)标准TensorFlow格式:

      可以将任意的数据转换为TensorFlow所支持的格式, 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配。方法就是使用TFRecords文件。

      写入数据后,通过修改 tf.train.Example 的Features,将 protocol buffer 序列化为一个字符串,再通过 tf.python_io.TFRecordWriter 将序列化的字符串写入 TFRecords文件中。使用tf.TFRecordReadertf.parse_single_example解析器,可以从TFRecords文件中读取数据。这个parse_single_example操作可以将 protocol buffer 解析为张量。

      

      二、供给数据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已知,已有数据。

  • 相关阅读:
    Restful接口传入多参数
    map转换成JSON的3种方式
    项目打包后执行start.sh提示“no such file or directory”解决办法,linux中给文件增加权限
    如何将一个a表a1字段与b表b1字段的笛卡尔积插入到e表中
    get、set方法的取代注释之lombok插件
    推荐 33 个 IDEA 最牛配置转(Java技术栈)
    mysql-----group by 对多个字段进行分组
    mysql获取某段时间内每一天的统计数据
    发票流水号生成方式
    postman之post请求传参
  • 原文地址:https://www.cnblogs.com/xiaoxiong-kankan/p/7610934.html
Copyright © 2011-2022 走看看