বৈশিষ্ট্য কলাম সহ কাঠামোগত ডেটা শ্রেণীবদ্ধ করুন

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

এই টিউটোরিয়ালটি দেখায় কিভাবে স্ট্রাকচার্ড ডেটা শ্রেণীবদ্ধ করা যায় (যেমন একটি CSV-এ ট্যাবুলার ডেটা)। মডেলটিকে সংজ্ঞায়িত করতে আমরা কেরাস ব্যবহার করব, এবং CSV-এর কলাম থেকে মডেলকে প্রশিক্ষণের জন্য ব্যবহৃত বৈশিষ্ট্যগুলিতে মানচিত্র করার জন্য tf.feature_column কে একটি সেতু হিসেবে ব্যবহার করব। এই টিউটোরিয়ালটিতে সম্পূর্ণ কোড রয়েছে:

  • Pandas ব্যবহার করে একটি CSV ফাইল লোড করুন।
  • tf.data ব্যবহার করে সারিগুলি ব্যাচ এবং এলোমেলো করার জন্য একটি ইনপুট পাইপলাইন তৈরি করুন।
  • CSV-এর কলাম থেকে ফিচার কলাম ব্যবহার করে মডেলকে প্রশিক্ষণ দিতে ব্যবহৃত বৈশিষ্ট্যের মানচিত্র।
  • কেরাস ব্যবহার করে একটি মডেল তৈরি করুন, ট্রেন করুন এবং মূল্যায়ন করুন।

ডেটাসেট

আমরা PetFinder ডেটাসেটের একটি সরলীকৃত সংস্করণ ব্যবহার করব৷ CSV-তে কয়েক হাজার সারি আছে। প্রতিটি সারি একটি পোষা প্রাণী বর্ণনা করে, এবং প্রতিটি কলাম একটি বৈশিষ্ট্য বর্ণনা করে। পোষা প্রাণীটি যে গতিতে গ্রহণ করা হবে তা অনুমান করতে আমরা এই তথ্যটি ব্যবহার করব।

এই ডেটাসেটের বিবরণ নিচে দেওয়া হল। সাংখ্যিক এবং শ্রেণীবদ্ধ কলাম উভয়ই লক্ষ্য করুন। একটি বিনামূল্যের পাঠ্য কলাম রয়েছে যা আমরা এই টিউটোরিয়ালে ব্যবহার করব না।

কলাম বর্ণনা বৈশিষ্ট্যের ধরন ডেটা টাইপ
টাইপ প্রাণীর প্রকার (কুকুর, বিড়াল) শ্রেণীবদ্ধ স্ট্রিং
বয়স পোষা প্রাণীর বয়স সংখ্যাসূচক পূর্ণসংখ্যা
জাত ১ পোষা প্রাণীর প্রাথমিক জাত শ্রেণীবদ্ধ স্ট্রিং
রঙ 1 পোষা প্রাণীর রঙ 1 শ্রেণীবদ্ধ স্ট্রিং
রঙ2 পোষা প্রাণীর রঙ 2 শ্রেণীবদ্ধ স্ট্রিং
পরিপক্কতার আকার পরিপক্কতায় আকার শ্রেণীবদ্ধ স্ট্রিং
ফারলেংথ পশম দৈর্ঘ্য শ্রেণীবদ্ধ স্ট্রিং
টিকা দেওয়া হয়েছে পোষ্য টিকা দেওয়া হয়েছে শ্রেণীবদ্ধ স্ট্রিং
জীবাণুমুক্ত পোষা জীবাণুমুক্ত করা হয়েছে শ্রেণীবদ্ধ স্ট্রিং
স্বাস্থ্য স্বাস্থ্যের অবস্থা শ্রেণীবদ্ধ স্ট্রিং
ফি দত্তক ফি সংখ্যাসূচক পূর্ণসংখ্যা
বর্ণনা এই পোষা প্রাণীর জন্য প্রোফাইল লেখা আপ পাঠ্য স্ট্রিং
ফটোএএমটি এই পোষা প্রাণীর জন্য মোট আপলোড করা ফটো সংখ্যাসূচক পূর্ণসংখ্যা
দত্তক গতি গ্রহণের গতি শ্রেণীবিভাগ পূর্ণসংখ্যা

