CSV ডেটা লোড করুন

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

এই টিউটোরিয়ালটি TensorFlow এর সাথে কিভাবে CSV ডেটা ব্যবহার করতে হয় তার উদাহরণ প্রদান করে।

এর দুটি প্রধান অংশ রয়েছে:

  1. ডিস্ক বন্ধ ডাটা লোড হচ্ছে
  2. প্রশিক্ষণের জন্য উপযুক্ত একটি ফর্ম এটি প্রাক প্রক্রিয়াকরণ.

এই টিউটোরিয়ালটি লোডিং এর উপর ফোকাস করে এবং প্রিপ্রসেসিং এর কিছু দ্রুত উদাহরণ দেয়। একটি টিউটোরিয়ালের জন্য যা প্রিপ্রসেসিং দিকের উপর ফোকাস করে প্রিপ্রসেসিং লেয়ার গাইড এবং টিউটোরিয়াল দেখুন

সেটআপ

import pandas as pd
import numpy as np

# Make numpy values easier to read.
np.set_printoptions(precision=3, suppress=True)

import tensorflow as tf
from tensorflow.keras import layers

মেমরি ডেটাতে

যেকোনো ছোট CSV ডেটাসেটের জন্য এটিতে একটি TensorFlow মডেলকে প্রশিক্ষণ দেওয়ার সহজ উপায় হল এটিকে একটি পান্ডাস ডেটাফ্রেম বা একটি NumPy অ্যারে হিসাবে মেমরিতে লোড করা।

একটি অপেক্ষাকৃত সহজ উদাহরণ হল অ্যাবালোন ডেটাসেট

  • ডেটাসেট ছোট।
  • সমস্ত ইনপুট বৈশিষ্ট্যগুলি সমস্ত সীমিত-পরিসরের ফ্লোটিং পয়েন্ট মান।

একটি পান্ডাস DataFrame ডেটা কীভাবে ডাউনলোড করবেন তা এখানে রয়েছে:

abalone_train = pd.read_csv(
    "https://storage.googleapis.com/download.tensorflow.org/data/abalone_train.csv",
    names=["Length", "Diameter", "Height", "Whole weight", "Shucked weight",
           "Viscera weight", "Shell weight", "Age"])

abalone_train.head()

ডেটাসেটে অ্যাবালোনের পরিমাপের একটি সেট রয়েছে, এক ধরনের সামুদ্রিক শামুক।

একটি অ্যাবালোন শেল

"অ্যাবালোন শেল" ( নিকি ডুগান পোগ দ্বারা, সিসি বাই-এসএ 2.0)

এই ডেটাসেটের জন্য নামমাত্র কাজ হল অন্যান্য পরিমাপ থেকে বয়সের ভবিষ্যদ্বাণী করা, তাই প্রশিক্ষণের জন্য বৈশিষ্ট্য এবং লেবেলগুলি আলাদা করুন:

abalone_features = abalone_train.copy()
abalone_labels = abalone_features.pop('Age')

এই ডেটাসেটের জন্য আপনি সমস্ত বৈশিষ্ট্যকে একইভাবে বিবেচনা করবেন। বৈশিষ্ট্যগুলিকে একটি একক NumPy অ্যারেতে প্যাক করুন৷:

abalone_features = np.array(abalone_features)
abalone_features
array([[0.435, 0.335, 0.11 , ..., 0.136, 0.077, 0.097],
       [0.585, 0.45 , 0.125, ..., 0.354, 0.207, 0.225],
       [0.655, 0.51 , 0.16 , ..., 0.396, 0.282, 0.37 ],
       ...,
       [0.53 , 0.42 , 0.13 , ..., 0.374, 0.167, 0.249],
       [0.395, 0.315, 0.105, ..., 0.118, 0.091, 0.119],
       [0.45 , 0.355, 0.12 , ..., 0.115, 0.067, 0.16 ]])

পরবর্তী একটি রিগ্রেশন মডেল বয়স ভবিষ্যদ্বাণী করুন. যেহেতু এখানে শুধুমাত্র একটি একক ইনপুট টেনসর আছে, একটি keras.Sequential । অনুক্রমিক মডেল এখানে যথেষ্ট।

abalone_model = tf.keras.Sequential([
  layers.Dense(64),
  layers.Dense(1)
])

abalone_model.compile(loss = tf.losses.MeanSquaredError(),
                      optimizer = tf.optimizers.Adam())

সেই মডেলকে প্রশিক্ষণ দিতে, Model.fit এ বৈশিষ্ট্য এবং লেবেলগুলি পাস করুন:

abalone_model.fit(abalone_features, abalone_labels, epochs=10)
Epoch 1/10
104/104 [==============================] - 1s 2ms/step - loss: 63.0446
Epoch 2/10
104/104 [==============================] - 0s 2ms/step - loss: 11.9429
Epoch 3/10
104/104 [==============================] - 0s 2ms/step - loss: 8.4836
Epoch 4/10
104/104 [==============================] - 0s 2ms/step - loss: 8.0052
Epoch 5/10
104/104 [==============================] - 0s 2ms/step - loss: 7.6073
Epoch 6/10
104/104 [==============================] - 0s 2ms/step - loss: 7.2485
Epoch 7/10
104/104 [==============================] - 0s 2ms/step - loss: 6.9883
Epoch 8/10
104/104 [==============================] - 0s 2ms/step - loss: 6.7977
Epoch 9/10
104/104 [==============================] - 0s 2ms/step - loss: 6.6477
Epoch 10/10
104/104 [==============================] - 0s 2ms/step - loss: 6.5359
<keras.callbacks.History at 0x7f70543c7350>

আপনি CSV ডেটা ব্যবহার করে একটি মডেলকে প্রশিক্ষণ দেওয়ার সবচেয়ে প্রাথমিক উপায়টি দেখেছেন৷ এর পরে, আপনি শিখবেন কিভাবে সাংখ্যিক কলাম স্বাভাবিক করার জন্য প্রিপ্রসেসিং প্রয়োগ করতে হয়।

বেসিক প্রিপ্রসেসিং

আপনার মডেলের ইনপুটগুলিকে স্বাভাবিক করার জন্য এটি ভাল অনুশীলন। কেরাস প্রিপ্রসেসিং স্তরগুলি আপনার মডেলে এই স্বাভাবিককরণ তৈরি করার একটি সুবিধাজনক উপায় প্রদান করে।

