مشاهده در 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 است که در داخل ارائه آزمون .