TensorFlow এবং অন্যান্য লাইব্রেরি আমদানি করুন

pip install sklearn
import numpy as np
import pandas as pd

import tensorflow as tf

from tensorflow import feature_column
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split

একটি ডেটাফ্রেম তৈরি করতে পান্ডা ব্যবহার করুন

পান্ডাস হল একটি পাইথন লাইব্রেরি যেখানে স্ট্রাকচার্ড ডেটা লোড করার এবং কাজ করার জন্য অনেক সহায়ক ইউটিলিটি রয়েছে। আমরা একটি URL থেকে ডেটাসেট ডাউনলোড করতে পান্ডাস ব্যবহার করব এবং এটি একটি ডেটাফ্রেমে লোড করব।

import pathlib

dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'
csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'

tf.keras.utils.get_file('petfinder_mini.zip', dataset_url,
                        extract=True, cache_dir='.')
dataframe = pd.read_csv(csv_file)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip
1671168/1668792 [==============================] - 0s 0us/step
1679360/1668792 [==============================] - 0s 0us/step
dataframe.head()

টার্গেট ভেরিয়েবল তৈরি করুন

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

লেবেল কলাম সংশোধন করার পরে, 0 ইঙ্গিত করবে যে পোষা প্রাণীটি গ্রহণ করা হয়নি এবং 1 নির্দেশ করবে যে এটি ছিল।

# In the original dataset "4" indicates the pet was not adopted.
dataframe['target'] = np.where(dataframe['AdoptionSpeed']==4, 0, 1)

# Drop un-used columns.
dataframe = dataframe.drop(columns=['AdoptionSpeed', 'Description'])

ডেটাফ্রেমটিকে ট্রেন, বৈধতা এবং পরীক্ষায় বিভক্ত করুন

আমরা যে ডেটাসেটটি ডাউনলোড করেছি সেটি একটি একক CSV ফাইল। আমরা এটিকে ট্রেন, বৈধতা এবং পরীক্ষার সেটে বিভক্ত করব।

train, test = train_test_split(dataframe, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)
print(len(train), 'train examples')
print(len(val), 'validation examples')
print(len(test), 'test examples')
7383 train examples
1846 validation examples
2308 test examples

tf.data ব্যবহার করে একটি ইনপুট পাইপলাইন তৈরি করুন

এর পরে, আমরা ডাটাফ্রেমগুলিকে tf.data দিয়ে মোড়ানো করব। এটি আমাদেরকে পান্ডাস ডেটাফ্রেমের কলামগুলি থেকে মডেলকে প্রশিক্ষণের জন্য ব্যবহৃত বৈশিষ্ট্যগুলিতে ম্যাপ করতে সেতু হিসাবে বৈশিষ্ট্য কলামগুলি ব্যবহার করতে সক্ষম করবে৷ যদি আমরা একটি খুব বড় CSV ফাইলের সাথে কাজ করতাম (এত বড় যে এটি মেমরিতে ফিট করে না), আমরা সরাসরি ডিস্ক থেকে এটি পড়ার জন্য tf.data ব্যবহার করতাম। যে এই টিউটোরিয়ালে আচ্ছাদিত করা হয় না.

# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
  dataframe = dataframe.copy()
  labels = dataframe.pop('target')
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(dataframe))
  ds = ds.batch(batch_size)
  return ds
batch_size = 5 # A small batch sized is used for demonstration purposes
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)

ইনপুট পাইপলাইন বুঝুন

এখন যেহেতু আমরা ইনপুট পাইপলাইন তৈরি করেছি, এটি যে ডেটা ফেরত দেয় তার বিন্যাস দেখতে এটিকে কল করা যাক। আউটপুট পাঠযোগ্য রাখতে আমরা একটি ছোট ব্যাচ আকার ব্যবহার করেছি।

for feature_batch, label_batch in train_ds.take(1):
  print('Every feature:', list(feature_batch.keys()))
  print('A batch of ages:', feature_batch['Age'])
  print('A batch of targets:', label_batch )
Every feature: ['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt']
A batch of ages: tf.Tensor([ 6  2 36  2  2], shape=(5,), dtype=int64)
A batch of targets: tf.Tensor([1 1 1 1 1], shape=(5,), dtype=int64)

