ofrecord 資料格式
深度學習應用需要複雜的多階段資料預處理流水線,資料載入是流水線的第一步,oneflow 支援多種格式資料的載入,其中 ofrecord 格式是 oneflow 原生的資料格式。
ofrecord 的格式定義參考了 tensorflow 的 tfrecord,熟悉 tfrecord 的使用者,可以很快上手 oneflow 的 ofrecord。
本文將介紹:
• ofrecord 使用的資料型別
• 如何將資料轉化為 ofrecord 物件並序列化
• ofrecord 檔案格式
有助於學習載入與準備 ofrecord 資料集。
ofrecord 相關資料型別
oneflow 內部採用protocol buffers 描述 ofrecord 的序列化格式。相關的 .proto 檔案在 oneflow/core/record/record.proto 中,具體定義如下:
syntax = 「proto2」;
package oneflow;
message byteslist
message floatlist
message doublelist
message int32list
message int64list
message feature
}message ofrecord
先對以上的重要資料型別進行解釋:
• ofrecord: ofrecord 的例項化物件,可用於儲存所有需要序列化的資料。它由任意多個 string->feature 的鍵值對組成;
• feature: feature 可儲存 byteslist、floatlist、doublelist、int32list、int64list 各型別中的任意一種;
• ofrecord、feature、***list 等型別,均由 protocol buffers 生成對應的同名介面,使得可以在 python 層面構造對應物件。
轉化資料為 feature 格式
可以通過呼叫 ofrecord.***list 及 ofrecord.feature 將資料轉為 feature 格式,為了更加方便,需要對 protocol buffers 生成的介面進行簡單封裝:
import oneflow.core.record.record_pb2 as ofrecord
def int32_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.feature(int32_list=ofrecord.int32list(value=value))
def int64_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.feature(int64_list=ofrecord.int64list(value=value))
def float_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.feature(float_list=ofrecord.floatlist(value=value))
def double_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
return ofrecord.feature(double_list=ofrecord.doublelist(value=value))
def bytes_feature(value):
if not isinstance(value, (list, tuple)):
value = [value]
if not six.py2:
if isinstance(value[0], str):
value = [x.encode() for x in value]
return ofrecord.feature(bytes_list=ofrecord.byteslist(value=value))
建立 ofrecord 物件並序列化
在下例子中,將建立有2個 feature 的 ofrecord 物件,並且呼叫它的 serializetostring 方法序列化。
obserations = 28 * 28
f = open("./dataset/part-0", 「wb」)
for loop in range(0, 3):
image = [random.random() for x in range(0, obserations)]
label = [random.randint(0, 9)]
topack =
ofrecord_features = ofrecord.ofrecord(feature=topack)
serilizedbytes = ofrecord_features.serializetostring()
通過以上例子,可以總結序列化資料的步驟:
• 將需要序列化的資料,通過呼叫 ofrecord.feature 及 ofrecord.***list 轉為 feature 物件;
• 將上一步得到的各個 feature 物件,以 string->feature 鍵值對的形式,存放在 python 字典中;
• 呼叫 ofrecord.ofrecord 建立 ofrecord 物件
• 呼叫 ofrecord 物件的 serializetostring 方法得到序列化結果
序列化的結果,可以存為 ofrecord 格式的檔案。
ofrecord 格式的檔案
將 ofrecord 物件序列化後按 oneflow 約定的格式存檔案,就得到 ofrecord檔案 。
1個 ofrecord 檔案中可儲存多個 ofrecord 物件,ofrecord 檔案可用於 oneflow 資料流水線,具體操作可見載入與準備 ofrecord 資料集
oneflow 約定,對於 每個 ofrecord 物件,用以下格式儲存:
uint64 length
byte data[length]
即頭8個位元組存入資料長度,然後存入序列化資料本身。
length = ofrecord_features.bytesize()
f.write(struct.pack(「q」, length))
f.write(serilizedbytes)
**以下完整**展示如何生成 ofrecord 檔案,並呼叫 protobuf 生成的 ofrecord 介面手工讀取 ofrecord 檔案中的資料。
實際上,oneflow 提供了 flow.data.decode_ofrecord 等介面,可以更方便地提取 ofrecord 檔案(資料集)中的內容。詳細內容請參見載入與準備 ofrecord 資料集。
將 ofrecord 物件寫入檔案
以下指令碼,模擬了3個樣本,每個樣本為28*28的,並且包含對應標籤。將三個樣本轉化為 ofrecord 物件後,按照 oneflow 約定格式,存入檔案。
**:ofrecord_to_string.py
從 ofrecord 檔案中讀取資料
以下指令碼,讀取上例中生成的 ofrecord 檔案,呼叫 fromstring 方法反序列化得到 ofrecord 物件,並最終顯示資料:
**:ofrecord_from_string.py
Json資料格式
在web 系統開發中,經常會碰到客戶端和伺服器端互動的問題,比如說客戶端傳送乙個 ajax 請求,然後在伺服器端進行計算,計算後返回結果,客戶端接收到這個響應結果並對它進行處理。那麼這個結果以一種什麼資料結構返回,客戶端才能比較容易和較好的處理呢?通過幾個專案的實踐,我發現 json 格式的資料是一...
JSON資料格式
下面這段文字,摘錄自留作備忘 21世紀初,douglas crockford尋找一種簡便的資料交換格式,能夠在伺服器之間交換資料。當時通用的資料交換語言是xml,但是douglas crockford覺得xml的生成和解析都太麻煩,所以他提出了一種簡化格式,也就是json。json的規格非常簡單,只...
資料格式大全
yy mm dd 百分比00.00 12.68 13 12.68 3 23 2003 12 00 00 am 字元用於分隔格式字串中的正數 負數和零各部分。格式字串 資料 結果 12345.6789 12,345.68 12345.6789 12,345.68 12345 12345 12345 0...