TF_IO_TFRecords.md

Target

  • 二分類任務(wù)樣本制作成標(biāo)準(zhǔn)TF格式(TFRecords)
  • 讀入TFRecords并展示圖片
  • 高效多線程讀入TFRecords

Introduction

tensorflow/core/example/example.proto 中有詳細(xì)的例子說(shuō)明.

message Example {
  Features features = 1;
};

簡(jiǎn)要說(shuō)就是每個(gè)樣本變成了一個(gè)key-value的字典形式, key為字符串,value可以是字符串, 整型, 浮點(diǎn)型. 不同類型的標(biāo)簽在TF中會(huì)非常容易的實(shí)現(xiàn). 但是在Caffe中(-.-)..

Value的格式(注:Int為Int64)
  • BytesList
  • FloatList
  • Int64List

tensorflow/core/example/feature.proto 中定義

// Containers to hold repeated fundamental values.
message BytesList {
  repeated bytes value = 1;
}
message FloatList {
  repeated float value = 1 [packed = true];
}
message Int64List {
  repeated int64 value = 1 [packed = true];
}

// Containers for non-sequential data.
message Feature {
  // Each feature can be exactly one kind.
  oneof kind {
    BytesList bytes_list = 1;
    FloatList float_list = 2;
    Int64List int64_list = 3;
  }
};

message Features {
  // Map from feature name to feature.
  map<string, Feature> feature = 1;
};

[個(gè)人理解]
說(shuō)明一下, 一條數(shù)據(jù)或一個(gè)樣本其實(shí)就是一個(gè)Example(其實(shí)還有SequenceExample,本文只說(shuō)明Example), 數(shù)據(jù)中會(huì)存在許多的屬性, 所有的屬性信息都存儲(chǔ)在Features類中, 并且每個(gè)屬性由Key-Value來(lái)實(shí)現(xiàn) map<string, Feature> feature. 所有的Key都是字符型, 但是數(shù)據(jù)可以是bytes,float或int64類型.

官方例子:

//features {
//     feature {
//       key: "age"
//       value { float_list {
//         value: 29.0
//       }}
//     }
//     feature {
//       key: "movie"
//       value { bytes_list {
//         value: "The Shawshank Redemption"
//         value: "Fight Club"
//       }}
//     }
//}

了解了存儲(chǔ)格式代碼就比較好弄了

制作TFRecords

#_*_ coding:utf-8 _*_
import os
import numpy as np
import tensorflow as tf
import cv2
'''
Example : fileName
Train/1.jpg 0
Train/2.jpg 1
Train/3.jpg 1
Train/4.jpg 1
'''

# 因?yàn)閯?chuàng)建Feature需要list
def toList(value):
    if type(value) == list:
        return value
    else:
        return [value]

# 創(chuàng)建不用類型的Feature數(shù)據(jù)
def _int64_feature(value):
    value = toList(value)
    value = [int(x) for x in value]
    return tf.train.Feature(int64_list=tf.train.Int64List(value = value))

def _float_feature(value):
    value = toList(value)
    value = [float(x) for x in value]
    return tf.train.Feature(float_list=tf.train.FloatList(value = value))

def _bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value = toList(value)))

# Make TFRecords
def MakeTFRecord(fileName,tfrecords,imageRoot):
    # 創(chuàng)建一個(gè)TFRecordWriter來(lái)進(jìn)行寫(xiě)入數(shù)據(jù)
    writer = tf.python_io.TFRecordWriter(tfrecords)
    fp = open(fileName,'r')
    lines = fp.readlines()
    for line in lines:
        line = line.strip().split()
        imagePath = os.path.join(imageRoot,line[0])
        print imagePath

        ## PIL Image 通道順序RBG
        #img = Image.open(imagePath)
        #img_raw = img.tobytes()

        ## cv2 通道順序BGR, 本例采取灰度圖
        img = cv2.imread(imagePath,0)
        # 注意resize之后要賦值回img
        img = cv2.resize(img,(128,128))
        #cv2.imshow("d",img)
        #cv2.waitKey(0)
        # 把圖像數(shù)據(jù)變成二進(jìn)制,節(jié)省空間
        img_raw = img.tostring()
        # 創(chuàng)建一個(gè)Example
        example = tf.train.Example(
            # 創(chuàng)建一個(gè)Features
            features=tf.train.Features(
                # 填寫(xiě)不同類型的key-value
                feature={
                    "img_raw":_bytes_feature(img_raw),
                    "label": _int64_feature(line[1:])
                }
        ))
        # 把example進(jìn)行序列化,Serializes the protocol message to a binary string
        writer.write(example.SerializeToString())
    writer.close()

讀取并顯示 TFRecords