আমরা দেখতে পাচ্ছি যে ডেটাসেট কলামের নামের একটি অভিধান প্রদান করে (ডেটাফ্রেম থেকে) যা ডেটাফ্রেমের সারি থেকে কলামের মানগুলিতে ম্যাপ করে।

বিভিন্ন ধরনের বৈশিষ্ট্য কলাম প্রদর্শন করুন

TensorFlow অনেক ধরনের বৈশিষ্ট্য কলাম প্রদান করে। এই বিভাগে, আমরা বিভিন্ন ধরনের বৈশিষ্ট্য কলাম তৈরি করব, এবং প্রদর্শন করব কিভাবে তারা ডেটাফ্রেম থেকে একটি কলামকে রূপান্তরিত করে।

# We will use this batch to demonstrate several types of feature columns
example_batch = next(iter(train_ds))[0]
# A utility method to create a feature column
# and to transform a batch of data
def demo(feature_column):
  feature_layer = layers.DenseFeatures(feature_column)
  print(feature_layer(example_batch).numpy())

সংখ্যাসূচক কলাম

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

photo_count = feature_column.numeric_column('PhotoAmt')
demo(photo_count)
[[2.]
 [4.]
 [4.]
 [1.]
 [2.]]

পেটফাইন্ডার ডেটাসেটে, ডেটাফ্রেমের বেশিরভাগ কলামই শ্রেণীবদ্ধ।

বালতিযুক্ত কলাম

প্রায়শই, আপনি একটি সংখ্যাকে সরাসরি মডেলে ফিড করতে চান না, বরং সংখ্যাসূচক ব্যাপ্তির উপর ভিত্তি করে এর মানকে বিভিন্ন বিভাগে ভাগ করুন। একজন ব্যক্তির বয়সের প্রতিনিধিত্ব করে এমন কাঁচা ডেটা বিবেচনা করুন। বয়সকে সাংখ্যিক কলাম হিসাবে উপস্থাপন করার পরিবর্তে, আমরা একটি বালতিযুক্ত কলাম ব্যবহার করে বয়সকে কয়েকটি বালতিতে ভাগ করতে পারি। নিচের এক-হট মানগুলি লক্ষ্য করুন প্রতিটি সারি কোন বয়সের সীমার সাথে মেলে তা বর্ণনা করে।

