讀取資料流程
該過程可以分為三步
-
構造檔案名隊列
把檔案名隊列讀取進來,并随即打亂shufflu,即從filename到Filename到FilenameQueeue階段
file_queue=tf.train.string_input_producer(file_list)
-
讀取與解碼
使用讀取器從上一步拿到的檔案名隊列,從檔案中讀取資料,按照一個樣本為機關讀取的,圖檔,文本,的編碼不同,使用的解碼器不同。
reader=tf.WholeFileReader()
_,value=reader.read(file_queue)
image_a=tf.image.decode_jpeg(value,channels=3)
image=tf.image.resize_images(image_a,[iamge_size,image_size])
image=tf.cast(image,tf.float32)
image=tf.reshape(image,shape=[iamge_size,image_size,channel])
-
批處理階段
建構批次即batch_size
inputs=tf.train.batch([image],batch_size=22,num_threads,capacity)
-
tf.data進階API的使用
self.tfrecordFile是解析tfrecord的路徑,
dataset = tf.data.TFRecordDataset(filenames = self.TfrecordFile)
num_parallel_calls 參數的最優值取決于你的硬體,訓練資料的特點(比如:它的 size、shape),map 函數的計算量 和 CPU 上同時進行的其它處理。一個簡單的原則是:将 num_parallel_calls 設定為 CPU 的核心數。例如,如果 CPU 有四個核,将 num_parallel_calls 設定為 4 将會很高效。另一方面,設定 num_parallel_calls 大于 CPU 的核心數,能夠導緻低效的排程,導緻輸入管道速度下降
dataset = dataset.map(self.parser, num_parallel_calls = 10)
将資料集打亂,并建構batch_size
dataset = dataset.repeat().shuffle(9000).batch(batch_size).prefetch(batch_size)
iterator = dataset .make_one_shot_iterator()
get_next()方法使資料集不斷的向神經網絡中送
iamge,label= iterator.get_next()
這樣就不用使用tf.placeholder()占位符了,直接将image送到神經網絡中就能實作訓練優化。