Avro Dataset API

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

هدف از آورو مجموعه داده API است که برای بارگذاری آورو داده بومی به TensorFlow به عنوان فرمت مجموعه داده TensorFlow . Avro یک سیستم سریال‌سازی داده مشابه بافرهای پروتکل است. این به طور گسترده در Apache Hadoop استفاده می‌شود، جایی که می‌تواند هم یک قالب سریال‌سازی برای داده‌های پایدار و هم یک قالب سیمی برای ارتباط بین گره‌های Hadoop ارائه دهد. داده Avro یک فرمت داده باینری فشرده و ردیف‌گرا است. این مبتنی بر طرحی است که به عنوان یک فایل JSON جداگانه ذخیره می شود. برای تنظیمات از آورو فرمت و طرح اعلامیه، مراجعه شود به کتابچه راهنمای رسمی .

بسته راه اندازی

بسته tensorflow-io مورد نیاز را نصب کنید

pip install tensorflow-io

بسته های وارداتی

import tensorflow as tf
import tensorflow_io as tfio

واردات tf و tfio را تأیید کنید

print("tensorflow-io version: {}".format(tfio.__version__))
print("tensorflow version: {}".format(tf.__version__))
tensorflow-io version: 0.18.0
tensorflow version: 2.5.0

استفاده

مجموعه داده را کاوش کنید

برای هدف این آموزش، نمونه مجموعه داده Avro را دانلود می کنیم.

دانلود نمونه فایل Avro:

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

فایل شمای مربوطه نمونه فایل Avro را دانلود کنید:

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

در مثال بالا، یک مجموعه داده آزمایشی Avro بر اساس مجموعه داده mnist ایجاد شد. مجموعه داده MNIST اصلی در قالب TFRecord از تولید TF به نام مجموعه داده . با این حال، مجموعه داده mnist به عنوان یک مجموعه داده آزمایشی بسیار بزرگ است. به منظور سادگی، بیشتر آن کوتاه شد و تنها چند رکورد اول نگهداری شد. علاوه بر این، پیرایش اضافی برای انجام شد image زمینه در مجموعه داده MNIST اصلی و آن را به نقشه برداری features زمینه در آورو. بنابراین فایل AVRO train.avro دارای 4 سوابق، که هر کدام دارای 3 زمینه های: features است که آرایه ای از نوع int، label ، یک int یا null، و dataType ، یک شمارشی. برای مشاهده رمزگشایی train.avro (توجه داشته باشید فایل داده AVRO اصلی است قابل خواندن توسط انسان نه به عنوان AVRO یک فرمت فشرده است):

بسته مورد نیاز برای خواندن فایل Avro را نصب کنید:

pip install avro

برای خواندن و چاپ یک فایل Avro در قالب قابل خواندن توسط انسان:

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'}

و طرح از train.avro است که توسط نمایندگی train.avsc یک فایل با قالب JSON است. برای مشاهده 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"
}

مجموعه داده را آماده کنید

بار train.avro به عنوان مجموعه داده TensorFlow با آورو مجموعه داده API:

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)
--------------------

به عنوان مثال تبدیل بالا train.avro به مجموعه داده tensorflow. هر عنصر مجموعه داده یک فرهنگ لغت است که کلید آن نام ویژگی است، مقدار آن تانسور پراکنده یا متراکم تبدیل شده است. به عنوان مثال، آن را تبدیل features ، label ، dataType رشته به VarLenFeature (SparseTensor)، FixedLenFeature (DenseTensor) و FixedLenFeature (DenseTensor) بود. از آنجا که batch_size 3 است، آن را مجبور 3 رکورد از train.avro را به یک عنصر در مجموعه داده نتیجه. برای اولین رکورد در train.avro که برچسب تهی است، جایگزین خواننده AVRO آن را با مقدار پیش فرض مشخص (-100). در این مثال، هستید 4 سوابق در مجموع در آن وجود دارد train.avro . از آنجا که اندازه دسته 3، مجموعه داده نتیجه شامل 3 عناصر، آخرین آن است اندازه دسته 1. با این حال کاربران نیز قادر به رها کردن آخرین دسته اگر اندازه کوچکتر از اندازه دسته ای با فعال است drop_final_batch . به عنوان مثال:

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)>}

