《2020 02 12》tfrecord讀寫資料

2021-10-02 18:32:58 字數 2698 閱讀 2287

僅供自己學習使用

tensorflow通過tfrecord高效讀寫資料

利用tensorflow提供的tfrecord資料儲存格式工具,我們可以將我們已經進行過處理的資料儲存起來,以便我們下次更高效地讀取,略過資料處理的過程,提高效率。具體的步驟大概分為以下幾步:

將資料轉化為tf.train.feature,然後存於字典;

接著,將其轉化為tf.train.example,然後進行序列化,寫入tf.python_io.tfrecordwriter,到這裡就完成了寫入的操作;

讀取的時候,首先通過tf.data.tfrecorddataset來讀取它;

然後,通過tf.parse_single_example來解析還原資料原本的結構;

最後就可以結合我們上次提高的batch來批量獲取。(關於batch、shuffle、repeat函式的詳細介紹tensorflow dataset.shuffle、batch、repeat用法)

import tensorflow as tf

import collections

import numpy as np

inputs_1 = np.array([

[[1,2], [3,4]],

[[5,6], [7,8]]

])inputs_2 = [

[1.1, 2.2, 3.3],

[4.4, 5.5, 6.6]

]lables = [0, 1]

def create_int_feature(values):

f = tf.train.feature(int64_list=tf.train.int64list(value=list(values))) # 需要注意這裡接受的格式是list,並且只能是一維的

return f

def create_float_feature(values):

f = tf.train.feature(float_list=tf.train.floatlist(value=list(values)))

return f

def create_bytes_feature(values):

f = tf.train.feature(bytes_list=tf.train.byteslist(value=[values]))

return f

writer = tf.python_io.tfrecordwriter('test.tfrecord') # test.tfrecord是寫入的檔案路徑

for i1, i2, l in zip(inputs_1, inputs_2, lables):

features = collections.ordereddict() # 這裡是新建乙個有序字典

# 對於多維陣列,只能先將其轉化為byte,才能傳遞給feature

features['inputs_1'] = create_bytes_feature(i1.tostring())

features['inputs_2'] = create_float_feature(i2)

features['labels'] = create_int_feature([l])

example = tf.train.example(features=tf.train.features(feature=features))

writer.write(example.serializetostring())

writer.close()

name_to_features = 

d = tf.data.tfrecorddataset('test.tfrecord')

d = d.repeat() # 這裡repeat不傳遞引數,則會無限重複

d = d.shuffle(buffer_size=2)

# map_and_batch其實就是map和batch結合在一起而已

lambda record: tf.parse_single_example(record, name_to_features),

batch_size=1))

iters = d.make_one_shot_iterator()

batch = iters.get_next()

# byteslist解析時會丟失shape資訊,需要自己還原它的shape,所以一般也會將shape資料一同寫入

# 這裡需要將byte解析成原本的資料結構,這裡的tf.int32需要與寫入時的格式保持一致

inputs_1_batch = tf.decode_raw(batch['inputs_1'], tf.int32)

inputs_1_batch = tf.reshape(inputs_1_batch, [-1, 2, 2])

# 因為每次是batch個inputs_1,所以shape是[-1, 2, 2],原來的shape是[2, 2]

inputs_2_batch = batch['inputs_2']

labels_batch = batch['labels']

sess = tf.session()

# 這樣我們就可以每次獲取乙個batch的資料了

sess.run([inputs_1_batch, inputs_2_batch, labels_batch])

c mysql多執行緒 多執行緒讀寫mysql資料庫

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 unsigned int stdcall scan pvoid pm char ip 20 strcpy ip,char pm mysql mysql mysql res result 初始化mysql控制代碼 mysql init mysql 連線my...

c 多執行緒mysql 多執行緒讀寫mysql資料庫

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 unsigned int stdcall scan pvoid pm char ip 20 strcpy ip,char pm mysql mysql mysql res result 初始化mysql控制代碼 mysql init mysql 連線my...

c 多執行緒mysql 多執行緒讀寫mysql資料庫

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 unsigned int stdcall scan pvoid pm char ip 20 strcpy ip,char pm mysql mysql mysql res result 初始化mysql控制代碼 mysql init mysql 連線my...