age = feature_column.numeric_column('Age')
age_buckets = feature_column.bucketized_column(age, boundaries=[1, 3, 5])
demo(age_buckets)
[[0. 0. 0. 1.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [0. 0. 1. 0.]
 [0. 1. 0. 0.]]

শ্রেণীবদ্ধ কলাম

এই ডেটাসেটে, টাইপকে একটি স্ট্রিং হিসাবে উপস্থাপন করা হয় (যেমন 'কুকুর', বা 'বিড়াল')। আমরা সরাসরি একটি মডেলে স্ট্রিং ফিড করতে পারি না। পরিবর্তে, আমাদের অবশ্যই প্রথমে তাদের সংখ্যাসূচক মানগুলিতে মানচিত্র তৈরি করতে হবে। শ্রেণীবদ্ধ শব্দভান্ডার কলামগুলি স্ট্রিংগুলিকে এক-হট ভেক্টর হিসাবে উপস্থাপন করার একটি উপায় প্রদান করে (যেমন আপনি বয়সের বালতিগুলির সাথে উপরে দেখেছেন)। categorical_column_with_vocabulary_list ব্যবহার করে শব্দভান্ডার একটি তালিকা হিসাবে পাস করা যেতে পারে, অথবা categorical_column_with_vocabulary_file ব্যবহার করে একটি ফাইল থেকে লোড করা যেতে পারে।

animal_type = feature_column.categorical_column_with_vocabulary_list(
      'Type', ['Cat', 'Dog'])

animal_type_one_hot = feature_column.indicator_column(animal_type)
demo(animal_type_one_hot)
[[1. 0.]
 [1. 0.]
 [1. 0.]
 [1. 0.]
 [0. 1.]]

কলাম এম্বেড করা হচ্ছে

শুধু কয়েকটি সম্ভাব্য স্ট্রিং থাকার পরিবর্তে ধরুন, আমাদের প্রতি বিভাগে হাজার হাজার (বা তার বেশি) মান রয়েছে। বিভিন্ন কারণে, বিভাগের সংখ্যা বড় হওয়ার সাথে সাথে এক-হট এনকোডিং ব্যবহার করে একটি নিউরাল নেটওয়ার্ককে প্রশিক্ষণ দেওয়া অসম্ভব হয়ে পড়ে। এই সীমাবদ্ধতা কাটিয়ে উঠতে আমরা একটি এম্বেডিং কলাম ব্যবহার করতে পারি। অনেক মাত্রার এক-হট ভেক্টর হিসাবে ডেটা প্রতিনিধিত্ব করার পরিবর্তে, একটি এম্বেডিং কলাম সেই ডেটাটিকে একটি নিম্ন-মাত্রিক, ঘন ভেক্টর হিসাবে উপস্থাপন করে যাতে প্রতিটি কক্ষ যে কোনও সংখ্যা ধারণ করতে পারে, শুধুমাত্র 0 বা 1 নয়। এমবেডিংয়ের আকার ( 8, নীচের উদাহরণে) একটি প্যারামিটার যা টিউন করা আবশ্যক।

# Notice the input to the embedding column is the categorical column
# we previously created
breed1 = feature_column.categorical_column_with_vocabulary_list(
      'Breed1', dataframe.Breed1.unique())
breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
demo(breed1_embedding)
[[-0.22380038 -0.09379731  0.21349265  0.33451992 -0.49730566  0.05174963
   0.2668497   0.27391028]
 [-0.5484653  -0.03492585  0.05648395 -0.09792244  0.02530896 -0.15477926
  -0.10695003 -0.45474145]
 [-0.22380038 -0.09379731  0.21349265  0.33451992 -0.49730566  0.05174963
   0.2668497   0.27391028]
 [ 0.10050306  0.43513173  0.375823    0.5652766   0.40925583 -0.03928828
   0.4901914   0.20637617]
 [-0.2319875  -0.21874283  0.12272807  0.33345345 -0.4563055   0.21609035
  -0.2410521   0.4736915 ]]

হ্যাশ করা বৈশিষ্ট্য কলাম

একটি বড় সংখ্যক মান সহ একটি শ্রেণীবদ্ধ কলাম উপস্থাপন করার আরেকটি উপায় হল একটি categorical_column_with_hash_bucket ব্যবহার করা। এই বৈশিষ্ট্য কলাম ইনপুট একটি হ্যাশ মান গণনা করে, তারপর একটি স্ট্রিং এনকোড করার জন্য hash_bucket_size একটি নির্বাচন করে৷ এই কলামটি ব্যবহার করার সময়, আপনাকে শব্দভাণ্ডার প্রদান করতে হবে না, এবং স্থান বাঁচাতে আপনি হ্যাশ_বাকেটের সংখ্যাকে প্রকৃত বিভাগের সংখ্যা থেকে উল্লেখযোগ্যভাবে ছোট করতে বেছে নিতে পারেন।

breed1_hashed = feature_column.categorical_column_with_hash_bucket(
      'Breed1', hash_bucket_size=10)
demo(feature_column.indicator_column(breed1_hashed))
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]

ক্রসড ফিচার কলাম

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

crossed_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=10)
demo(feature_column.indicator_column(crossed_feature))
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]

কোন কলামগুলি ব্যবহার করবেন তা চয়ন করুন৷

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

feature_columns = []

# numeric cols
for header in ['PhotoAmt', 'Fee', 'Age']:
  feature_columns.append(feature_column.numeric_column(header))
# bucketized cols
age = feature_column.numeric_column('Age')
age_buckets = feature_column.bucketized_column(age, boundaries=[1, 2, 3, 4, 5])
feature_columns.append(age_buckets)
# indicator_columns
indicator_column_names = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',
                          'FurLength', 'Vaccinated', 'Sterilized', 'Health']
for col_name in indicator_column_names:
  categorical_column = feature_column.categorical_column_with_vocabulary_list(
      col_name, dataframe[col_name].unique())
  indicator_column = feature_column.indicator_column(categorical_column)
  feature_columns.append(indicator_column)
