高效讀取資料的方法 TFRecord

2021-10-08 23:49:49 字數 4630 閱讀 2419

參考了這篇部落格的內容,做了些增加修改

tfrecord 是google官方推薦的一種資料格式,是google專門為tensorflow設計的一種資料格式。

實際上,tfrecord是一種二進位制檔案,其能更好的利用記憶體,其內部包含了多個tf.train.example, 而example是protocol buffer(protobuf) 資料標準 [3] [4] 的實現,在乙個example訊息體中包含了一系列的tf.train.feature屬性,而 每乙個feature 是乙個key-value的鍵值對,其中,key 是string型別,而value 的取值有三種:

bytes_list: 可以儲存string 和byte兩種資料型別。

float_list: 可以儲存float(float32)與double(float64) 兩種資料型別 。

int64_list: 可以儲存:bool, enum, int32, uint32, int64, uint64 。

tf.example 類就是一種將資料表示為形式的 message型別,tensorflow經常使用 tf.example 來寫入,讀取 tfrecord資料。

通常情況下,tf.example中可以使用以下幾種格式:

tf.train.byteslist: 可以使用的型別包括 string和byte

tf.train.floatlist: 可以使用的型別包括 float和double

tf.train.int64list: 可以使用的型別包括 enum,bool, int32, uint32, int64

tfrecord支援寫入三種格式的資料:string,int64,float32,以列表的形式分別通過tf.train.byteslist,tf.train.int64list,tf.train.floatlist 寫入 tf.train.feature

tf.train.feature(bytes_list=tf.train.byteslist(value=

[feature.tostring()]

))tf.train.feature(int64_list=tf.train.int64list(value=

list

(feature.shape)))

tf.train.feature(float_list=tf.train.floatlist(value=

[label]

))

將資料轉化為tfrecord檔案

google官方推薦在對於中大資料集來說,先將資料集轉化為tfrecord資料(.tfrecords), 這樣可加快你在資料讀取, 預處理中的速度。

將資料轉化為 tfrecord 格式只需要三步, 下面以三個features:context,question, answer為例 :

writer = tf.python_io.tfrecordwriter(out_file_name)

# 1. 定義 writer物件

for data in dataes:

context = dataes[0]

question = dataes[1]

answer = dataes[2]

""" 2. 定義features """

example = tf.train.example(

features = tf.train.features(

feature =))

""" 3. 序列化,寫入"""

serialized = example.serializetostring(

) writer.write(serialized)

將一張轉化成tfrecord 檔案
import tensorflow as tf

defwrite_test

(input

, output)

:# 借助於tfrecordwriter 才能將資訊寫入tfrecord 檔案

writer = tf.python_io.tfrecordwriter(output)

# 讀取並進行解碼

image = tf.read_file(

input

) image = tf.image.decode_jpeg(image)

with tf.session(

)as sess:

image = sess.run(image)

shape = image.shape

# 將轉換成string

image_data = image.tostring(

)print

(type

(image)

)print

(len

(image_data)

) name =

bytes

('cat'

, encoding=

'utf-8'

)print

(type

(name)

)# 建立example物件,並將feature一一對應填充進去

example = tf.train.example(features=tf.train.features(feature=))

# 將example序列化成string 型別,然後寫入。

write_test(input_photo, output_file)

tfrecord 檔案讀取為
import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt

def_parse_record

(example_photo)

: features =

parsed_features = tf.parse_single_example(example_photo,features=features)

return parsed_features

defread_test

(input_file)

:# 用dataset讀取tfrecords檔案

dataset = tf.data.tfrecorddataset(input_file)

dataset = dataset.

map(_parse_record)

iterator = dataset.make_one_shot_iterator(

)with tf.session(

)as sess:

features = sess.run(iterator.get_next())

name = features[

'name'

] name = name.decode(

) img_data = features[

'data'

] shape = features[

'shape'

]print

("**********===="

)print

(type

(shape)

)print

(len

(img_data)

)# 從bytes陣列中載入原始資料,並重新reshape,它的結果是 ndarray 陣列

img_data = np.fromstring(img_data, dtype=np.uint8)

image_data = np.reshape(img_data, shape)

plt.figure(

)# 顯示

plt.imshow(image_data)

plt.show(

)# 將資料重新編碼成jpg並儲存

)

1,首先使用dataset去讀取tfrecord檔案

2,在解析example 的時候,用現成的api:tf.parse_single_example

3,用 np.fromstring() 方法就可以獲取解析後的string資料,記得把資料還原成 np.uint8

4,用 tf.image.encode_jepg() 方法可以將資料編碼成 jpeg 格式

5,用 tf.gfile.gfile 物件可以把資料儲存到本地

6,因為將 shape 寫入了example 中,所以解析的時候必須指定維度,在這裡 [3],不然程式會報錯。

TensorFlow高效讀取資料的方法

tfrecords其實是一種二進位制檔案,用來儲存 tf.train.example協議記憶體塊 protocol buffer 乙個example中包含features,features裡包含乙個名字為feature的字典,裡面是 key value 對,value是 乙個floatlis byt...

TensorFlow高效讀取資料的方法

tensorflow高效讀取資料的方法 關於tensorflow讀取資料,官網給出了三種方法 供給資料 feeding 在tensorflow程式執行的每一步,讓python 來供給資料。從檔案讀取資料 在tensorflow圖的起始,讓乙個輸入管線從檔案中讀取資料。預載入資料 在tensorflo...

Tensorflow高效讀取資料的方法

最新上傳的mcnn中有完整的資料讀寫示例,可以參考。關於tensorflow讀取資料,官網給出了三種方法 對於資料量較小而言,可能一般選擇直接將資料載入進記憶體,然後再分batch輸入網路進行訓練 tip 使用這種方法時,結合yield使用更為簡潔,大家自己嘗試一下吧,我就不贅述了 但是,如果資料量...