স্তরটি প্রতিটি কলামের গড় এবং ভিন্নতা পূর্বনির্ধারণ করবে এবং ডেটা স্বাভাবিক করতে এগুলি ব্যবহার করবে।

প্রথমে আপনি স্তর তৈরি করুন:

normalize = layers.Normalization()

তারপরে আপনি আপনার ডেটাতে স্বাভাবিককরণ স্তরটিকে মানিয়ে নিতে Normalization.adapt() পদ্ধতি ব্যবহার করুন।

normalize.adapt(abalone_features)

তারপর আপনার মডেলে স্বাভাবিককরণ স্তর ব্যবহার করুন:

norm_abalone_model = tf.keras.Sequential([
  normalize,
  layers.Dense(64),
  layers.Dense(1)
])

norm_abalone_model.compile(loss = tf.losses.MeanSquaredError(),
                           optimizer = tf.optimizers.Adam())

norm_abalone_model.fit(abalone_features, abalone_labels, epochs=10)
Epoch 1/10
104/104 [==============================] - 0s 2ms/step - loss: 92.5851
Epoch 2/10
104/104 [==============================] - 0s 2ms/step - loss: 55.1199
Epoch 3/10
104/104 [==============================] - 0s 2ms/step - loss: 18.2937
Epoch 4/10
104/104 [==============================] - 0s 2ms/step - loss: 6.2633
Epoch 5/10
104/104 [==============================] - 0s 2ms/step - loss: 5.1257
Epoch 6/10
104/104 [==============================] - 0s 2ms/step - loss: 5.0217
Epoch 7/10
104/104 [==============================] - 0s 2ms/step - loss: 4.9775
Epoch 8/10
104/104 [==============================] - 0s 2ms/step - loss: 4.9730
Epoch 9/10
104/104 [==============================] - 0s 2ms/step - loss: 4.9348
Epoch 10/10
104/104 [==============================] - 0s 2ms/step - loss: 4.9416
<keras.callbacks.History at 0x7f70541b2a50>

মিশ্র তথ্য প্রকার

"টাইটানিক" ডেটাসেটে টাইটানিকের যাত্রীদের তথ্য রয়েছে। এই ডেটাসেটের নামমাত্র কাজ হল ভবিষ্যদ্বাণী করা যে কে বেঁচে আছে।

টাইটানিক

উইকিমিডিয়া থেকে ছবি

কাঁচা ডেটা সহজে একটি পান্ডাস DataFrame হিসাবে লোড করা যেতে পারে, কিন্তু টেনসরফ্লো মডেলের ইনপুট হিসাবে অবিলম্বে ব্যবহারযোগ্য নয়৷

titanic = pd.read_csv("https://storage.googleapis.com/tf-datasets/titanic/train.csv")
titanic.head()
titanic_features = titanic.copy()
titanic_labels = titanic_features.pop('survived')

বিভিন্ন ডেটা টাইপ এবং রেঞ্জের কারণে আপনি কেবল NumPy অ্যারেতে বৈশিষ্ট্যগুলি স্ট্যাক করতে পারবেন না এবং এটি একটি keras.Sequential মডেলে পাস করতে পারবেন না। প্রতিটি কলাম পৃথকভাবে পরিচালনা করা প্রয়োজন।

একটি বিকল্প হিসাবে, আপনি ক্যাটাগরিকাল কলামগুলিকে সংখ্যাসূচক কলামে রূপান্তর করতে আপনার ডেটা অফলাইনে প্রিপ্রসেস করতে পারেন (আপনার পছন্দের যে কোনও টুল ব্যবহার করে), তারপর প্রক্রিয়াকৃত আউটপুটটি আপনার টেনসরফ্লো মডেলে পাস করুন৷ সেই পদ্ধতির অসুবিধা হল যে আপনি যদি আপনার মডেলটি সংরক্ষণ এবং রপ্তানি করেন তবে এটির সাথে প্রিপ্রসেসিং সংরক্ষণ করা হয় না। কেরাস প্রিপ্রসেসিং স্তরগুলি এই সমস্যাটি এড়ায় কারণ তারা মডেলের অংশ।

এই উদাহরণে, আপনি একটি মডেল তৈরি করবেন যা কেরাস ফাংশনাল API ব্যবহার করে প্রিপ্রসেসিং লজিক প্রয়োগ করে। আপনি সাবক্লাসিং দ্বারা এটি করতে পারেন।

কার্যকরী API "সিম্বলিক" টেনসরগুলিতে কাজ করে। সাধারণ "আগ্রহী" tensors একটি মান আছে. বিপরীতে এই "প্রতীকী" টেনসরগুলি করে না। পরিবর্তে তারা কোন ক্রিয়াকলাপগুলি তাদের উপর চালানো হয় তা ট্র্যাক রাখে এবং গণনার উপস্থাপনা তৈরি করে, যা আপনি পরে চালাতে পারেন। এখানে একটি দ্রুত উদাহরণ:

# Create a symbolic input
input = tf.keras.Input(shape=(), dtype=tf.float32)

# Perform a calculation using the input
result = 2*input + 1

# the result doesn't have a value
result
<KerasTensor: shape=(None,) dtype=float32 (created by layer 'tf.__operators__.add')>
calc = tf.keras.Model(inputs=input, outputs=result)
print(calc(1).numpy())
print(calc(2).numpy())
3.0
5.0

প্রি-প্রসেসিং মডেল তৈরি করতে, সিম্বলিক keras.Input একটি সেট তৈরি করে শুরু করুন। CSV কলামের নাম এবং ডেটা-টাইপগুলির সাথে মিল করে ইনপুট অবজেক্ট।

inputs = {}

for name, column in titanic_features.items():
  dtype = column.dtype
  if dtype == object:
    dtype = tf.string
  else:
    dtype = tf.float32

  inputs[name] = tf.keras.Input(shape=(1,), name=name, dtype=dtype)

