অভ্র ডেটাসেট API

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

অভ্র ডেটা সেটটি API- এর উদ্দেশ্য অভ্র যেমন TensorFlow মধ্যে স্থানীয়ভাবে ডেটা ফরম্যাট লোড হয় TensorFlow ডেটা সেটটি । অভ্র একটি ডেটা সিরিয়ালাইজেশন সিস্টেম যা প্রোটোকল বাফারের মতো। এটি Apache Hadoop-এ ব্যাপকভাবে ব্যবহৃত হয় যেখানে এটি ক্রমাগত ডেটার জন্য একটি ক্রমিক বিন্যাস এবং Hadoop নোডগুলির মধ্যে যোগাযোগের জন্য একটি তারের বিন্যাস উভয়ই প্রদান করতে পারে। অভ্র ডেটা একটি সারি-ভিত্তিক, কম্প্যাক্টেড বাইনারি ডেটা ফর্ম্যাট। এটি স্কিমার উপর নির্ভর করে যা একটি পৃথক 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

ব্যবহার

ডেটাসেট অন্বেষণ করুন

এই টিউটোরিয়ালের উদ্দেশ্যে, আসুন অভ্র ডেটাসেটের নমুনা ডাউনলোড করি।

একটি নমুনা অভ্র ফাইল ডাউনলোড করুন:

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

উপরের উদাহরণে, mnist ডেটাসেটের উপর ভিত্তি করে একটি টেস্টিং Avro ডেটাসেট তৈরি করা হয়েছে। TFRecord বিন্যাসে মূল mnist ডেটা সেটটি থেকে জেনারেট হওয়া মেমরি নামে ডেটা সেটটি । যাইহোক, ডেমো ডেটাসেট হিসাবে mnist ডেটাসেট অনেক বড়। সরলতার উদ্দেশ্যে, এর বেশিরভাগই ছাঁটাই করা হয়েছিল এবং প্রথম কয়েকটি রেকর্ড শুধুমাত্র রাখা হয়েছিল। তাছাড়া, অতিরিক্ত ছাঁটাইয়ের জন্য করা হয়েছিল image মূল mnist ডেটাসেটে ক্ষেত্র এবং এটিকে ম্যাপ features অভ্র মধ্যে ক্ষেত্র। তাই অভ্র ফাইল train.avro : 4 রেকর্ড, প্রতিটি যা 3 ক্ষেত্র করেছে features , যা কোন int, একটি অ্যারে label , কোন int বা নাল, এবং dataType , একটি enum। সঙ্কেতমুক্ত দেখতে train.avro (উল্লেখ্য মূল অভ্র তথ্য ফাইল মানুষের পাঠযোগ্য যেমন অভ্র একটি সন্নিবিষ্ট ফরম্যাট নয়):

অভ্র ফাইলটি পড়ার জন্য প্রয়োজনীয় প্যাকেজটি ইনস্টল করুন:

pip install 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 অভ্র ডেটা সেটটি API- এর সাথে TensorFlow ডেটা সেটটি হিসাবে:

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 যার ট্যাগ নাল, নির্দিষ্ট ডিফল্ট মান (-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 বাড়াতে পারে।

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 , পড়ুন দয়া এপিআই ডক

Avro ডেটাসেটের মাধ্যমে tf.keras মডেলদের প্রশিক্ষণ দিন

এখন আসুন mnist ডেটাসেটের উপর ভিত্তি করে Avro ডেটাসেটের সাথে tf.keras মডেল প্রশিক্ষণের একটি এন্ড-টু-এন্ড উদাহরণের মধ্য দিয়ে চলুন।

লোড train.avro অভ্র ডেটা সেটটি API- এর সাথে TensorFlow ডেটা সেটটি হিসাবে:

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

অভ্র ডেটাসেটের সাথে কেরাস মডেলকে প্রশিক্ষণ দিন:

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 ডেটাসেট বাস্তবায়নে স্থানান্তরিত হয় যেখানে কীগুলি এনকোড করে কীভাবে ডেটা মানগুলিকে পার্স করতে হয় তা এনকোড করে টেনসরফ্লো টেনসরগুলিতে কীভাবে ডেটা জোরপূর্বক করা যায় - আদিম প্রকারের সিদ্ধান্ত নেওয়া (যেমন বুল, int, লং, ফ্লোট, ডবল, স্ট্রিং ) পাশাপাশি টেনসর প্রকার (যেমন স্পারস বা ঘন)। TensorFlow এর পার্সার প্রকারের একটি তালিকা (সারণী 1 দেখুন) এবং আদিম প্রকারের জবরদস্তি (সারণী 2) প্রদান করা হয়েছে।

সারণি 1 সমর্থিত TensorFlow পার্সার প্রকার:

টেনসরফ্লো পার্সার প্রকার টেনসরফ্লো টেনসর ব্যাখ্যা
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' সূচক চিহ্নিত করে। 'মান_কী' মানটিকে চিহ্নিত করে। 'dtype' হল ডেটা টাইপ। 'আকার' হল প্রতিটি সূচক এন্ট্রির জন্য প্রত্যাশিত সর্বোচ্চ সূচক মান
tfio.experimental.columnar.VarLenFeatureWithRank([],tf.int64) স্পার্স টেনসর একটি পরিবর্তনশীল দৈর্ঘ্য বৈশিষ্ট্য পার্স; তার মানে প্রতিটি ডেটা সারিতে একটি পরিবর্তনশীল সংখ্যক উপাদান থাকতে পারে, যেমন 1ম সারিতে 5টি উপাদান রয়েছে, 2য় সারিতে 7টি উপাদান রয়েছে

সারণি 2 অভ্র প্রকার থেকে TensorFlow এর প্রকারে সমর্থিত রূপান্তর:

অভ্র আদিম প্রকার টেনসরফ্লো আদিম প্রকার
বুলিয়ান: একটি বাইনারি মান tf.bool
বাইট: 8-বিট স্বাক্ষরবিহীন বাইটের একটি ক্রম tf.string
ডবল: ডবল নির্ভুলতা 64-বিট IEEE ফ্লোটিং পয়েন্ট নম্বর tf.float64
enum: গণনার ধরন tf.string প্রতীকের নাম ব্যবহার করে
float: একক নির্ভুলতা 32-বিট IEEE ফ্লোটিং পয়েন্ট নম্বর tf.float32
int: 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা tf.int32
দীর্ঘ: 64-বিট স্বাক্ষরিত পূর্ণসংখ্যা tf.int64
নাল: কোন মান নেই ডিফল্ট মান ব্যবহার করে
স্ট্রিং: ইউনিকোড অক্ষর ক্রম tf.string

অভ্র ডেটা সেটটি API- এর উদাহরণ এক বিস্তারিত সেট মধ্যে প্রদান করা হয় পরীক্ষার