繼續(xù)上一篇中的問題2招狸,怎樣對自定義的圖片數(shù)據(jù)集進行訓練呢?在參數(shù)和模型固定的情況下乘凸,增加訓練集,有助于提高模型的泛化能力营勤。在前面壹罚,我們是對下載下來的mnist數(shù)據(jù)集進行的訓練,那么怎樣應用到我們自己制作或采集的圖片上呢猖凛?
如上面的圖片,我們需要借助tfrecords文件,這是一種能將圖像數(shù)據(jù)和標簽放在一起的二進制文件霞幅,可以提高內存效率,實現(xiàn)快速的讀取司恳、存儲等。
首先耍共,新建一個writer用于制作tfreords文件,num_pic用于計數(shù)试读,f 打開的文件是如下的txt文件,每行是圖片文件名和對應的數(shù)字钩骇,用for循環(huán)遍歷每張圖片。
這樣,value[0]就是圖片名傍妒,用于讀圖片,value[1]是對應標簽,用于生成一行10列的一維數(shù)組,對應標簽索引的值是1馏段。
tf.train.Example包含F(xiàn)eatures字段,features里包含feature字典力穗,鍵值對是img_raw和label對應的圖像數(shù)據(jù)和標簽數(shù)據(jù),格式是bytelist和Int64list够坐,這樣就把所有信息存到一個example文件里崖面,方便讀取元咙。
對于tfrecords文件的解析如下:
tf.train.string_input_producer生成一個先入先出的隊列queue巫员,用來讀取數(shù)據(jù),傳入存儲信息的tfrecords文件名列表赶掖,然后新建一個reader七扰,把讀取的每個樣本保存到serialized_example中奢赂,通過tf.parse_single_example將協(xié)議內存塊解析為張量颈走,傳入待解析的內存塊,features字典映射,傳入的字典鍵名要和制作的相同序厉,返回1*784的圖片張量和1*10的標簽毕箍。
get_tfrecords是隨機讀取batch_size個樣本,tf.train.shuffle_batch傳入待亂序處理的tensors[img,label],返回batch_size組的img,label.
這樣霉晕,我們通過tfrecords文件實現(xiàn)了對自定義圖片數(shù)據(jù)集的讀取,要注意的是還有修改反向傳播和test文件中的接口牺堰。
在backward文件中要先導入生成tfrecord的文件,傳入訓練樣本數(shù)恨搓,獲得每輪喂入的batch,在會話中開啟多線程協(xié)調器筏养,提高圖片和標簽批獲取效率。其中渐溶,tf.train.start_queue_runners()將會啟動輸入隊列線程,填入訓練樣本到隊列中茎辐,配合tf.train.Coordinator()在發(fā)生錯誤的情況下關閉線程。
同理拖陆,修改test文件,在獲取batch時get_tfrecord()中的isTrain=False.
這樣乎串,我們就解決了問題2,運行backward文件訓練數(shù)據(jù)叹誉,運行test文件觀察準確度闷旧,達到一定準確度后可以結合上一篇中的appliaction文件對實際圖片進行預測了。
需要注意的一點是鸠匀,在train和test集上準確度符合要求逾柿,但實際預測有錯誤時宅此,關注圖片的預處理過程,如修改閾值等父腕。
新手學習青瀑,歡迎指教!