inputs
{'sex': <KerasTensor: shape=(None, 1) dtype=string (created by layer 'sex')>,
 'age': <KerasTensor: shape=(None, 1) dtype=float32 (created by layer 'age')>,
 'n_siblings_spouses': <KerasTensor: shape=(None, 1) dtype=float32 (created by layer 'n_siblings_spouses')>,
 'parch': <KerasTensor: shape=(None, 1) dtype=float32 (created by layer 'parch')>,
 'fare': <KerasTensor: shape=(None, 1) dtype=float32 (created by layer 'fare')>,
 'class': <KerasTensor: shape=(None, 1) dtype=string (created by layer 'class')>,
 'deck': <KerasTensor: shape=(None, 1) dtype=string (created by layer 'deck')>,
 'embark_town': <KerasTensor: shape=(None, 1) dtype=string (created by layer 'embark_town')>,
 'alone': <KerasTensor: shape=(None, 1) dtype=string (created by layer 'alone')>}

আপনার প্রিপ্রসেসিং লজিকের প্রথম ধাপ হল সাংখ্যিক ইনপুটগুলিকে একত্রিত করা এবং একটি স্বাভাবিককরণ স্তরের মাধ্যমে সেগুলি চালানো:

numeric_inputs = {name:input for name,input in inputs.items()
                  if input.dtype==tf.float32}

x = layers.Concatenate()(list(numeric_inputs.values()))
norm = layers.Normalization()
norm.adapt(np.array(titanic[numeric_inputs.keys()]))
all_numeric_inputs = norm(x)

all_numeric_inputs
<KerasTensor: shape=(None, 4) dtype=float32 (created by layer 'normalization_1')>

সমস্ত প্রতীকী প্রিপ্রসেসিং ফলাফল সংগ্রহ করুন, পরে সেগুলিকে একত্রিত করতে।

preprocessed_inputs = [all_numeric_inputs]

স্ট্রিং ইনপুটগুলির জন্য tf.keras.layers.StringLookup ফাংশনটি একটি শব্দভান্ডারে স্ট্রিং থেকে পূর্ণসংখ্যা সূচকে ম্যাপ করতে ব্যবহার করুন। এর পরে, মডেলের জন্য উপযুক্ত float32 ডেটাতে সূচীগুলিকে রূপান্তর করতে tf.keras.layers.CategoryEncoding ব্যবহার করুন।

tf.keras.layers.CategoryEncoding স্তরের ডিফল্ট সেটিংস প্রতিটি ইনপুটের জন্য একটি এক-হট ভেক্টর তৈরি করে। একটি স্তর. layers.Embedding কাজ করবে৷ এই বিষয়ে আরও জানতে প্রিপ্রসেসিং লেয়ার গাইড এবং টিউটোরিয়াল দেখুন।

for name, input in inputs.items():
  if input.dtype == tf.float32:
    continue

  lookup = layers.StringLookup(vocabulary=np.unique(titanic_features[name]))
  one_hot = layers.CategoryEncoding(max_tokens=lookup.vocab_size())

  x = lookup(input)
  x = one_hot(x)
  preprocessed_inputs.append(x)
WARNING:tensorflow:vocab_size is deprecated, please use vocabulary_size.
WARNING:tensorflow:max_tokens is deprecated, please use num_tokens instead.
WARNING:tensorflow:vocab_size is deprecated, please use vocabulary_size.
WARNING:tensorflow:max_tokens is deprecated, please use num_tokens instead.
WARNING:tensorflow:vocab_size is deprecated, please use vocabulary_size.
WARNING:tensorflow:max_tokens is deprecated, please use num_tokens instead.
WARNING:tensorflow:vocab_size is deprecated, please use vocabulary_size.
WARNING:tensorflow:max_tokens is deprecated, please use num_tokens instead.
WARNING:tensorflow:vocab_size is deprecated, please use vocabulary_size.
WARNING:tensorflow:max_tokens is deprecated, please use num_tokens instead.

inputs এবং processed_inputs সংগ্রহের সাথে, আপনি সমস্ত প্রাক-প্রসেসড ইনপুট একসাথে সংযুক্ত করতে পারেন এবং একটি মডেল তৈরি করতে পারেন যা প্রিপ্রসেসিং পরিচালনা করে:

preprocessed_inputs_cat = layers.Concatenate()(preprocessed_inputs)

titanic_preprocessing = tf.keras.Model(inputs, preprocessed_inputs_cat)

tf.keras.utils.plot_model(model = titanic_preprocessing , rankdir="LR", dpi=72, show_shapes=True)

png

এই model শুধু ইনপুট প্রিপ্রসেসিং রয়েছে। এটি আপনার ডেটাতে কী করে তা দেখতে আপনি এটি চালাতে পারেন। কেরাস মডেলগুলি স্বয়ংক্রিয়ভাবে পান্ডাস DataFrames রূপান্তর করে না কারণ এটি একটি টেনসরে বা টেনসরের অভিধানে রূপান্তর করা উচিত কিনা তা পরিষ্কার নয়। তাই এটিকে টেনসরের অভিধানে রূপান্তর করুন:

titanic_features_dict = {name: np.array(value) 
                         for name, value in titanic_features.items()}

প্রথম প্রশিক্ষণের উদাহরণটি স্লাইস করুন এবং এটি এই প্রিপ্রসেসিং মডেলে পাস করুন, আপনি সংখ্যাসূচক বৈশিষ্ট্যগুলি এবং স্ট্রিং ওয়ান-হটগুলিকে একত্রিত করে দেখতে পাবেন:

features_dict = {name:values[:1] for name, values in titanic_features_dict.items()}
titanic_preprocessing(features_dict)
<tf.Tensor: shape=(1, 28), dtype=float32, numpy=
array([[-0.61 ,  0.395, -0.479, -0.497,  0.   ,  0.   ,  1.   ,  0.   ,

         0.   ,  0.   ,  1.   ,  0.   ,  0.   ,  0.   ,  0.   ,  0.   ,
         0.   ,  0.   ,  0.   ,  1.   ,  0.   ,  0.   ,  0.   ,  1.   ,
         0.   ,  0.   ,  1.   ,  0.   ]], dtype=float32)>

এখন এর উপরে মডেল তৈরি করুন:

def titanic_model(preprocessing_head, inputs):
  body = tf.keras.Sequential([
    layers.Dense(64),
    layers.Dense(1)
  ])

  preprocessed_inputs = preprocessing_head(inputs)
  result = body(preprocessed_inputs)
  model = tf.keras.Model(inputs, result)

  model.compile(loss=tf.losses.BinaryCrossentropy(from_logits=True),
                optimizer=tf.optimizers.Adam())
  return model

