TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
genel bakış
Avro Veri kümesi API amacı Avro olarak TensorFlow içine doğal olarak biçimlendirilmiş verileri yüklemek için TensorFlow veri kümesi . Avro, Protokol Tamponlarına benzer bir veri serileştirme sistemidir. Hem kalıcı veriler için bir serileştirme formatı hem de Hadoop düğümleri arasındaki iletişim için bir kablo formatı sağlayabildiği Apache Hadoop'ta yaygın olarak kullanılır. Avro verileri, satır yönelimli, sıkıştırılmış bir ikili veri biçimidir. Ayrı bir JSON dosyası olarak depolanan şemaya dayanır. Avro formatı ve şema beyanının spec için, lütfen bkz resmi kılavuzda .
Kurulum paketi
Gerekli tensorflow-io paketini kurun
pip install tensorflow-io
Paketleri içe aktar
import tensorflow as tf
import tensorflow_io as tfio
tf ve tfio içe aktarmalarını doğrulama
print("tensorflow-io version: {}".format(tfio.__version__))
print("tensorflow version: {}".format(tf.__version__))
tensorflow-io version: 0.18.0 tensorflow version: 2.5.0
kullanım
Veri kümesini keşfedin
Bu öğreticinin amacı için, örnek Avro veri kümesini indirelim.
Örnek bir Avro dosyası indirin:
curl -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/avro/train.avro
ls -l train.avro
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 151 100 151 0 0 1268 0 --:--:-- --:--:-- --:--:-- 1268 100 369 100 369 0 0 1255 0 --:--:-- --:--:-- --:--:-- 1255 -rw-rw-r-- 1 kbuilder kokoro 369 May 25 22:23 train.avro
Örnek Avro dosyasının ilgili şema dosyasını indirin:
curl -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/avro/train.avsc
ls -l train.avsc
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 151 100 151 0 0 1247 0 --:--:-- --:--:-- --:--:-- 1247 100 271 100 271 0 0 780 0 --:--:-- --:--:-- --:--:-- 780 -rw-rw-r-- 1 kbuilder kokoro 271 May 25 22:23 train.avsc
Yukarıdaki örnekte, mnist veri kümesine dayalı olarak bir test Avro veri kümesi oluşturulmuştur. TFRecord formatında orijinal mnist veri kümesi oluşturulur TF isimli veri kümesi . Ancak, mnist veri kümesi bir demo veri kümesi olarak çok büyük. Basitlik amacıyla, çoğu kırpılmış ve yalnızca ilk birkaç kayıt tutulmuştur. Üstelik, ek kırparak için yapıldığını image
orijinal mnist veri kümesindeki alan ve eşledikten features
Avro alanda. Avro dosya Yani train.avro
: 3 alanları vardır, her biri 4 kayıtları vardır features
, int, bir dizidir label
, int veya boş ve dataType
, bir enum. Kodu çözülmüş görüntülemek için train.avro
(Not orijinal Avro veri dosyası Avro sıkıştırılmış biçim olarak okunabilir insan değildir):
Avro dosyasını okumak için gerekli paketi kurun:
pip install avro
Bir Avro dosyasını insan tarafından okunabilir biçimde okumak ve yazdırmak için:
from avro.io import DatumReader
from avro.datafile import DataFileReader
import json
def print_avro(avro_file, max_record_num=None):
if max_record_num is not None and max_record_num <= 0:
return
with open(avro_file, 'rb') as avro_handler:
reader = DataFileReader(avro_handler, DatumReader())
record_count = 0
for record in reader:
record_count = record_count+1
print(record)
if max_record_num is not None and record_count == max_record_num:
break
print_avro(avro_file='train.avro')
{'features': [0, 0, 0, 1, 4], 'label': None, 'dataType': 'TRAINING'} {'features': [0, 0], 'label': 2, 'dataType': 'TRAINING'} {'features': [0], 'label': 3, 'dataType': 'VALIDATION'} {'features': [1], 'label': 4, 'dataType': 'VALIDATION'}
Ve şema train.avro
ile temsil edilir train.avsc
JSON biçimli dosyasıdır. Görüntülemek için train.avsc
:
def print_schema(avro_schema_file):
with open(avro_schema_file, 'r') as handle:
parsed = json.load(handle)
print(json.dumps(parsed, indent=4, sort_keys=True))
print_schema('train.avsc')
{ "fields": [ { "name": "features", "type": { "items": "int", "type": "array" } }, { "name": "label", "type": [ "int", "null" ] }, { "name": "dataType", "type": { "name": "dataTypes", "symbols": [ "TRAINING", "VALIDATION" ], "type": "enum" } } ], "name": "ImageDataset", "type": "record" }
Veri kümesini hazırlayın
Yük train.avro
Avro veri kümesi API ile TensorFlow veri kümesi olarak:
features = {
'features[*]': tfio.experimental.columnar.VarLenFeatureWithRank(dtype=tf.int32),
'label': tf.io.FixedLenFeature(shape=[], dtype=tf.int32, default_value=-100),
'dataType': tf.io.FixedLenFeature(shape=[], dtype=tf.string)
}
schema = tf.io.gfile.GFile('train.avsc').read()
dataset = tfio.experimental.columnar.make_avro_record_dataset(file_pattern=['train.avro'],
reader_schema=schema,
features=features,
shuffle=False,
batch_size=3,
num_epochs=1)
for record in dataset:
print(record['features[*]'])
print(record['label'])
print(record['dataType'])
print("--------------------")
SparseTensor(indices=tf.Tensor( [[0 0] [0 1] [0 2] [0 3] [0 4] [1 0] [1 1] [2 0]], shape=(8, 2), dtype=int64), values=tf.Tensor([0 0 0 1 4 0 0 0], shape=(8,), dtype=int32), dense_shape=tf.Tensor([3 5], shape=(2,), dtype=int64)) tf.Tensor([-100 2 3], shape=(3,), dtype=int32) tf.Tensor([b'TRAINING' b'TRAINING' b'VALIDATION'], shape=(3,), dtype=string) -------------------- SparseTensor(indices=tf.Tensor([[0 0]], shape=(1, 2), dtype=int64), values=tf.Tensor([1], shape=(1,), dtype=int32), dense_shape=tf.Tensor([1 1], shape=(2,), dtype=int64)) tf.Tensor([4], shape=(1,), dtype=int32) tf.Tensor([b'VALIDATION'], shape=(1,), dtype=string) --------------------
Yukarıdaki örnek dönüştürür train.avro
tensorflow veri kümesi içine. Veri kümesinin her öğesi, anahtarı özellik adı, değeri dönüştürülmüş seyrek veya yoğun tensör olan bir sözlüktür. Örneğin, bu dönüştürür features
, label
, dataType
sırasıyla bir VarLenFeature (SparseTensor), FixedLenFeature (DenseTensor) ve FixedLenFeature (DenseTensor) için alan. Batch_size 3 olduğu için, 3 kayıtları zorlamak train.avro
sonucu veri kümesi içinde bir elemana. İlk kayıt için train.avro
olan etiket null, belirtilen varsayılan değer (-100) olan Avro okuyucu yerine geçer o. Bu örnekte, içinde toplam 4 kayıtlar oradayız train.avro
. Parti boyutu 3 olduğu için, sonuç veri kümesi 3 unsurları, kullanıcı aynı zamanda boyut etkinleştirerek toplu boyutundan daha küçük ise son toplu damla yapabiliyor Ancak son en kümesi boyutu 1'dir içeren drop_final_batch
. Örneğin:
dataset = tfio.experimental.columnar.make_avro_record_dataset(file_pattern=['train.avro'],
reader_schema=schema,
features=features,
shuffle=False,
batch_size=3,
drop_final_batch=True,
num_epochs=1)
for record in dataset:
print(record)
{'features[*]': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7f97656423d0>, 'dataType': <tf.Tensor: shape=(3,), dtype=string, numpy=array([b'TRAINING', b'TRAINING', b'VALIDATION'], dtype=object)>, 'label': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([-100, 2, 3], dtype=int32)>}
Ayrıca avro ayrıştırma/okuma paralelliğini artırarak Avro veri işlemeyi hızlandırmak için num_parallel_reads artırılabilir.
dataset = tfio.experimental.columnar.make_avro_record_dataset(file_pattern=['train.avro'],
reader_schema=schema,
features=features,
shuffle=False,
num_parallel_reads=16,
batch_size=3,
drop_final_batch=True,
num_epochs=1)
for record in dataset:
print(record)
{'features[*]': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7f9765693990>, 'dataType': <tf.Tensor: shape=(3,), dtype=string, numpy=array([b'TRAINING', b'TRAINING', b'VALIDATION'], dtype=object)>, 'label': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([-100, 2, 3], dtype=int32)>}
Detaylı kullanım için make_avro_record_dataset
, bakınız API doc .
Avro veri kümesiyle tf.keras modellerini eğitin
Şimdi mnist veri kümesine dayalı Avro veri kümesiyle tf.keras model eğitiminin uçtan uca bir örneğini inceleyelim.
Yük train.avro
Avro veri kümesi API ile TensorFlow veri kümesi olarak:
features = {
'features[*]': tfio.experimental.columnar.VarLenFeatureWithRank(dtype=tf.int32)
}
schema = tf.io.gfile.GFile('train.avsc').read()
dataset = tfio.experimental.columnar.make_avro_record_dataset(file_pattern=['train.avro'],
reader_schema=schema,
features=features,
shuffle=False,
batch_size=1,
num_epochs=1)
Basit bir keras modeli tanımlayın:
def build_and_compile_cnn_model():
model = tf.keras.Sequential()
model.compile(optimizer='sgd', loss='mse')
return model
model = build_and_compile_cnn_model()
Avro veri kümesiyle keras modelini eğitin:
model.fit(x=dataset, epochs=1, steps_per_epoch=1, verbose=1)
WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'features[*]': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7f94b00645d0>} Consider rewriting this model with the Functional API. WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'features[*]': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7f976476ca90>} Consider rewriting this model with the Functional API. 1/1 [==============================] - 0s 60ms/step - loss: 0.0000e+00 <tensorflow.python.keras.callbacks.History at 0x7f94ec08c6d0>
Avro veri kümesi, kayıtlardaki, haritalardaki, dizilerdeki, dallardaki ve numaralandırmalardaki kayıtlar dahil olmak üzere herhangi bir avro verisini ayrıştırabilir ve TensorFlow tensörlerine zorlayabilir. Ayrıştırma bilgisi, anahtarların veri değerlerinin nasıl ayrıştırılacağını kodladığı, verilerin TensorFlow tensörlerine nasıl zorlanacağını kodladığı bir harita olarak avro veri kümesi uygulamasına iletilir – ilkel türe (örn. bool, int, long, float, double, string) karar verilir. ) yanı sıra tensör tipi (örneğin seyrek veya yoğun). TensorFlow'un ayrıştırıcı türlerinin listesi (bkz. Tablo 1) ve ilkel türlerin zorlaması (Tablo 2) sağlanır.
Tablo 1, desteklenen TensorFlow ayrıştırıcı türleri:
TensorFlow Ayrıştırıcı Türleri | TensorFlow Tensörleri | Açıklama |
---|---|---|
tf.FixedLenFeature([], tf.int32) | yoğun tensör | Sabit uzunlukta bir özelliği ayrıştırın; yani tüm satırlar aynı sabit sayıda öğeye sahiptir, örneğin yalnızca bir öğe veya her satır için her zaman aynı sayıda öğeye sahip bir dizi |
tf.SparseFeature(index_key=['key_1st_index', 'key_2nd_index'], value_key='key_value', dtype=tf.int64, size=[20, 50]) | seyrek tensör | Her satırın değişken uzunlukta bir dizin ve değer listesine sahip olduğu seyrek bir özelliği ayrıştırın. 'index_key' endeksleri tanımlar. 'value_key' değeri tanımlar. 'dtype' veri türüdür. 'Boyut', her bir dizin girişi için beklenen maksimum dizin değeridir. |
tfio.experimental.columnar.VarLenFeatureWithRank([],tf.int64) | seyrek tensör | Değişken uzunluk özelliğini ayrıştırın; bu, her veri satırının değişken sayıda öğeye sahip olabileceği anlamına gelir, örneğin 1. satırda 5 eleman, 2. satırda 7 eleman bulunur |
Tablo 2 Avro türlerinden TensorFlow türlerine desteklenen dönüştürme:
Avro İlkel Tip | TensorFlow İlkel Tip |
---|---|
boolean: ikili bir değer | tf.bool |
bayt: 8 bitlik işaretsiz bayt dizisi | tf.string |
çift: çift duyarlıklı 64-bit IEEE kayan noktalı sayı | tf.float64 |
numaralandırma: numaralandırma türü | sembol adını kullanarak tf.string |
kayan nokta: tek duyarlıklı 32-bit IEEE kayan noktalı sayı | tf.float32 |
int: 32 bit işaretli tam sayı | tf.int32 |
uzun: 64 bit işaretli tam sayı | tf.int64 |
null: değer yok | varsayılan değeri kullanır |
dize: unicode karakter dizisi | tf.string |
Avro veri kümesi API örnekleri kapsamlı bir dizi içinde sağlanır testler .