其實(shí)上面的制作理解了,讀其實(shí)只是一個(gè)逆過(guò)程,一個(gè)解序列化的過(guò)程

# 創(chuàng)建tfrecords迭代器,每個(gè)樣本都是序列化的
serialized_ex_it = tf.python_io.tf_record_iterator(tfrecords)
for serialized_ex in serialized_ex_it:
    # 創(chuàng)建Example對(duì)象
    example = tf.train.Example()
    # 進(jìn)行解序列化(注:解析的是Example對(duì)象)
    example.ParseFromString(serialized_ex)
    # 輸出所有信息, 如果想知道TFRecords中屬性可以輸出example
    print example
    # 取出正確的key并且正確的類型的value值,錯(cuò)一個(gè)都會(huì)取不出值
    image = example.features.feature['img_raw'].bytes_list.value
    label = example.features.feature['label'].int64_list.value

    print image, label

雖然上述可以讀取數(shù)據(jù),但是每個(gè)樣本都需要解析一次,往往我們的數(shù)據(jù)都是結(jié)構(gòu)化的,能不能一次就讀入許多數(shù)據(jù),并且在訓(xùn)練的時(shí)候數(shù)據(jù)是需要反復(fù)輸入到訓(xùn)練集中的.

# Read TFRecords using queue structs
def ReadTFRecord(tfrecords):
    # 可以把多個(gè)tfrecords排成一個(gè)queue,這樣可以方便的使用多個(gè)tfrecords文件
    record_queue = tf.train.string_input_producer([tfrecords])
    # 讀取TFRecords器
    reader = tf.TFRecordReader()
    # 一個(gè)數(shù)據(jù)一個(gè)數(shù)據(jù)的讀返回key-value值,都保存在serialized_ex中
    # 注意: 這里面keys是序列化的副產(chǎn)物,命名為tfrecords+random(),表示唯一的ID,沒(méi)有作用,可以設(shè)置為_(kāi)
    #keys, serialized_ex = reader.read(record_queue)
    _, serialized_ex = reader.read(record_queue)
    # 直接解析出features數(shù)據(jù),并且使用固定特征長(zhǎng)度,及每個(gè)Example中一定會(huì)存在一個(gè)image和一個(gè)label
    # 并不是輸入的圖片大小不同就使用VarLenFeature.
    features = tf.parse_single_example(serialized_ex,
            features={
                # 取出key為img_raw和label的數(shù)據(jù),尤其是int位數(shù)一定不能錯(cuò)!!!
                'img_raw': tf.FixedLenFeature([],tf.string),
                'label': tf.FixedLenFeature([], tf.int64)
            })
    img = tf.decode_raw(features['img_raw'], tf.uint8)

    # 注意定義的為int多少位就轉(zhuǎn)換成多少位,否則容易出錯(cuò)!!
    label = tf.cast(features['label'], tf.int64)
    return img, label

imgs,labels = ReadTFRecord(tfrecords)
sess = tf.Session()
# 多線程調(diào)節(jié)器
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess,coord=coord)
# 輸出10個(gè)樣本
for i in range(10):
    image,label = sess.run([imgs,labels])
    print image.shape,'label:', label
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苔可,一起剝皮案震驚了整個(gè)濱河市咽安,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旁舰,老刑警劉巖铁孵,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豹储,死亡現(xiàn)場(chǎng)離奇詭異汇竭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)圃验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)告丢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人损谦,你說(shuō)我怎么就攤上這事≡榔模” “怎么了照捡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)话侧。 經(jīng)常有香客問(wèn)我栗精,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任悲立,我火速辦了婚禮鹿寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薪夕。我一直安慰自己脚草,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布原献。 她就那樣靜靜地躺著馏慨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姑隅。 梳的紋絲不亂的頭發(fā)上写隶,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音讲仰,去河邊找鬼慕趴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鄙陡,可吹牛的內(nèi)容都是我干的冕房。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柔吼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼毒费!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起愈魏,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤觅玻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后培漏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體溪厘,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年牌柄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畸悬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珊佣,死狀恐怖蹋宦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咒锻,我是刑警寧澤冷冗,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站惑艇,受9級(jí)特大地震影響蒿辙,放射性物質(zhì)發(fā)生泄漏拇泛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一思灌、第九天 我趴在偏房一處隱蔽的房頂上張望俺叭。 院中可真熱鬧,春花似錦泰偿、人聲如沸熄守。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柠横。三九已至,卻和暖如春课兄,著一層夾襖步出監(jiān)牢的瞬間牍氛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工烟阐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搬俊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓蜒茄,卻偏偏與公主長(zhǎng)得像唉擂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檀葛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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