titanic_model = titanic_model(titanic_preprocessing, inputs)

আপনি যখন মডেলটি প্রশিক্ষণ দেন, তখন বৈশিষ্ট্যগুলির x হিসাবে এবং y হিসাবে পাস করুন।

titanic_model.fit(x=titanic_features_dict, y=titanic_labels, epochs=10)
Epoch 1/10
20/20 [==============================] - 1s 4ms/step - loss: 0.8017
Epoch 2/10
20/20 [==============================] - 0s 4ms/step - loss: 0.5913
Epoch 3/10
20/20 [==============================] - 0s 5ms/step - loss: 0.5212
Epoch 4/10
20/20 [==============================] - 0s 5ms/step - loss: 0.4841
Epoch 5/10
20/20 [==============================] - 0s 5ms/step - loss: 0.4615
Epoch 6/10
20/20 [==============================] - 0s 5ms/step - loss: 0.4470
Epoch 7/10
20/20 [==============================] - 0s 5ms/step - loss: 0.4367
Epoch 8/10
20/20 [==============================] - 0s 5ms/step - loss: 0.4304
Epoch 9/10
20/20 [==============================] - 0s 4ms/step - loss: 0.4265
Epoch 10/10
20/20 [==============================] - 0s 5ms/step - loss: 0.4239
<keras.callbacks.History at 0x7f70b1f82a50>

যেহেতু প্রিপ্রসেসিং মডেলের অংশ, আপনি মডেলটিকে সংরক্ষণ করতে পারেন এবং এটি অন্য কোথাও পুনরায় লোড করতে পারেন এবং অভিন্ন ফলাফল পেতে পারেন:

titanic_model.save('test')
reloaded = tf.keras.models.load_model('test')
2022-01-26 06:36:18.822459: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: test/assets
features_dict = {name:values[:1] for name, values in titanic_features_dict.items()}

before = titanic_model(features_dict)
after = reloaded(features_dict)
assert (before-after)<1e-3
print(before)
print(after)
tf.Tensor([[-1.791]], shape=(1, 1), dtype=float32)
tf.Tensor([[-1.791]], shape=(1, 1), dtype=float32)

tf.data ব্যবহার করে

পূর্ববর্তী বিভাগে আপনি মডেল প্রশিক্ষণের সময় মডেলের অন্তর্নির্মিত ডেটা শাফলিং এবং ব্যাচিংয়ের উপর নির্ভর করেছিলেন।

আপনার যদি ইনপুট ডেটা পাইপলাইনের উপর আরও নিয়ন্ত্রণের প্রয়োজন হয় বা এমন ডেটা ব্যবহার করার প্রয়োজন হয় যা সহজেই মেমরিতে ফিট হয় না: tf.data ব্যবহার করুন।

আরও উদাহরণের জন্য tf.data নির্দেশিকা দেখুন।

মেমরি ডেটাতে চালু

CSV ডেটাতে tf.data প্রয়োগের প্রথম উদাহরণ হিসাবে পূর্ববর্তী বিভাগ থেকে বৈশিষ্ট্যগুলির অভিধান ম্যানুয়ালি স্লাইস করতে নিম্নলিখিত কোডটি বিবেচনা করুন। প্রতিটি সূচকের জন্য, প্রতিটি বৈশিষ্ট্যের জন্য সেই সূচকটি লাগে:

import itertools

def slices(features):
  for i in itertools.count():
    # For each feature take index `i`
    example = {name:values[i] for name, values in features.items()}
    yield example

এটি চালান এবং প্রথম উদাহরণ মুদ্রণ করুন:

for example in slices(titanic_features_dict):
  for name, value in example.items():
    print(f"{name:19s}: {value}")
  break
sex                : male
age                : 22.0
n_siblings_spouses : 1
parch              : 0
fare               : 7.25
class              : Third
deck               : unknown
embark_town        : Southampton
alone              : n

মেমরি ডেটা লোডারে সবচেয়ে মৌলিক tf.data.Dataset হল Dataset.from_tensor_slices কনস্ট্রাক্টর। এটি একটি tf.data.Dataset প্রদান করে যা TensorFlow-এ উপরের slices ফাংশনের একটি সাধারণ সংস্করণ প্রয়োগ করে।

features_ds = tf.data.Dataset.from_tensor_slices(titanic_features_dict)

আপনি একটি tf.data.Dataset উপর পুনরাবৃত্তি করতে পারেন অন্য যে কোন পাইথন পুনরাবৃত্তিযোগ্য:

for example in features_ds:
  for name, value in example.items():
    print(f"{name:19s}: {value}")
  break
sex                : b'male'
age                : 22.0
n_siblings_spouses : 1
parch              : 0
fare               : 7.25
class              : b'Third'
deck               : b'unknown'
embark_town        : b'Southampton'
alone              : b'n'

from_tensor_slices ফাংশন নেস্টেড অভিধান বা টিপলগুলির যে কোনও কাঠামো পরিচালনা করতে পারে। নিম্নলিখিত কোডটি (features_dict, labels) জোড়াগুলির একটি ডেটাসেট তৈরি করে:

titanic_ds = tf.data.Dataset.from_tensor_slices((titanic_features_dict, titanic_labels))

এই Dataset ব্যবহার করে একটি মডেলকে প্রশিক্ষণ দিতে, আপনাকে অন্তত ডাটা shuffle এবং batch করতে হবে।

titanic_batches = titanic_ds.shuffle(len(titanic_labels)).batch(32)

Model.fitfeatures এবং labels পাস করার পরিবর্তে, আপনি ডেটাসেট পাস করেন:

titanic_model.fit(titanic_batches, epochs=5)
Epoch 1/5
20/20 [==============================] - 0s 5ms/step - loss: 0.4230
Epoch 2/5
20/20 [==============================] - 0s 5ms/step - loss: 0.4216
Epoch 3/5
20/20 [==============================] - 0s 5ms/step - loss: 0.4203
Epoch 4/5
20/20 [==============================] - 0s 5ms/step - loss: 0.4198
Epoch 5/5
20/20 [==============================] - 0s 5ms/step - loss: 0.4194
<keras.callbacks.History at 0x7f70b12485d0>

