tf.train.Example的用法

來源

目錄
前言
tf.train.BytesList等
tf.train.Feature
tf.train.Features
tf.train.Example
前言
最近在看到一個代碼時,裏面用到了tf.train.Example,於是學習了其用法,這裏記錄一下,也希望能對其他朋友有用。
另外,本文涉及的代碼基於python 3.6.5 tensorflow 1.8.0
tf.train.Example主要用在將數據處理成二進制方面,一般是爲了提升IO效率和方便管理數據。下面按調用順序介紹使用tf.train.Example涉及的幾個類。

tf.train.BytesList等
現在我們有一個data.txt文件,內容如下:

21
This is a test data file.
We will convert this text file to bin file.
1
2
3
文件中第一行是個整數,第二行和第三行都是字符串。這是我們處理的原始數據。
我們先使用下面的代碼將數據讀進來:

import struct
import tensorflow as tf


def read_text_file(text_file):
    lines = []
    with open(text_file, "r") as f:
        for line in f:
            lines.append(line.strip())
    return lines

def text_to_binary(in_file, out_file):
    inputs = read_text_file(in_file)

    with open(out_file, 'wb') as writer:
        pass

if __name__ == '__main__':
    text_to_binary('data.txt', 'data.bin')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
格式化原始數據可以使用tf.train.BytesList tf.train.Int64List tf.train.FloatList三個類。這三個類都有實例屬性value用於我們將值傳進去,一般tf.train.Int64List tf.train.FloatList對應處理整數和浮點數,tf.train.BytesList用於處理其他類型的數據。
這裏第一行數據我們可以用tf.train.Int64List處理,而第二、第三行數據我們使用tf.train.BytesList處理。下面我們看代碼實現,我們將上述代碼的pass替換如下:

        data_id = tf.train.Int64List(value=[int(inputs[0])])
        data = tf.train.BytesList(value=[bytes(' '.join(inputs[1:]), encoding='utf-8')])
1
2
注意到,tf.train.Int64List的value值需要是int數據的列表,而tf.train.BytesList的value值需要是bytes數據的列表。
我們分別打印data_id和data的值可以看到:

value: 21

value: "This is a test data file. We will convert this text file to bin file."
1
2
3
這樣我們就完成了第一步操作。

tf.train.Feature
tf.train.Feature有三個屬性爲tf.train.bytes_list tf.train.float_list tf.train.int64_list,顯然我們只需要根據上一步得到的值來設置tf.train.Feature的屬性就可以了,如下所示:

tf.train.Feature(int64_list=data_id)
tf.train.Feature(bytes_list=data)
1
2
tf.train.Features
從名字來看,我們應該能猜出tf.train.Features是tf.train.Feature的複數,事實上tf.train.Features有屬性爲feature,這個屬性的一般設置方法是傳入一個字典,字典的key是字符串(feature名),而值是tf.train.Feature對象。因此,我們可以這樣得到tf.train.Features對象:

        feature_dict = {
            "data_id": tf.train.Feature(int64_list=data_id),
            "data": tf.train.Feature(bytes_list=data)
        }
        features = tf.train.Features(feature=feature_dict)
1
2
3
4
5
tf.train.Example
終於到我們的主角了。tf.train.Example有一個屬性爲features,我們只需要將上一步得到的結果再次當做參數傳進來即可。
另外,tf.train.Example還有一個方法SerializeToString()需要說一下,這個方法的作用是把tf.train.Example對象序列化爲字符串,因爲我們寫入文件的時候不能直接處理對象,需要將其轉化爲字符串才能處理。
當然,既然有對象序列化爲字符串的方法,那麼肯定有從字符串反序列化到對象的方法,該方法是FromString(),需要傳遞一個tf.train.Example對象序列化後的字符串進去做爲參數才能得到反序列化的對象。
在我們這裏,只需要構建tf.train.Example對象並序列化就可以了,這一步的代碼爲:

        example = tf.train.Example(features=features)
        example_str = example.SerializeToString()
1
2
好了,那麼現在我們看一下將data.txt處理成data.bin的完整代碼:

import struct
import tensorflow as tf


def read_text_file(text_file):
    lines = []
    with open(text_file, "r") as f:
        for line in f:
            lines.append(line.strip())
    return lines


def text_to_binary(in_file, out_file):
    inputs = read_text_file(in_file)

    with open(out_file, 'wb') as writer:
        data_id = tf.train.Int64List(value=[int(inputs[0])])
        data = tf.train.BytesList(value=[bytes(' '.join(inputs[1:]), encoding='utf-8')])

        feature_dict = {
            "data_id": tf.train.Feature(int64_list=data_id),
            "data": tf.train.Feature(bytes_list=data)
        }
        features = tf.train.Features(feature=feature_dict)

        example = tf.train.Example(features=features)
        example_str = example.SerializeToString()

        str_len = len(example_str)

        writer.write(struct.pack('H', str_len))
        writer.write(struct.pack('%ds' % str_len, example_str))


if __name__ == '__main__':
    text_to_binary('data.txt', 'data.bin')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
代碼裏還涉及到了struct模塊,關於struct模塊的用法可以參考我的這篇文章:Python二進制數據處理
--------------------- 
作者:hfutdog 
來源:CSDN 
原文:https://blog.csdn.net/hfutdog/article/details/86244944 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章