Perpustakaan ini memungkinkan membaca dan menulis file Tfrecord secara efisien di Python. Perpustakaan juga menyediakan iterableDataSet pembaca file TFRECORD untuk Pytorch. Saat ini tidak terkompresi dan terkompresi GZIP TFRECORD didukung.
pip3 install 'tfrecord[torch]'
Disarankan untuk membuat file indeks untuk setiap file TFRECORD. File indeks harus disediakan saat menggunakan banyak pekerja, jika tidak, pemuat dapat mengembalikan catatan duplikat. Anda dapat membuat file indeks untuk file TFRecord individual dengan program utilitas ini:
python3 -m tfrecord.tools.tfrecord2idx <tfrecord path> <index path>
Untuk membuat file ".tfidNex" untuk semua " .tfrecord" dalam direktori menjalankan:
tfrecord2idx <data dir>
Gunakan TfrecordDataSet untuk membaca file TFRECORD di Pytorch.
import torch
from tfrecord . torch . dataset import TFRecordDataset
tfrecord_path = "/tmp/data.tfrecord"
index_path = None
description = { "image" : "byte" , "label" : "float" }
dataset = TFRecordDataset ( tfrecord_path , index_path , description )
loader = torch . utils . data . DataLoader ( dataset , batch_size = 32 )
data = next ( iter ( loader ))
print ( data )Gunakan MultitFrecordDataSet untuk membaca beberapa file TFRECORD. Kelas ini sampel dari file Tfrecord yang diberikan dengan probabilitas yang diberikan.
import torch
from tfrecord . torch . dataset import MultiTFRecordDataset
tfrecord_pattern = "/tmp/{}.tfrecord"
index_pattern = "/tmp/{}.index"
splits = {
"dataset1" : 0.8 ,
"dataset2" : 0.2 ,
}
description = { "image" : "byte" , "label" : "int" }
dataset = MultiTFRecordDataset ( tfrecord_pattern , index_pattern , splits , description )
loader = torch . utils . data . DataLoader ( dataset , batch_size = 32 )
data = next ( iter ( loader ))
print ( data ) Secara default, MultiTFRecordDataset tidak terbatas, artinya mengambil sampel data selamanya. Anda dapat membuatnya terbatas dengan memberikan bendera yang sesuai
dataset = MultiTFRecordDataset(..., infinite=False)
Baik TfrecordDataSet dan MultitFrecordDataSet secara otomatis mengocok data saat Anda memberikan ukuran antrian.
dataset = TFRecordDataset(..., shuffle_queue_size=1024)
Anda secara opsional dapat melewati fungsi sebagai argumen transform untuk melakukan pemrosesan fitur pasca sebelum kembali. Ini misalnya dapat digunakan untuk memecahkan kode gambar atau menormalkan warna ke rentang tertentu atau urutan panjang variabel pad.
import tfrecord
import cv2
def decode_image ( features ):
# get BGR image from bytes
features [ "image" ] = cv2 . imdecode ( features [ "image" ], - 1 )
return features
description = {
"image" : "bytes" ,
}
dataset = tfrecord . torch . TFRecordDataset ( "/tmp/data.tfrecord" ,
index_path = None ,
description = description ,
transform = decode_image )
data = next ( iter ( dataset ))
print ( data ) import tfrecord
writer = tfrecord . TFRecordWriter ( "/tmp/data.tfrecord" )
writer . write ({
"image" : ( image_bytes , "byte" ),
"label" : ( label , "float" ),
"index" : ( index , "int" )
})
writer . close () import tfrecord
loader = tfrecord . tfrecord_loader ( "/tmp/data.tfrecord" , None , {
"image" : "byte" ,
"label" : "float" ,
"index" : "int"
})
for record in loader :
print ( record [ "label" ]) SequenceExamples dapat dibaca dan ditulis menggunakan metode yang sama yang ditunjukkan di atas dengan argumen tambahan ( sequence_description untuk membaca dan sequence_datum untuk menulis) yang menyebabkan masing -masing fungsi baca/tulis untuk memperlakukan data sebagai sampel Sequence.
import tfrecord
writer = tfrecord . TFRecordWriter ( "/tmp/data.tfrecord" )
writer . write ({ 'length' : ( 3 , 'int' ), 'label' : ( 1 , 'int' )},
{ 'tokens' : ([[ 0 , 0 , 1 ], [ 0 , 1 , 0 ], [ 1 , 0 , 0 ]], 'int' ), 'seq_labels' : ([ 0 , 1 , 1 ], 'int' )})
writer . write ({ 'length' : ( 3 , 'int' ), 'label' : ( 1 , 'int' )},
{ 'tokens' : ([[ 0 , 0 , 1 ], [ 1 , 0 , 0 ]], 'int' ), 'seq_labels' : ([ 0 , 1 ], 'int' )})
writer . close ()Membaca dari SequenceExample Yeilds tuple yang berisi dua elemen.
import tfrecord
context_description = { "length" : "int" , "label" : "int" }
sequence_description = { "tokens" : "int" , "seq_labels" : "int" }
loader = tfrecord . tfrecord_loader ( "/tmp/data.tfrecord" , None ,
context_description ,
sequence_description = sequence_description )
for context , sequence_feats in loader :
print ( context [ "label" ])
print ( sequence_feats [ "seq_labels" ]) Seperti yang dijelaskan dalam bagian Transforming Input , seseorang dapat melewati fungsi sebagai argumen transform untuk melakukan pemrosesan fitur. Ini harus digunakan terutama untuk fitur urutan karena ini adalah urutan panjang variabel dan perlu di -empuk sebelum dikumpulkan.
import torch
import numpy as np
from tfrecord . torch . dataset import TFRecordDataset
PAD_WIDTH = 5
def pad_sequence_feats ( data ):
context , features = data
for k , v in features . items ():
features [ k ] = np . pad ( v , (( 0 , PAD_WIDTH - len ( v )), ( 0 , 0 )), 'constant' )
return ( context , features )
context_description = { "length" : "int" , "label" : "int" }
sequence_description = { "tokens" : "int " , "seq_labels" : "int" }
dataset = TFRecordDataset ( "/tmp/data.tfrecord" ,
index_path = None ,
description = context_description ,
transform = pad_sequence_feats ,
sequence_description = sequence_description )
loader = torch . utils . data . DataLoader ( dataset , batch_size = 32 )
data = next ( iter ( loader ))
print ( data ) Atau, Anda dapat memilih untuk mengimplementasikan collate_fn khusus untuk merakit batch, misalnya, untuk melakukan padding dinamis.
import torch
import numpy as np
from tfrecord . torch . dataset import TFRecordDataset
def collate_fn ( batch ):
from torch . utils . data . _utils import collate
from torch . nn . utils import rnn
context , feats = zip ( * batch )
feats_ = { k : [ torch . Tensor ( d [ k ]) for d in feats ] for k in feats [ 0 ]}
return ( collate . default_collate ( context ),
{ k : rnn . pad_sequence ( f , True ) for ( k , f ) in feats_ . items ()})
context_description = { "length" : "int" , "label" : "int" }
sequence_description = { "tokens" : "int " , "seq_labels" : "int" }
dataset = TFRecordDataset ( "/tmp/data.tfrecord" ,
index_path = None ,
description = context_description ,
transform = pad_sequence_feats ,
sequence_description = sequence_description )
loader = torch . utils . data . DataLoader ( dataset , batch_size = 32 , collate_fn = collate_fn )
data = next ( iter ( loader ))
print ( data )