tensorFlow的tfrecords文件讀取

為什么要用tfrecords文件格式

背景問題是深度學(xué)習(xí)的訓(xùn)練數(shù)據(jù)很大懦砂,這些數(shù)據(jù)要一次性加載到內(nèi)存中初厚,對硬件的要求太高。TensorFlow推薦使用tfrcords文件格式來保存數(shù)據(jù)虱颗。這種格式適合以串行方式讀取大批量的數(shù)據(jù)椎眯。如果不使用tfrecords處理,那么訓(xùn)練集上成千上萬的圖片就是分散的一個個文件存放的再姑,訓(xùn)練過程中要讀取的時候一個個讀取會非常慢萌抵。但是如果整合成若干個tfrecord文件,那么讀取會變得很快元镀。

生成绍填、寫tfrecords的具體過程

數(shù)據(jù)準備

把一個很大的訓(xùn)練集,比如210000張24x24的小圖片栖疑,全部放大一個list中讨永,然后轉(zhuǎn)換成np.array類型的train_data中。train_data的shape是[210000蔽挠,24住闯,24,1]澳淑。把這210000張的目標(biāo)結(jié)果先用list保存,如果是二分類插佛,此時list保存的是0杠巡,1兩種取值。先通過np.array 轉(zhuǎn)換成[210000,1]的形狀雇寇,然后通過keras.utils.to_categorical轉(zhuǎn)換成onehot編碼氢拥,并reshape最后得到train_labels的形狀是[210000,2]

數(shù)據(jù)拆分

210000個數(shù)據(jù)原來是210000張圖片,訓(xùn)練時一張一張讀取很消耗時間锨侯。我們的目標(biāo)是把210000張的數(shù)據(jù)轉(zhuǎn)存到100份tfrecord文件中嫩海。這樣子要讀取數(shù)據(jù)的時候,就可以通過大文件的tfrecord批量讀取囚痴。生成沒份tfrecord的時候叁怪,這里需要用2100張數(shù)據(jù)。每張數(shù)據(jù)是24*24個浮點數(shù)據(jù)深滚。

對于一組2100張生成一個tfrecord文件的過程

生成數(shù)據(jù)的byte表示

取出第j張24*24的浮點數(shù)據(jù)數(shù)據(jù) data[j] 和2D向量label[j]奕谭,把這兩個列表轉(zhuǎn)成bytes數(shù)據(jù)img_str = np.array(data[j]).tobytes() label_str = np.array(label[j]).tobytes()np.array(data[j]).tobytes() 相當(dāng)于把data[j]列表中的24x24個浮點數(shù)據(jù)痴荐,轉(zhuǎn)換成了連續(xù)的byte表示血柳。轉(zhuǎn)換后的數(shù)據(jù)格式形式如下b"\xee\xedm?\xc0\xbf??\xd5...... 相當(dāng)于把內(nèi)存中的二進制表現(xiàn)用文本體現(xiàn)出來了。

組裝tf.train.Example

把一張圖片組裝成一個example
image_example(img_str, label_str)
image_example的實現(xiàn)參考tensoeflow的官網(wǎng)

def image_example(img_str, label_str)
    feature = {
'label': _bytes_feature(label),
'image_raw':_bytes_feature(img_str),
}
     example = tf.train.Example(features = 
    tf.train.Features(feature = feature))
    return example

其中_bytes_feature是把數(shù)據(jù)組裝成feature的官網(wǎng)推薦實現(xiàn)

def _bytes_feature(value):
    if isinstance(value, type(tf.constant(0))):
        value = value.numpy()
    return  tf.train.Feature(bytes_list = tf.train.BytesList(value = [value]))

把組裝好的example依次寫入tfrecord文件

示意代碼如下:

with tf.io.TFRecordWriter(filePath) as tfWriter:
for i in X_elements:
    data_str = data_I.tobytes
    label_str = label_I.tobytes
    tfExample = image_example(data_str, label_str)
    tfWriter.write(tfExample.SerializeToString())

讀取tfrecord的具體過程

把所有的.tfrecords文件放到一個列表中tfrecordsFileList生兆,通過train_data_set = tf.data.TFRecordDataset(tfrecordsFileList)來一個一個讀取tfrecord文件难捌。

tf.train.Example的用法

tf.train.Feature

