參考了這篇部落格的內容,做了些增加修改
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使用更為簡潔,大家自己嘗試一下吧,我就不贅述了 但是,如果資料量...