不管怎么說tfrecords都是一個文件格式,讀寫也出不了常規(guī)的文件讀寫的邏輯本橙,無非是讀的時候格式得確定,取的時候格式要一致点楼,別的也沒什么了
寫入:
第一步,聲明writer白对,創(chuàng)建.tfrecord文件
writer = tf.python_io.TFRecordWriter(tfrecords_filename)
第二步掠廓,用feature的方式將目標數(shù)組傳遞進去
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,F(xiàn)loatList条摸;3悦污,BytesList;
等等這里有坑:
首先這三種list都是一緯的钉蒲,也就是只有一個中括號切端,所以在傳遞過程中會有信息損失。
其次顷啼,是針上面一條的就是如何將原來的list轉(zhuǎn)化為一維list
方案是numpy踏枣,使用numpy.ravel(多維數(shù)組)
那如何將普通的數(shù)組轉(zhuǎn)換為byteslist呢?
方案還是numpy钙蒙,使用numpy的tostring將數(shù)組整個轉(zhuǎn)換為一個string茵瀑,在傳遞的時候value=[字符串],來手動生成數(shù)組仪搔。
第三步:寫
使用wtite的寫方法瘾婿,但是注意需要將內(nèi)容序列化成string的格式
writer.write(example.SerializeToString())
第四步:關(guān)閉流蜻牢,寫文件的常規(guī)操作
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的版本已經(jīng)被棄掉了懦冰。后面新版的使用有時間我會更新使用方法灶轰。