همچنین می‌توان num_parallel_reads را برای تسریع پردازش داده‌های Avro با افزایش موازی‌سازی avro parse/read افزایش داد.

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)>}

برای استفاده دقیق از make_avro_record_dataset ، مراجعه شود به توضیحات API .

آموزش مدل‌های tf.keras با مجموعه داده Avro

اکنون بیایید یک مثال سرتاسری از آموزش مدل tf.keras با مجموعه داده Avro بر اساس مجموعه داده mnist را مرور کنیم.

بار train.avro به عنوان مجموعه داده TensorFlow با آورو مجموعه داده API:

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)

یک مدل کراس ساده را تعریف کنید:

def build_and_compile_cnn_model():
    model = tf.keras.Sequential()
    model.compile(optimizer='sgd', loss='mse')
    return model

model = build_and_compile_cnn_model()

آموزش مدل keras با مجموعه داده Avro:

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 می‌تواند هر داده avro را در تانسورهای TensorFlow، از جمله رکوردها در رکوردها، نقشه‌ها، آرایه‌ها، شاخه‌ها و شمارش‌ها تجزیه و تحلیل کند. اطلاعات تجزیه به عنوان نقشه ای به پیاده سازی مجموعه داده avro ارسال می شود که در آن کلیدها نحوه تجزیه مقادیر داده را در مورد نحوه وادار کردن داده ها به تانسورهای TensorFlow رمزگذاری می کنند - تعیین نوع اولیه (مانند bool، int، long، float، double، string). ) و همچنین نوع تانسور (مثلاً پراکنده یا متراکم). فهرستی از انواع تجزیه کننده TensorFlow (به جدول 1 مراجعه کنید) و اجبار انواع اولیه (جدول 2) ارائه شده است.

جدول 1 انواع تجزیه کننده TensorFlow پشتیبانی شده:

انواع تجزیه کننده TensorFlow TensorFlow Tensor توضیح
tf.FixedLenFeature([]، tf.int32) تانسور متراکم تجزیه ویژگی طول ثابت. یعنی همه سطرها دارای تعداد ثابت یکسانی از عناصر هستند، به عنوان مثال فقط یک عنصر یا آرایه ای که همیشه تعداد عناصر یکسانی برای هر ردیف دارد.
tf.SparseFeature(index_key=['key_1st_index', 'key_2nd_index'], value_key='key_value', dtype=tf.int64, size=[20, 50]) تانسور پراکنده یک ویژگی پراکنده را تجزیه کنید که در آن هر ردیف دارای یک لیست با طول متغیر از شاخص ها و مقادیر است. 'index_key' شاخص ها را مشخص می کند. "value_key" مقدار را مشخص می کند. 'dtype' نوع داده است. "اندازه" حداکثر مقدار شاخص مورد انتظار برای هر ورودی شاخص است
tfio.experimental.columnar.VarLenFeatureWithRank([],tf.int64) تانسور پراکنده یک ویژگی طول متغیر را تجزیه کنید. این بدان معناست که هر ردیف داده می تواند دارای تعداد متغیری از عناصر باشد، به عنوان مثال، ردیف اول دارای 5 عنصر، ردیف دوم دارای 7 عنصر است.

جدول 2 تبدیل پشتیبانی شده از انواع Avro به انواع TensorFlow:

Avro Primitive Type نوع اولیه TensorFlow
بولی: یک مقدار باینری tf.bool
بایت: دنباله ای از بایت های بدون علامت 8 بیتی tf.string
double: عدد ممیز شناور IEEE 64 بیتی با دقت دو برابر tf.float64
enum: نوع شمارش tf.string با استفاده از نام نماد
شناور: عدد ممیز شناور 32 بیتی IEEE تک دقیق tf.float32
int: عدد صحیح امضا شده 32 بیتی tf.int32
long: عدد صحیح امضا شده 64 بیتی tf.int64
null: بدون ارزش از مقدار پیش فرض استفاده می کند
رشته: دنباله کاراکتر یونیکد tf.string

مجموعه ای جامع از نمونه هایی از آورو مجموعه داده API است که در داخل ارائه آزمون .