TensorFlow入门(十-I)tfrecord 固定维度数据读写
生活随笔
收集整理的這篇文章主要介紹了
TensorFlow入门(十-I)tfrecord 固定维度数据读写
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本例代碼:https://github.com/yongyehuang/Tensorflow-Tutorial/tree/master/python/the_use_of_tfrecord
關(guān)于 tfrecord 的使用,分別介紹 tfrecord 進(jìn)行三種不同類型數(shù)據(jù)的處理方法。
- 維度固定的 numpy 矩陣
- 可變長度的 序列 數(shù)據(jù)
- 圖片數(shù)據(jù)
在 tf1.3 及以后版本中,推出了新的 Dataset API, 之前趕實驗還沒研究,可能以后都不太會用下面的方式寫了。這些代碼都是之前寫好的,因為注釋中都寫得比較清楚了,所以直接上代碼。
tfrecord_1_numpy_writer.py
# -*- coding:utf-8 -*- import tensorflow as tf import numpy as np from tqdm import tqdm'''tfrecord 寫入數(shù)據(jù). 將固定shape的矩陣寫入 tfrecord 文件。這種形式的數(shù)據(jù)寫入 tfrecord 是最簡單的。 refer: http://blog.csdn.net/qq_16949707/article/details/53483493 '''# **1.創(chuàng)建文件,可以創(chuàng)建多個文件,在讀取的時候只需要提供所有文件名列表就行了 writer1 = tf.python_io.TFRecordWriter('../data/test1.tfrecord') writer2 = tf.python_io.TFRecordWriter('../data/test2.tfrecord')""" 有一點需要注意的就是我們需要把矩陣轉(zhuǎn)為數(shù)組形式才能寫入 就是需要經(jīng)過下面的 reshape 操作 在讀取的時候再 reshape 回原始的 shape 就可以了 """ X = np.arange(0, 100).reshape([50, -1]).astype(np.float32) y = np.arange(50)for i in tqdm(xrange(len(X))): # **2.對于每個樣本if i >= len(y) / 2:writer = writer2else:writer = writer1X_sample = X[i].tolist()y_sample = y[i]# **3.定義數(shù)據(jù)類型,按照這里固定的形式寫,有float_list(好像只有32位), int64_list, bytes_list.example = tf.train.Example(features=tf.train.Features(feature={'X': tf.train.Feature(float_list=tf.train.FloatList(value=X_sample)),'y': tf.train.Feature(int64_list=tf.train.Int64List(value=[y_sample]))}))# **4.序列化數(shù)據(jù)并寫入文件中serialized = example.SerializeToString()writer.write(serialized)print('Finished.') writer1.close() writer2.close()tfrecord_1_numpy_reader.py
# -*- coding:utf-8 -*- import tensorflow as tf'''read data 從 tfrecord 文件中讀取數(shù)據(jù),對應(yīng)數(shù)據(jù)的格式為固定shape的數(shù)據(jù)。 '''# **1.把所有的 tfrecord 文件名列表寫入隊列中 filename_queue = tf.train.string_input_producer(['../data/test1.tfrecord', '../data/test2.tfrecord'], num_epochs=None,shuffle=True) # **2.創(chuàng)建一個讀取器 reader = tf.TFRecordReader() _, serialized_example = reader.read(filename_queue) # **3.根據(jù)你寫入的格式對應(yīng)說明讀取的格式 features = tf.parse_single_example(serialized_example,features={'X': tf.FixedLenFeature([2], tf.float32), # 注意如果不是標(biāo)量,需要說明數(shù)組長度'y': tf.FixedLenFeature([], tf.int64)} # 而標(biāo)量就不用說明) X_out = features['X'] y_out = features['y']print(X_out) print(y_out) # **4.通過 tf.train.shuffle_batch 或者 tf.train.batch 函數(shù)讀取數(shù)據(jù) """ 在shuffle_batch 函數(shù)中,有幾個參數(shù)的作用如下: capacity: 隊列的容量,容量越大的話,shuffle 得就更加均勻,但是占用內(nèi)存也會更多 num_threads: 讀取進(jìn)程數(shù),進(jìn)程越多,讀取速度相對會快些,根據(jù)個人配置決定 min_after_dequeue: 保證隊列中最少的數(shù)據(jù)量。假設(shè)我們設(shè)定了隊列的容量C,在我們?nèi)∽卟糠謹(jǐn)?shù)據(jù)m以后,隊列中只剩下了 (C-m) 個數(shù)據(jù)。然后隊列會不斷補充數(shù)據(jù)進(jìn)來,如果后勤供應(yīng)(CPU性能,線程數(shù)量)補充速度慢的話,那么下一次取數(shù)據(jù)的時候,可能才補充了一點點,如果補充完后的數(shù)據(jù)個數(shù)少于min_after_dequeue 的話,不能取走數(shù)據(jù),得繼續(xù)等它補充超過 min_after_dequeue 個樣本以后才讓取走數(shù)據(jù)。這樣做保證了隊列中混著足夠多的數(shù)據(jù),從而才能保證 shuffle 取值更加隨機。但是,min_after_dequeue 不能設(shè)置太大,否則補充時間很長,讀取速度會很慢。 """ X_batch, y_batch = tf.train.shuffle_batch([X_out, y_out], batch_size=2,capacity=200, min_after_dequeue=100, num_threads=2) sess = tf.Session() init = tf.global_variables_initializer() sess.run(init)# **5.啟動隊列進(jìn)行數(shù)據(jù)讀取 # 下面的 coord 是個線程協(xié)調(diào)器,把啟動隊列的時候加上線程協(xié)調(diào)器。 # 這樣,在數(shù)據(jù)讀取完畢以后,調(diào)用協(xié)調(diào)器把線程全部都關(guān)了。 coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) y_outputs = list() for i in xrange(5):_X_batch, _y_batch = sess.run([X_batch, y_batch])print('** batch %d' % i)print('_X_batch:', _X_batch)print('_y_batch:', _y_batch)y_outputs.extend(_y_batch.tolist()) print(y_outputs)# **6.最后記得把隊列關(guān)掉 coord.request_stop() coord.join(threads)總結(jié)
以上是生活随笔為你收集整理的TensorFlow入门(十-I)tfrecord 固定维度数据读写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CCF CSP 201912-3 化学方
- 下一篇: TypeScript保存代码时自动编译并