利用Tensorflow中的TFRecord生成与读取图片
本人是深度學習的愛好者,最近在參加cv的表情識別訓練,把一些步驟和過程記錄下來
一.什么是TFRecord
對于計算機的內存來說,我們訓練集樣本的數目是巨大的,而且這些文件分散在不同的文件夾中,在存讀取的過程中會耗費大量的時間和硬盤資源,此時就需要我們用TFRecord的儲存格式來幫助存儲數據。
protuBuf
TFRecord使用了名為“Protocol Buffer”二進制數據編碼方案,它一次性只加載一個二進制文件,在訓練數據很多的時候十分方便快捷。并且我們可以對不同的文件夾下的子文件分別生成TFRecord,十分方便。
二.聲明tfRecord
首先我們要生成一個TFRecord形式的實例
writer=tf.python_io.TFRecordWriter(filename)image=Image.open(filename)然后將圖片轉化為TFRecord存入特征需要的二進制格式,因為人臉訓練表情分為圖像和分類標志兩類,所以分別以bytesList和Int64List的形式存儲到feature參數中(feature是字典格式),最后將其序列化轉換為字符串,寫入TFRecord中。
image_bytes=image.tobytes() features={} features['image']=tf.train.Feature(bytes_list=tf.train.BytesList(value=[image_bytes])) features['label']=tf.train.Feature(int64_list=tf.train.Int64List(value=[int(label_list[i])])) tf_features=tf.train.Features(feature=features) tf_example=tf.train.Example(features=tf_features) tf_serialized=tf_example.SerializeToString() writer.write(tf_serialized) writer.close()三.對生成的TFRecord文件進行解析
解析函數中首先要對對存入的feature進行分別提取,用tf.FixedLenFeature送入一個字典中
dics={}dics['label']=tf.FixedLenFeature((),dtype=tf.int64,default_value=0)dics['image']=tf.FixedLenFeature((),dtype=tf.string,default_value="")生成字典后,我們就可以用tf中自帶的parse_single_example提取指定字典中的數據
parsed_example=tf.parse_single_example(serialized=example_proto,features=dics)對于int64類型的label數據,我們可以直接用parsed_example函數將數據取出,對于圖片,由于我們一開始將其轉換成為了二進制數據的原因,此時我們需要用解碼函數decode_raw將其恢復
image=tf.decode_raw(parsed_example['image'],out_type=tf.uint8) label=parsed_example['label']四.讀取數據
取出數據以后,我們就可以通過函數來實現數據生成器
dataset=tf.data.TFRecordDataset(filenames=filenames) new_dataset=dataset.map(A)其中A是我們生成的解析函數名,對于指定生成的dataset生成器,我們可以對其指定batch、prefetch的操作
- shuffle()對生成器進行打亂
- prefetch(1)對生成器進行并行CPU處理,為GPU處理準備數據
- make_one_shot_iterator()獲得生成器迭代器
next_element=iterator.get_next() 獲得下一個迭代器
最后,我們在session中run這個返回的迭代器即可獲得我們想要的輸入圖片和label(由于我們的字典中有兩個key,所以要用list把這兩個迭代器中的元素括起來,分別計算和賦值)
batch_images,batch_labels=sess.run([next_element[0],next_element[1]])(個人思路記錄,勿噴)
總結
以上是生活随笔為你收集整理的利用Tensorflow中的TFRecord生成与读取图片的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: break作用
- 下一篇: 常见浏览器及其内核(国际)