tf.train.Feature的本質(zhì)是一個lis, 其中l(wèi)ist只存放三種類型數(shù)據(jù),bytes, int64 或者 float
int_feature = tf.train.Feature(int64_list=tf.train.Int64List(value=[1, 2, 3, 4]))表示創(chuàng)建一個tf.train.Feature對象,對象中的list類型是int64_list類型. 數(shù)據(jù)是把value的一個普通list轉(zhuǎn)換成的tf.train.Int64List類型.
bytes_feature = tf.train.Feature(bytes_list=tf.train.BytesList(value=[b"abc", b"1234"]))表示創(chuàng)建一個tf.train.Feature對象,對象中的list類型是byte類型. 數(shù)據(jù)是把value的一個普通list轉(zhuǎn)換成的tf.train.BytesList類型.

tf.train.Features 和 tf.train.Example

通過下面的層級方式構(gòu)建出的example對象, 表示這個example對象實際有3個主體列表數(shù)據(jù).分別是一個名為my_ints的整數(shù)列表, 一個名為my_floats的浮點數(shù)列表,一個名為mybytes的bytes型列表.

example = tf.train.Example(features=tf.train.Features(feature={
        'my_ints': int_feature,
        'my_floats': float_feature,
        'my_bytes': bytes_feature,
    }))

example對象的好處就是可以調(diào)用SerializeToString()函數(shù)把example的數(shù)據(jù)進行字節(jié)序列化. 下面的例子可以說明這個特點

def serialize_example(feature0, feature1, feature2, feature3):
  feature = {
      'feature0': _int64_feature(feature0),
      'feature1': _int64_feature(feature1),
      'feature2': _bytes_feature(feature2),
      'feature3': _float_feature(feature3),
  }
  example_proto = tf.train.Example(features=tf.train.Features(feature=feature))
  return example_proto.SerializeToString()

serialized_example = serialize_example(False, 4, b'goat', 0.9876)
print(serialized_example)

在上面的代碼中,serialized_example = serialize_example(False, 4, b'goat', 0.9876)把4個關(guān)聯(lián)一個元素的feature (False, 4, b'goat', 0.9876) 組合成了features并放入了一個example中,通過example的SerializeToString 輸出了一個連續(xù)的byte類型數(shù)據(jù)如下

b'\nR\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04[\xd3|?\n\x14\n\x08feature2\x12\x08\n\x06\n\x04goat\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x04'

轉(zhuǎn)換成上述的byte類型數(shù)據(jù)就方便把很多的元素數(shù)據(jù)寫成文件.方便后期的讀取了.這個就是tfrecord的主要思路.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子根吁,更是在濱河造成了極大的恐慌员淫,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婴栽,死亡現(xiàn)場離奇詭異满粗,居然都是意外死亡,警方通過查閱死者的電腦和手機愚争,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門映皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轰枝,你說我怎么就攤上這事捅彻。” “怎么了鞍陨?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵步淹,是天一觀的道長。 經(jīng)常有香客問我诚撵,道長缭裆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任寿烟,我火速辦了婚禮澈驼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筛武。我一直安慰自己缝其,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布徘六。 她就那樣靜靜地躺著内边,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待锈。 梳的紋絲不亂的頭發(fā)上漠其,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音炉擅,去河邊找鬼辉懒。 笑死,一個胖子當(dāng)著我的面吹牛谍失,可吹牛的內(nèi)容都是我干的眶俩。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼快鱼,長吁一口氣:“原來是場噩夢啊……” “哼颠印!你這毒婦竟也來了纲岭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤线罕,失蹤者是張志新(化名)和其女友劉穎止潮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钞楼,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喇闸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了询件。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燃乍。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宛琅,靈堂內(nèi)的尸體忽然破棺而出刻蟹,到底是詐尸還是另有隱情,我是刑警寧澤嘿辟,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布舆瘪,位于F島的核電站,受9級特大地震影響红伦,放射性物質(zhì)發(fā)生泄漏英古。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一昙读、第九天 我趴在偏房一處隱蔽的房頂上張望哺呜。 院中可真熱鬧,春花似錦箕戳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至介牙,卻和暖如春壮虫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背环础。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工囚似, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人线得。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓饶唤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贯钩。 傳聞我的和親對象是個殘疾皇子募狂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容