Tensorflow-制作与使用tfrecord数据集
引言
??本次博文目的是記錄下tfrecord數(shù)據(jù)集的制作與使用方式。(踩了無數(shù)坑OTZ)
??這里貼上一個數(shù)據(jù)讀取的官方教程:Tensorflow導入數(shù)據(jù)以及使用數(shù)據(jù)
??接下來舉個例子說明怎么用tfrecord,假設我要做個圖片分類的任務。首先,我這里有一個txt文件,包含著所有圖片的路徑以及它們的標簽。還有一個包含許多圖片的文件夾。類似下圖這樣:
??準備好了數(shù)據(jù)后,就可以制作與使用TFrecored啦~
制作TFrecord
??當然是先寫個制作TFrecord的函數(shù)啦。我們先讀取圖片信息的txt文件,得到每個圖片的路徑以及它們的標簽,然后對這個圖片作一些預處理,最后將圖片以及它對應的標簽序列化,并建立圖片和標簽的索引(即以下代碼的”img_raw”, “l(fā)abel”)。詳見代碼。
import random import tensorflow as tf from PIL import Imagedef create_record(records_path, data_path, img_txt):# 聲明一個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:# 圖片相對路徑img_name = img_info.split(' ')[0]# 圖片類別img_cls = int(img_info.split(' ')[1])img_path = data_path + img_nameimg = Image.open(img_path)# 對圖片進行預處理(縮放,減去均值,二值化等等)img = img.resize((128, 128))img_raw = img.tobytes()# 聲明將要寫入tfrecord的key值(即圖片,標簽)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。在這里,勸大家千萬千萬不要用queue的方式讀取數(shù)據(jù)(麻煩且已經(jīng)過時)。
??首先,我們定義好_parse_function,這個函數(shù)是用來指定TFrecord中索引的(即上文中的”img_raw”, “l(fā)abel”)。然后我們定義一個TFRecordDataset,并借助_parse_function來讀取數(shù)據(jù)。最后,為了得到每一輪的訓練數(shù)據(jù),我們只需要再額外聲明一個iterator,每次調(diào)用get_next()就可以啦。
再聊聊TensorFlow的Slim模塊
??這篇文章本該到此結(jié)束的。但是我仍想說TensorFlow真的有點難用(也可能是我太弱哈哈)。主要原因是它的API太多,更新速度太快。不過,我們也能迅速學習到許多東西(畢竟它的支持者有很多,這就給我們提供了許多實例以及講解博文),比如這個關于Slim的學習例子。
??接下來聊聊Slim這個模塊,它是2016年出的新模塊,目的是減少構(gòu)建網(wǎng)絡的代碼量。個人覺得真是很好用,強烈推薦一試!!!(不信可以去上面網(wǎng)址里看看)好的,下面貼一段代碼,展示下slim的使用方式,作為本篇的結(jié)尾吧~
總結(jié)
以上是生活随笔為你收集整理的Tensorflow-制作与使用tfrecord数据集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AppBarLayout.Behavio
- 下一篇: 字节序Endian与字节序标记BOM详解