একটি একক ফাইল থেকে

এখন পর্যন্ত এই টিউটোরিয়াল ইন-মেমরি ডেটা নিয়ে কাজ করেছে। tf.data হল ডেটা পাইপলাইন তৈরির জন্য একটি অত্যন্ত স্কেলযোগ্য টুলকিট, এবং CSV ফাইল লোড করার জন্য কয়েকটি ফাংশন প্রদান করে।

titanic_file_path = tf.keras.utils.get_file("train.csv", "https://storage.googleapis.com/tf-datasets/titanic/train.csv")
Downloading data from https://storage.googleapis.com/tf-datasets/titanic/train.csv
32768/30874 [===============================] - 0s 0us/step
40960/30874 [=======================================] - 0s 0us/step

এখন ফাইল থেকে CSV ডেটা পড়ুন এবং একটি tf.data.Dataset তৈরি করুন।

(সম্পূর্ণ ডকুমেন্টেশনের জন্য, tf.data.experimental.make_csv_dataset দেখুন)

titanic_csv_ds = tf.data.experimental.make_csv_dataset(
    titanic_file_path,
    batch_size=5, # Artificially small to make examples easier to show.
    label_name='survived',
    num_epochs=1,
    ignore_errors=True,)

এই ফাংশনটিতে অনেক সুবিধাজনক বৈশিষ্ট্য রয়েছে তাই ডেটার সাথে কাজ করা সহজ। এটা অন্তর্ভুক্ত:

  • অভিধান কী হিসেবে কলাম হেডার ব্যবহার করা।
  • স্বয়ংক্রিয়ভাবে প্রতিটি কলামের ধরন নির্ধারণ করা হচ্ছে।
for batch, label in titanic_csv_ds.take(1):
  for key, value in batch.items():
    print(f"{key:20s}: {value}")
  print()
  print(f"{'label':20s}: {label}")
sex                 : [b'male' b'male' b'female' b'male' b'male']
age                 : [27. 18. 15. 46. 50.]
n_siblings_spouses  : [0 0 0 1 0]
parch               : [0 0 0 0 0]
fare                : [ 7.896  7.796  7.225 61.175 13.   ]
class               : [b'Third' b'Third' b'Third' b'First' b'Second']
deck                : [b'unknown' b'unknown' b'unknown' b'E' b'unknown']
embark_town         : [b'Southampton' b'Southampton' b'Cherbourg' b'Southampton' b'Southampton']
alone               : [b'y' b'y' b'y' b'n' b'y']

label               : [0 0 1 0 0]

এটি উড়তে থাকা ডেটাকে ডিকম্প্রেস করতে পারে। এখানে একটি জিজিপড CSV ফাইল রয়েছে যাতে মেট্রো আন্তঃরাজ্য ট্রাফিক ডেটাসেট রয়েছে৷

যানজট.

উইকিমিডিয়া থেকে ছবি

traffic_volume_csv_gz = tf.keras.utils.get_file(
    'Metro_Interstate_Traffic_Volume.csv.gz', 
    "https://archive.ics.uci.edu/ml/machine-learning-databases/00492/Metro_Interstate_Traffic_Volume.csv.gz",
    cache_dir='.', cache_subdir='traffic')
Downloading data from https://archive.ics.uci.edu/ml/machine-learning-databases/00492/Metro_Interstate_Traffic_Volume.csv.gz
409600/405373 [==============================] - 1s 1us/step
417792/405373 [==============================] - 1s 1us/step

সংকুচিত ফাইল থেকে সরাসরি পড়তে compression_type আর্গুমেন্ট সেট করুন:

traffic_volume_csv_gz_ds = tf.data.experimental.make_csv_dataset(
    traffic_volume_csv_gz,
    batch_size=256,
    label_name='traffic_volume',
    num_epochs=1,
    compression_type="GZIP")

for batch, label in traffic_volume_csv_gz_ds.take(1):
  for key, value in batch.items():
    print(f"{key:20s}: {value[:5]}")
  print()
  print(f"{'label':20s}: {label[:5]}")
holiday             : [b'None' b'None' b'None' b'None' b'None']
temp                : [280.56 266.79 281.64 292.71 270.48]
rain_1h             : [0. 0. 0. 0. 0.]
snow_1h             : [0. 0. 0. 0. 0.]
clouds_all          : [46 90 90  0 64]
weather_main        : [b'Clear' b'Clouds' b'Mist' b'Clear' b'Clouds']
weather_description : [b'sky is clear' b'overcast clouds' b'mist' b'Sky is Clear'
 b'broken clouds']
date_time           : [b'2012-11-05 20:00:00' b'2012-12-17 23:00:00' b'2013-10-06 19:00:00'
 b'2013-08-23 22:00:00' b'2013-11-11 05:00:00']

label               : [2415  966 3459 2633 2576]

ক্যাশিং

সিএসভি ডেটা পার্স করার জন্য কিছু ওভারহেড আছে। ছোট মডেলের জন্য এটি প্রশিক্ষণে বাধা হতে পারে।

আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে Dataset.cache বা data.experimental.snapshot ব্যবহার করা একটি ভাল ধারণা হতে পারে যাতে csv ডেটা শুধুমাত্র প্রথম যুগে পার্স করা হয়।

cache এবং snapshot পদ্ধতির মধ্যে প্রধান পার্থক্য হল cache ফাইলগুলি শুধুমাত্র টেনসরফ্লো প্রক্রিয়া দ্বারা ব্যবহার করা যেতে পারে যা তাদের তৈরি করেছে, তবে snapshot ফাইলগুলি অন্যান্য প্রক্রিয়া দ্বারা পড়তে পারে।

উদাহরণস্বরূপ, 20 বার traffic_volume_csv_gz_ds -এর উপর পুনরাবৃত্তি করতে, ক্যাশিং ছাড়াই ~15 সেকেন্ড বা ক্যাশিং সহ ~2 সেকেন্ড সময় লাগে।

%%time
for i, (batch, label) in enumerate(traffic_volume_csv_gz_ds.repeat(20)):
  if i % 40 == 0:
    print('.', end='')
print()
...............................................................................................
CPU times: user 14.9 s, sys: 3.7 s, total: 18.6 s
Wall time: 11.2 s
%%time
caching = traffic_volume_csv_gz_ds.cache().shuffle(1000)

