Tensorflow-制作与使用tfrecord数据集
引言
??本次博文目的是記錄下tfrecord數(shù)據(jù)集的制作與使用方式。(踩了無(wú)數(shù)坑OTZ)
??這里貼上一個(gè)數(shù)據(jù)讀取的官方教程:Tensorflow導(dǎo)入數(shù)據(jù)以及使用數(shù)據(jù)
??接下來(lái)舉個(gè)例子說(shuō)明怎么用tfrecord,假設(shè)我要做個(gè)圖片分類的任務(wù)。首先,我這里有一個(gè)txt文件,包含著所有圖片的路徑以及它們的標(biāo)簽。還有一個(gè)包含許多圖片的文件夾。類似下圖這樣:
??準(zhǔn)備好了數(shù)據(jù)后,就可以制作與使用TFrecored啦~
制作TFrecord
??當(dāng)然是先寫個(gè)制作TFrecord的函數(shù)啦。我們先讀取圖片信息的txt文件,得到每個(gè)圖片的路徑以及它們的標(biāo)簽,然后對(duì)這個(gè)圖片作一些預(yù)處理,最后將圖片以及它對(duì)應(yīng)的標(biāo)簽序列化,并建立圖片和標(biāo)簽的索引(即以下代碼的”img_raw”, “l(fā)abel”)。詳見(jiàn)代碼。
import random import tensorflow as tf from PIL import Imagedef create_record(records_path, data_path, img_txt):# 聲明一個(gè)TFRecordWriterwriter = tf.python_io.TFRecordWriter(records_path)# 讀取圖片信息,并且將讀入的圖片順序打亂img_list = []with open(img_txt, 'r') as fr:img_list = fr.readlines()random.shuffle(img_list)cnt = 0# 遍歷每一張圖片信息for img_info in img_list:# 圖片相對(duì)路徑img_name = img_info.split(' ')[0]# 圖片類別img_cls = int(img_info.split(' ')[1])img_path = data_path + img_nameimg = Image.open(img_path)# 對(duì)圖片進(jìn)行預(yù)處理(縮放,減去均值,二值化等等)img = img.resize((128, 128))img_raw = img.tobytes()# 聲明將要寫入tfrecord的key值(即圖片,標(biāo)簽)example = tf.train.Example(features=tf.train.Features(feature={"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[img_cls])),'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))}))# 將信息寫入指定路徑writer.write(example.SerializeToString())# 打印一些提示信息~cnt += 1if cnt % 1000 == 0:print "processed %d images" % cntwriter.close()# 指定你想要生成tfrecord名稱,圖片文件夾路徑,含有圖片信息的txt文件 records_path = '/the/name/of/your/haha.tfrecords' data_path = '/the/root/of/your/image_folder/' img_txt = '/image/labels/list.txt' create_record(records_path, data_path, img_txt)使用TFrecord
??目前為止,使用TFrecord最方便的方式是用TensorFlow的Dataset ApI。在這里,勸大家千萬(wàn)千萬(wàn)不要用queue的方式讀取數(shù)據(jù)(麻煩且已經(jīng)過(guò)時(shí))。
??首先,我們定義好_parse_function,這個(gè)函數(shù)是用來(lái)指定TFrecord中索引的(即上文中的”img_raw”, “l(fā)abel”)。然后我們定義一個(gè)TFRecordDataset,并借助_parse_function來(lái)讀取數(shù)據(jù)。最后,為了得到每一輪的訓(xùn)練數(shù)據(jù),我們只需要再額外聲明一個(gè)iterator,每次調(diào)用get_next()就可以啦。
再聊聊TensorFlow的Slim模塊
??這篇文章本該到此結(jié)束的。但是我仍想說(shuō)TensorFlow真的有點(diǎn)難用(也可能是我太弱哈哈)。主要原因是它的API太多,更新速度太快。不過(guò),我們也能迅速學(xué)習(xí)到許多東西(畢竟它的支持者有很多,這就給我們提供了許多實(shí)例以及講解博文),比如這個(gè)關(guān)于Slim的學(xué)習(xí)例子。
??接下來(lái)聊聊Slim這個(gè)模塊,它是2016年出的新模塊,目的是減少構(gòu)建網(wǎng)絡(luò)的代碼量。個(gè)人覺(jué)得真是很好用,強(qiáng)烈推薦一試!!!(不信可以去上面網(wǎng)址里看看)好的,下面貼一段代碼,展示下slim的使用方式,作為本篇的結(jié)尾吧~
總結(jié)
以上是生活随笔為你收集整理的Tensorflow-制作与使用tfrecord数据集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AppBarLayout.Behavio
- 下一篇: 字节序Endian与字节序标记BOM详解