# embedding columns
breed1 = feature_column.categorical_column_with_vocabulary_list(
      'Breed1', dataframe.Breed1.unique())
breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
feature_columns.append(breed1_embedding)
# crossed columns
age_type_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=100)
feature_columns.append(feature_column.indicator_column(age_type_feature))

একটি বৈশিষ্ট্য স্তর তৈরি করুন

এখন যেহেতু আমরা আমাদের বৈশিষ্ট্য কলামগুলিকে সংজ্ঞায়িত করেছি, আমরা তাদের কেরাস মডেলে ইনপুট করতে একটি ঘন বৈশিষ্ট্য স্তর ব্যবহার করব।

feature_layer = tf.keras.layers.DenseFeatures(feature_columns)

এর আগে, বৈশিষ্ট্য কলামগুলি কীভাবে কাজ করে তা প্রদর্শন করতে আমরা একটি ছোট ব্যাচের আকার ব্যবহার করতাম। আমরা একটি বড় ব্যাচের আকার সহ একটি নতুন ইনপুট পাইপলাইন তৈরি করি।

batch_size = 32
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)

মডেল তৈরি করুন, কম্পাইল করুন এবং প্রশিক্ষণ দিন

model = tf.keras.Sequential([
  feature_layer,
  layers.Dense(128, activation='relu'),
  layers.Dense(128, activation='relu'),
  layers.Dropout(.1),
  layers.Dense(1)
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_ds,
          validation_data=val_ds,
          epochs=10)
Epoch 1/10
WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs={'Type': <tf.Tensor 'IteratorGetNext:11' shape=(None,) dtype=string>, 'Age': <tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, 'Breed1': <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=string>, 'Gender': <tf.Tensor 'IteratorGetNext:6' shape=(None,) dtype=string>, 'Color1': <tf.Tensor 'IteratorGetNext:2' shape=(None,) dtype=string>, 'Color2': <tf.Tensor 'IteratorGetNext:3' shape=(None,) dtype=string>, 'MaturitySize': <tf.Tensor 'IteratorGetNext:8' shape=(None,) dtype=string>, 'FurLength': <tf.Tensor 'IteratorGetNext:5' shape=(None,) dtype=string>, 'Vaccinated': <tf.Tensor 'IteratorGetNext:12' shape=(None,) dtype=string>, 'Sterilized': <tf.Tensor 'IteratorGetNext:10' shape=(None,) dtype=string>, 'Health': <tf.Tensor 'IteratorGetNext:7' shape=(None,) dtype=string>, 'Fee': <tf.Tensor 'IteratorGetNext:4' shape=(None,) dtype=int64>, 'PhotoAmt': <tf.Tensor 'IteratorGetNext:9' shape=(None,) dtype=int64>}. Consider rewriting this model with the Functional API.
WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs={'Type': <tf.Tensor 'IteratorGetNext:11' shape=(None,) dtype=string>, 'Age': <tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, 'Breed1': <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=string>, 'Gender': <tf.Tensor 'IteratorGetNext:6' shape=(None,) dtype=string>, 'Color1': <tf.Tensor 'IteratorGetNext:2' shape=(None,) dtype=string>, 'Color2': <tf.Tensor 'IteratorGetNext:3' shape=(None,) dtype=string>, 'MaturitySize': <tf.Tensor 'IteratorGetNext:8' shape=(None,) dtype=string>, 'FurLength': <tf.Tensor 'IteratorGetNext:5' shape=(None,) dtype=string>, 'Vaccinated': <tf.Tensor 'IteratorGetNext:12' shape=(None,) dtype=string>, 'Sterilized': <tf.Tensor 'IteratorGetNext:10' shape=(None,) dtype=string>, 'Health': <tf.Tensor 'IteratorGetNext:7' shape=(None,) dtype=string>, 'Fee': <tf.Tensor 'IteratorGetNext:4' shape=(None,) dtype=int64>, 'PhotoAmt': <tf.Tensor 'IteratorGetNext:9' shape=(None,) dtype=int64>}. Consider rewriting this model with the Functional API.
231/231 [==============================] - ETA: 0s - loss: 0.6759 - accuracy: 0.6802WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs={'Type': <tf.Tensor 'IteratorGetNext:11' shape=(None,) dtype=string>, 'Age': <tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, 'Breed1': <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=string>, 'Gender': <tf.Tensor 'IteratorGetNext:6' shape=(None,) dtype=string>, 'Color1': <tf.Tensor 'IteratorGetNext:2' shape=(None,) dtype=string>, 'Color2': <tf.Tensor 'IteratorGetNext:3' shape=(None,) dtype=string>, 'MaturitySize': <tf.Tensor 'IteratorGetNext:8' shape=(None,) dtype=string>, 'FurLength': <tf.Tensor 'IteratorGetNext:5' shape=(None,) dtype=string>, 'Vaccinated': <tf.Tensor 'IteratorGetNext:12' shape=(None,) dtype=string>, 'Sterilized': <tf.Tensor 'IteratorGetNext:10' shape=(None,) dtype=string>, 'Health': <tf.Tensor 'IteratorGetNext:7' shape=(None,) dtype=string>, 'Fee': <tf.Tensor 'IteratorGetNext:4' shape=(None,) dtype=int64>, 'PhotoAmt': <tf.Tensor 'IteratorGetNext:9' shape=(None,) dtype=int64>}. Consider rewriting this model with the Functional API.
231/231 [==============================] - 4s 10ms/step - loss: 0.6759 - accuracy: 0.6802 - val_loss: 0.5361 - val_accuracy: 0.7351
Epoch 2/10
231/231 [==============================] - 2s 9ms/step - loss: 0.5742 - accuracy: 0.7054 - val_loss: 0.5178 - val_accuracy: 0.7411
Epoch 3/10
231/231 [==============================] - 2s 9ms/step - loss: 0.5369 - accuracy: 0.7231 - val_loss: 0.5031 - val_accuracy: 0.7438
Epoch 4/10
231/231 [==============================] - 2s 9ms/step - loss: 0.5161 - accuracy: 0.7214 - val_loss: 0.5115 - val_accuracy: 0.7259
Epoch 5/10
231/231 [==============================] - 2s 9ms/step - loss: 0.5034 - accuracy: 0.7296 - val_loss: 0.5173 - val_accuracy: 0.7237
Epoch 6/10
231/231 [==============================] - 2s 8ms/step - loss: 0.4983 - accuracy: 0.7301 - val_loss: 0.5153 - val_accuracy: 0.7254
Epoch 7/10
231/231 [==============================] - 2s 9ms/step - loss: 0.4912 - accuracy: 0.7412 - val_loss: 0.5258 - val_accuracy: 0.7010
Epoch 8/10
231/231 [==============================] - 2s 9ms/step - loss: 0.4890 - accuracy: 0.7360 - val_loss: 0.5066 - val_accuracy: 0.7221
Epoch 9/10
231/231 [==============================] - 2s 9ms/step - loss: 0.4824 - accuracy: 0.7443 - val_loss: 0.5091 - val_accuracy: 0.7481
Epoch 10/10
231/231 [==============================] - 2s 9ms/step - loss: 0.4758 - accuracy: 0.7466 - val_loss: 0.5159 - val_accuracy: 0.7492
<keras.callbacks.History at 0x7f06b52a1810>
loss, accuracy = model.evaluate(test_ds)
print("Accuracy", accuracy)
73/73 [==============================] - 0s 6ms/step - loss: 0.4812 - accuracy: 0.7543
Accuracy 0.7543327808380127

পরবর্তী পদক্ষেপ

স্ট্রাকচার্ড ডেটা শ্রেণীবদ্ধ করার বিষয়ে আরও জানার সবচেয়ে ভাল উপায় হল নিজে চেষ্টা করা। আমরা কাজ করার জন্য অন্য একটি ডেটাসেট খোঁজার পরামর্শ দিই, এবং উপরের মতো কোড ব্যবহার করে এটিকে শ্রেণিবদ্ধ করার জন্য একটি মডেলকে প্রশিক্ষণ দিন। নির্ভুলতা উন্নত করতে, আপনার মডেলে কোন বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করতে হবে এবং সেগুলি কীভাবে উপস্থাপন করা উচিত সে সম্পর্কে সাবধানে চিন্তা করুন।