Avro Veri Kümesi API'si

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 .