tfrecord的读和写(针对tf1.x版本)

不管怎么说tfrecords都是一个文件格式,读写也出不了常规的文件读写的逻辑,无非是读的时候格式得确定,取的时候格式要一致,别的也没什么了

写入:

第一步,声明writer,创建.tfrecord文件

writer = tf.python_io.TFRecordWriter(tfrecords_filename)

第二步,用feature的方式将目标数组传递进去

example = tf.train.Example(features=tf.train.Features(
    feature={
        'label': tf.train.Feature(int64_list=tf.train.Int64List(value=[0])),
        'img_raw': tf.train.Feature(float_list=tf.train.FloatList(value=res)),
    }
))

这里要注意几点:第一feature只接受三种格式,
1,Int64List;2,FloatList;3,BytesList;
等等这里有坑:
首先这三种list都是一纬的,也就是只有一个中括号,所以在传递过程中会有信息损失。
其次,是针上面一条的就是如何将原来的list转化为一维list
方案是numpy,使用numpy.ravel(多维数组)
那如何将普通的数组转换为byteslist呢?
方案还是numpy,使用numpy的tostring将数组整个转换为一个string,在传递的时候value=[字符串],来手动生成数组。
第三步:写
使用wtite的写方法,但是注意需要将内容序列化成string的格式

writer.write(example.SerializeToString())

第四步:关闭流,写文件的常规操作

writer.close()

tfrecord读取的方法

读取:
写搞定了,那怎么来读呢?
第一步:读入流中

filename_queue = tf.train.string_input_producer([filename])

第二步:声明reader并返回文件名和文件

reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)

第三步:上面怎么写,这里就怎么读,上面用example来写的,这里就用parse_single_examplel来读

features = tf.parse_single_example(serialized_example, features={
    'label': tf.FixedLenFeature([], tf.int64),
    'img_raw': tf.FixedLenFeature([4000], tf.float32),
})

tfrecord读取的逻辑和方法
除了格式之外需要写出你存入时候的长度,但是label不要写,原因还在探索中,但是这里有一个问题,这种版本的写法在tf2.x的版本已经被弃掉了。后面新版的使用有时间我会更新使用方法。

你可能感兴趣的:(tfrecord的读和写(针对tf1.x版本))