for i, (batch, label) in enumerate(caching.shuffle(1000).repeat(20)):
  if i % 40 == 0:
    print('.', end='')
print()
...............................................................................................
CPU times: user 1.43 s, sys: 173 ms, total: 1.6 s
Wall time: 1.28 s
%%time
snapshot = tf.data.experimental.snapshot('titanic.tfsnap')
snapshotting = traffic_volume_csv_gz_ds.apply(snapshot).shuffle(1000)

for i, (batch, label) in enumerate(snapshotting.shuffle(1000).repeat(20)):
  if i % 40 == 0:
    print('.', end='')
print()
WARNING:tensorflow:From <timed exec>:1: snapshot (from tensorflow.python.data.experimental.ops.snapshot) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.data.Dataset.snapshot(...)`.
...............................................................................................
CPU times: user 2.17 s, sys: 460 ms, total: 2.63 s
Wall time: 1.6 s

csv ফাইল লোড করার মাধ্যমে আপনার ডেটা লোডিং ধীর হয়ে গেলে এবং cache এবং snapshot আপনার ব্যবহারের ক্ষেত্রে অপর্যাপ্ত হলে, আপনার ডেটাকে আরও সুগমিত বিন্যাসে পুনরায় এনকোড করার কথা বিবেচনা করুন।

একাধিক ফাইল

এই বিভাগে এখন পর্যন্ত সমস্ত উদাহরণ tf.data ছাড়াই সহজে করা যেতে পারে। একটি জায়গা যেখানে tf.data জিনিসগুলিকে সত্যিই সহজ করতে পারে তা হল ফাইল সংগ্রহের সাথে কাজ করার সময়।

উদাহরণস্বরূপ, অক্ষর ফন্ট ইমেজ ডেটাসেট csv ফাইলের সংগ্রহ হিসাবে বিতরণ করা হয়, প্রতি ফন্টে একটি।

হরফ

পিক্সাবে থেকে উইলি হাইডেলবাচের ছবি

ডেটাসেট ডাউনলোড করুন এবং ভিতরে থাকা ফাইলগুলি দেখুন:

fonts_zip = tf.keras.utils.get_file(
    'fonts.zip',  "https://archive.ics.uci.edu/ml/machine-learning-databases/00417/fonts.zip",
    cache_dir='.', cache_subdir='fonts',
    extract=True)
Downloading data from https://archive.ics.uci.edu/ml/machine-learning-databases/00417/fonts.zip
160317440/160313983 [==============================] - 8s 0us/step
160325632/160313983 [==============================] - 8s 0us/step
import pathlib
font_csvs =  sorted(str(p) for p in pathlib.Path('fonts').glob("*.csv"))

font_csvs[:10]
['fonts/AGENCY.csv',
 'fonts/ARIAL.csv',
 'fonts/BAITI.csv',
 'fonts/BANKGOTHIC.csv',
 'fonts/BASKERVILLE.csv',
 'fonts/BAUHAUS.csv',
 'fonts/BELL.csv',
 'fonts/BERLIN.csv',
 'fonts/BERNARD.csv',
 'fonts/BITSTREAMVERA.csv']
len(font_csvs)
153

একগুচ্ছ ফাইল নিয়ে কাজ করার সময় আপনি experimental.make_csv_dataset .make_csv_dataset ফাংশনে একটি গ্লোব-স্টাইল file_pattern পাস করতে পারেন। ফাইলের ক্রম প্রতিটি পুনরাবৃত্তির পরিবর্তন করা হয়.

সমান্তরাল এবং ইন্টারলিভড একসাথে কতগুলি ফাইল পড়া হবে তা সেট করতে num_parallel_reads আর্গুমেন্ট ব্যবহার করুন।

fonts_ds = tf.data.experimental.make_csv_dataset(
    file_pattern = "fonts/*.csv",
    batch_size=10, num_epochs=1,
    num_parallel_reads=20,
    shuffle_buffer_size=10000)

এই csv ফাইলগুলিতে ছবিগুলিকে একটি একক সারিতে সমতল করা হয়েছে৷ কলামের নামগুলি r{row}c{column} ফর্ম্যাট করা হয়েছে। এখানে প্রথম ব্যাচ:

for features in fonts_ds.take(1):
  for i, (name, value) in enumerate(features.items()):
    if i>15:
      break
    print(f"{name:20s}: {value}")
print('...')
print(f"[total: {len(features)} features]")
font                : [b'HANDPRINT' b'NIAGARA' b'EUROROMAN' b'NIAGARA' b'CENTAUR' b'NINA'
 b'GOUDY' b'SITKA' b'BELL' b'SITKA']
fontVariant         : [b'scanned' b'NIAGARA SOLID' b'EUROROMAN' b'NIAGARA SOLID' b'CENTAUR'
 b'NINA' b'GOUDY STOUT' b'SITKA TEXT' b'BELL MT' b'SITKA TEXT']
m_label             : [  49 8482  245   88  174 9643   77  974  117  339]
strength            : [0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4]
italic              : [0 0 0 1 0 0 1 0 1 0]
orientation         : [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
m_top               : [ 0 32 24 32 28 57 38 48 51 64]
m_left              : [ 0 20 24 20 22 24 27 23 25 23]
originalH           : [20 27 55 47 50 15 51 50 27 34]
originalW           : [  4  33  25  33  50  15 116  43  28  53]
h                   : [20 20 20 20 20 20 20 20 20 20]
w                   : [20 20 20 20 20 20 20 20 20 20]
r0c0                : [  1 255 255   1   1 255   1   1   1   1]
r0c1                : [  1 255 255   1   1 255   1   1   1   1]
r0c2                : [  1 217 255   1   1 255  54   1   1   1]
r0c3                : [  1 213 255   1   1 255 255   1   1  64]
...
[total: 412 features]

ঐচ্ছিক: প্যাকিং ক্ষেত্র

আপনি সম্ভবত এই মত পৃথক কলামে প্রতিটি পিক্সেলের সাথে কাজ করতে চান না। এই ডেটাসেট ব্যবহার করার চেষ্টা করার আগে একটি ইমেজ-টেনসরে পিক্সেল প্যাক করতে ভুলবেন না।

এখানে এমন কোড রয়েছে যা প্রতিটি উদাহরণের জন্য ছবি তৈরি করতে কলামের নাম পার্স করে:

import re

def make_images(features):
  image = [None]*400
  new_feats = {}

  for name, value in features.items():
    match = re.match('r(\d+)c(\d+)', name)
    if match:
      image[int(match.group(1))*20+int(match.group(2))] = value
    else:
      new_feats[name] = value

  image = tf.stack(image, axis=0)
  image = tf.reshape(image, [20, 20, -1])
  new_feats['image'] = image

  return new_feats

ডেটাসেটের প্রতিটি ব্যাচে সেই ফাংশনটি প্রয়োগ করুন:

fonts_image_ds = fonts_ds.map(make_images)

for features in fonts_image_ds.take(1):
  break

ফলস্বরূপ চিত্রগুলি প্লট করুন:

from matplotlib import pyplot as plt

plt.figure(figsize=(6,6), dpi=120)

for n in range(9):
  plt.subplot(3,3,n+1)
  plt.imshow(features['image'][..., n])
  plt.title(chr(features['m_label'][n]))
  plt.axis('off')

png

নিম্ন স্তরের ফাংশন

এখন পর্যন্ত এই টিউটোরিয়ালটি csv ডেটা পড়ার জন্য সর্বোচ্চ স্তরের ইউটিলিটিগুলির উপর দৃষ্টি নিবদ্ধ করেছে। আপনার ব্যবহারের ক্ষেত্রে মৌলিক প্যাটার্নের সাথে মানানসই না হলে উন্নত ব্যবহারকারীদের জন্য সহায়ক হতে পারে এমন আরও দুটি API আছে।

  • tf.io.decode_csv - CSV কলাম টেনসরের একটি তালিকায় পাঠ্যের লাইন পার্স করার জন্য একটি ফাংশন।
  • tf.data.experimental.CsvDataset - একটি নিম্ন স্তরের csv ডেটাসেট কনস্ট্রাক্টর।

নিম্ন স্তরের কার্যকারিতা কীভাবে ব্যবহার করা যেতে পারে তা প্রদর্শন করতে এই বিভাগটি make_csv_dataset দ্বারা প্রদত্ত কার্যকারিতা পুনরায় তৈরি করে।

tf.io.decode_csv

এই ফাংশনটি একটি স্ট্রিং বা স্ট্রিংগুলির তালিকাকে কলামের তালিকায় ডিকোড করে।

make_csv_dataset বিপরীতে এই ফাংশনটি কলাম ডেটা-টাইপ অনুমান করার চেষ্টা করে না। আপনি প্রতিটি কলামের জন্য সঠিক প্রকারের একটি মান ধারণকারী record_defaults একটি তালিকা প্রদান করে কলামের প্রকারগুলি নির্দিষ্ট করুন৷

decode_csv ব্যবহার করে টাইটানিক ডেটা স্ট্রিং হিসাবে পড়তে আপনি বলবেন:

text = pathlib.Path(titanic_file_path).read_text()
lines = text.split('\n')[1:-1]

all_strings = [str()]*10
all_strings
['', '', '', '', '', '', '', '', '', '']
features = tf.io.decode_csv(lines, record_defaults=all_strings) 

for f in features:
  print(f"type: {f.dtype.name}, shape: {f.shape}")
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)

তাদের প্রকৃত প্রকারের সাথে পার্স করতে, সংশ্লিষ্ট প্রকারের record_defaults একটি তালিকা তৈরি করুন:

print(lines[0])
0,male,22.0,1,0,7.25,Third,unknown,Southampton,n
titanic_types = [int(), str(), float(), int(), int(), float(), str(), str(), str(), str()]
titanic_types
[0, '', 0.0, 0, 0, 0.0, '', '', '', '']
features = tf.io.decode_csv(lines, record_defaults=titanic_types) 

for f in features:
  print(f"type: {f.dtype.name}, shape: {f.shape}")
type: int32, shape: (627,)
type: string, shape: (627,)
type: float32, shape: (627,)
type: int32, shape: (627,)
type: int32, shape: (627,)
type: float32, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)
type: string, shape: (627,)

tf.data.experimental.CsvDataset

tf.data.experimental.CsvDataset ক্লাস make_csv_dataset ফাংশনের সুবিধার বৈশিষ্ট্য ছাড়াই একটি ন্যূনতম CSV Dataset ইন্টারফেস প্রদান করে: কলাম হেডার পার্সিং, কলাম টাইপ-ইনফারেন্স, স্বয়ংক্রিয় শাফলিং, ফাইল ইন্টারলিভিং।

এই কনস্ট্রাক্টর অনুসরণ করে record_defaults io.parse_csv করে:

simple_titanic = tf.data.experimental.CsvDataset(titanic_file_path, record_defaults=titanic_types, header=True)

for example in simple_titanic.take(1):
  print([e.numpy() for e in example])
[0, b'male', 22.0, 1, 0, 7.25, b'Third', b'unknown', b'Southampton', b'n']

উপরের কোডটি মূলত এর সমতুল্য:

def decode_titanic_line(line):
  return tf.io.decode_csv(line, titanic_types)

manual_titanic = (
    # Load the lines of text
    tf.data.TextLineDataset(titanic_file_path)
    # Skip the header row.
    .skip(1)
    # Decode the line.
    .map(decode_titanic_line)
)

for example in manual_titanic.take(1):
  print([e.numpy() for e in example])
[0, b'male', 22.0, 1, 0, 7.25, b'Third', b'unknown', b'Southampton', b'n']

একাধিক ফাইল

experimental.CsvDataset .CsvDataset ব্যবহার করে ফন্ট ডেটাসেট পার্স করতে, আপনাকে প্রথমে record_defaults এর জন্য কলামের ধরন নির্ধারণ করতে হবে। একটি ফাইলের প্রথম সারি পরিদর্শন করে শুরু করুন:

font_line = pathlib.Path(font_csvs[0]).read_text().splitlines()[1]
print(font_line)
AGENCY,AGENCY FB,64258,0.400000,0,0.000000,35,21,51,22,20,20,1,1,1,21,101,210,255,255,255,255,255,255,255,255,255,255,255,255,255,255,1,1,1,93,255,255,255,176,146,146,146,146,146,146,146,146,216,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,141,141,141,182,255,255,255,172,141,141,141,115,1,1,1,1,163,255,255,255,255,255,255,255,255,255,255,255,255,255,255,209,1,1,1,1,163,255,255,255,6,6,6,96,255,255,255,74,6,6,6,5,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255,1,1,1,93,255,255,255,70,1,1,1,1,1,1,1,1,163,255,255,255

শুধুমাত্র প্রথম দুটি ক্ষেত্র হল স্ট্রিং, বাকিগুলি হল ints বা floats, এবং আপনি কমাগুলি গণনা করে মোট বৈশিষ্ট্যগুলি পেতে পারেন:

num_font_features = font_line.count(',')+1
font_column_types = [str(), str()] + [float()]*(num_font_features-2)

CsvDatasaet কনস্ট্রাক্টর ইনপুট ফাইলগুলির একটি তালিকা নিতে পারে, কিন্তু সেগুলিকে ক্রমানুসারে পড়তে পারে। CSV-এর তালিকার প্রথম ফাইলটি হল AGENCY.csv :

font_csvs[0]
'fonts/AGENCY.csv'

তাই যখন আপনি CsvDataaset-এ ফাইলগুলির তালিকা পাস করেন তখন CsvDataaset থেকে AGENCY.csv প্রথমে পড়া হয়:

simple_font_ds = tf.data.experimental.CsvDataset(
    font_csvs, 
    record_defaults=font_column_types, 
    header=True)
for row in simple_font_ds.take(10):
  print(row[0].numpy())
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'
b'AGENCY'

একাধিক ফাইল ইন্টারলিভ করতে, Dataset.interleave ব্যবহার করুন।

এখানে একটি প্রাথমিক ডেটাসেট রয়েছে যাতে csv ফাইলের নাম রয়েছে:

font_files = tf.data.Dataset.list_files("fonts/*.csv")

এটি প্রতিটি যুগের ফাইলের নাম পরিবর্তন করে:

print('Epoch 1:')
for f in list(font_files)[:5]:
  print("    ", f.numpy())
print('    ...')
print()

print('Epoch 2:')
for f in list(font_files)[:5]:
  print("    ", f.numpy())
print('    ...')
Epoch 1:
     b'fonts/CORBEL.csv'
     b'fonts/GLOUCESTER.csv'
     b'fonts/GABRIOLA.csv'
     b'fonts/FORTE.csv'
     b'fonts/GILL.csv'
    ...

Epoch 2:
     b'fonts/MONEY.csv'
     b'fonts/ISOC.csv'
     b'fonts/DUTCH801.csv'
     b'fonts/CALIBRI.csv'
     b'fonts/ROMANTIC.csv'
    ...

interleave পদ্ধতিটি একটি map_func নেয় যা পিতামাতার প্রতিটি উপাদানের জন্য একটি শিশু- Dataset তৈরি করে- Dataset

এখানে, আপনি ফাইলের ডেটাসেটের প্রতিটি উপাদান থেকে একটি CsvDataset তৈরি করতে চান:

def make_font_csv_ds(path):
  return tf.data.experimental.CsvDataset(
    path, 
    record_defaults=font_column_types, 
    header=True)

ইন্টারলিভ দ্বারা প্রত্যাবর্তিত Dataset অনেকগুলি শিশুর উপর সাইকেল চালিয়ে উপাদানগুলি ফিরিয়ে দেয়- Dataset ৷ নিচে উল্লেখ্য, কিভাবে ডেটাসেট cycle_length=3 তিনটি ফন্ট ফাইলের উপর সাইকেল করে:

font_rows = font_files.interleave(make_font_csv_ds,
                                  cycle_length=3)
fonts_dict = {'font_name':[], 'character':[]}

for row in font_rows.take(10):
  fonts_dict['font_name'].append(row[0].numpy().decode())
  fonts_dict['character'].append(chr(row[2].numpy()))

pd.DataFrame(fonts_dict)

কর্মক্ষমতা

এর আগে, এটি উল্লেখ করা হয়েছিল যে io.decode_csv স্ট্রিংগুলির একটি ব্যাচে চালানোর সময় আরও কার্যকর।

CSV লোডিং পারফরম্যান্স উন্নত করার জন্য, বড় ব্যাচের মাপ ব্যবহার করার সময় এই সত্যটির সুবিধা নেওয়া সম্ভব (তবে প্রথমে ক্যাশে করার চেষ্টা করুন)।

অন্তর্নির্মিত লোডার 20 সহ, 2048- উদাহরণ ব্যাচগুলি প্রায় 17 সেকেন্ড সময় নেয়।

BATCH_SIZE=2048
fonts_ds = tf.data.experimental.make_csv_dataset(
    file_pattern = "fonts/*.csv",
    batch_size=BATCH_SIZE, num_epochs=1,
    num_parallel_reads=100)
%%time
for i,batch in enumerate(fonts_ds.take(20)):
  print('.',end='')

print()
....................
CPU times: user 24.3 s, sys: 1.46 s, total: 25.7 s
Wall time: 10.9 s

decode_csv পাঠ্য লাইনের ব্যাচগুলি পাস করা দ্রুত চলে, প্রায় 5 সেকেন্ডে:

fonts_files = tf.data.Dataset.list_files("fonts/*.csv")
fonts_lines = fonts_files.interleave(
    lambda fname:tf.data.TextLineDataset(fname).skip(1), 
    cycle_length=100).batch(BATCH_SIZE)

fonts_fast = fonts_lines.map(lambda x: tf.io.decode_csv(x, record_defaults=font_column_types))
%%time
for i,batch in enumerate(fonts_fast.take(20)):
  print('.',end='')

print()
....................
CPU times: user 8.77 s, sys: 0 ns, total: 8.77 s
Wall time: 1.57 s

বড় ব্যাচ ব্যবহার করে CSV কর্মক্ষমতা বাড়ানোর আরেকটি উদাহরণের জন্য ওভারফিট এবং আন্ডারফিট টিউটোরিয়ালটি দেখুন।

এই ধরণের পদ্ধতি কাজ করতে পারে, তবে cache এবং snapshot বা আপনার ডেটাকে আরও সুগমিত বিন্যাসে পুনরায় এনকোড করার মত অন্যান্য বিকল্পগুলি বিবেচনা করুন৷