সাহায্য Kaggle উপর TensorFlow সঙ্গে গ্রেট বেরিয়ার রিফ রক্ষা চ্যালেঞ্জ যোগদান

কাস্টম প্রশিক্ষণ: ওয়াকথ্রু

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

এই নির্দেশিকাটি ব্যবহার মেশিন লার্নিং প্রজাতি দ্বারা আইরিস ফুল শ্রেণীবিভক্ত করা। এটি TensorFlow ব্যবহার করে:

  1. একটি মডেল তৈরি করুন,
  2. উদাহরণ তথ্যের উপর এই মডেল প্রশিক্ষণ, এবং
  3. অজানা তথ্য সম্পর্কে ভবিষ্যদ্বাণী করতে মডেল ব্যবহার করুন.

টেনসরফ্লো প্রোগ্রামিং

এই নির্দেশিকা এই উচ্চ-স্তরের TensorFlow ধারণাগুলি ব্যবহার করে:

এই টিউটোরিয়ালটি অনেক TensorFlow প্রোগ্রামের মত গঠন করা হয়েছে:

  1. ডেটাসেট আমদানি এবং পার্স করুন।
  2. মডেলের ধরন নির্বাচন করুন।
  3. মডেলকে প্রশিক্ষণ দিন।
  4. মডেলের কার্যকারিতা মূল্যায়ন করুন।
  5. ভবিষ্যদ্বাণী করতে প্রশিক্ষিত মডেল ব্যবহার করুন.

সেটআপ প্রোগ্রাম

আমদানি কনফিগার করুন

TensorFlow এবং অন্যান্য প্রয়োজনীয় পাইথন মডিউল আমদানি করুন। ডিফল্টরূপে, TensorFlow ব্যবহার উৎসুক মৃত্যুদন্ড অবিলম্বে অপারেশন নির্ণয় করা কংক্রিট মান ফিরে পরিবর্তে একটি গণনীয় গ্রাফ যা পরে মৃত্যুদন্ড কার্যকর করা হয় তৈরি করা। আপনি যদি একটি REPL বা ব্যবহার করা হয় তাহলে python ইন্টারেক্টিভ কনসোল, এই পরিচিত মতানুযায়ী।

import os
import matplotlib.pyplot as plt
import tensorflow as tf
print("TensorFlow version: {}".format(tf.__version__))
print("Eager execution: {}".format(tf.executing_eagerly()))
TensorFlow version: 2.6.0
Eager execution: True

আইরিস শ্রেণীবিভাগ সমস্যা

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

আইরিস জেনাসে প্রায় 300টি প্রজাতি রয়েছে, তবে আমাদের প্রোগ্রামটি শুধুমাত্র নিম্নলিখিত তিনটিকে শ্রেণীবদ্ধ করবে:

  • আইরিস সেটোসা
  • আইরিস ভার্জিনিকা
  • আইরিস ভার্সিকলার
পাপড়ি জ্যামিতি তিনটি আইরিস প্রজাতির সাথে তুলনা করা হয়: আইরিস সেটোসা, আইরিস ভার্জিনিকা এবং আইরিস ভার্সিকলার
চিত্র 1. আইরিস setosa (দ্বারা Radomil , বাই-এসএ 3.0 সিসি), আইরিস versicolor , (দ্বারা Dlanglois , বাই-এসএ 3.0 সিসি), এবং আইরিস virginica (দ্বারা ফ্রাঙ্ক: Mayfield , বাই-এসএ 2.0 সিসি)।

সৌভাগ্যবসত, কেউ ইতিমধ্যেই সৃষ্টি করেছেন 120 আইরিস ফুলের ডেটা সেটটি বৃত্যংশ এবং পাপড়ি পরিমাপ সঙ্গে। এটি একটি ক্লাসিক ডেটাসেট যা শিক্ষানবিস মেশিন লার্নিং ক্লাসিফিকেশন সমস্যার জন্য জনপ্রিয়।

প্রশিক্ষণ ডেটাসেট আমদানি এবং পার্স করুন

ডেটাসেট ফাইলটি ডাউনলোড করুন এবং এটিকে একটি কাঠামোতে রূপান্তর করুন যা এই পাইথন প্রোগ্রাম দ্বারা ব্যবহার করা যেতে পারে।

ডেটাসেট ডাউনলোড করুন

প্রশিক্ষণ ডেটা সেটটি ব্যবহার ফাইল ডাউনলোড করুন tf.keras.utils.get_file ফাংশন। এটি ডাউনলোড করা ফাইলের ফাইল পাথ ফেরত দেয়:

train_dataset_url = "https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv"

train_dataset_fp = tf.keras.utils.get_file(fname=os.path.basename(train_dataset_url),
                                           origin=train_dataset_url)

print("Local copy of the dataset file: {}".format(train_dataset_fp))
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv
16384/2194 [================================================================================================================================================================================================================================] - 0s 0us/step
Local copy of the dataset file: /home/kbuilder/.keras/datasets/iris_training.csv

ডেটা পরিদর্শন করুন

এই সেটটি, iris_training.csv , একটি প্লেইন টেক্সট ফাইল সঞ্চয় ট্যাবুলার তথ্য কমা চিহ্ন দ্বারা বিভাজিত মানগুলি (CSV) হিসাবে ফরম্যাট করা হয়েছে। ব্যবহার করুন head -n5 প্রথম পাঁচ এন্ট্রি একটি উঁকি নিতে কমান্ড প্রয়োগ করুন:

head -n5 {train_dataset_fp}
120,4,setosa,versicolor,virginica
6.4,2.8,5.6,2.2,2
5.0,2.3,3.3,1.0,1
4.9,2.5,4.5,1.7,2
4.9,3.1,1.5,0.1,0

ডেটাসেটের এই দৃশ্য থেকে, নিম্নলিখিতগুলি লক্ষ্য করুন:

  1. প্রথম লাইনটি ডেটাসেট সম্পর্কে তথ্য ধারণকারী একটি শিরোনাম:
    • মোট 120টি উদাহরণ রয়েছে। প্রতিটি উদাহরণে চারটি বৈশিষ্ট্য এবং তিনটি সম্ভাব্য লেবেল নামের একটি রয়েছে৷
  2. পরবর্তী সারি ডেটা রেকর্ড, এক উদাহরণ প্রতি লাইনে, যেখানে:
    • প্রথম চার ক্ষেত্র বৈশিষ্ট্য : এই একটি উদাহরণ বৈশিষ্ট্য। এখানে, ক্ষেত্রগুলি ফুলের পরিমাপের প্রতিনিধিত্বকারী ফ্লোট সংখ্যা ধারণ করে।
    • শেষ কলামটি হয় ট্যাগ : এই মান আমরা ভবিষ্যদ্বাণী করা চাই। এই ডেটাসেটের জন্য, এটি 0, 1, বা 2 এর একটি পূর্ণসংখ্যা মান যা একটি ফুলের নামের সাথে মিলে যায়।

আসুন কোডে এটি লিখি:

# column order in CSV file
column_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']

feature_names = column_names[:-1]
label_name = column_names[-1]

print("Features: {}".format(feature_names))
print("Label: {}".format(label_name))
Features: ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
Label: species

প্রতিটি লেবেল স্ট্রিং নামের সাথে যুক্ত থাকে (উদাহরণস্বরূপ, "সেটোসা"), কিন্তু মেশিন লার্নিং সাধারণত সংখ্যাসূচক মানের উপর নির্ভর করে। লেবেল নম্বরগুলি একটি নামযুক্ত প্রতিনিধিত্বে ম্যাপ করা হয়, যেমন:

  • 0 : আইরিস setosa
  • 1 : আইরিস versicolor
  • 2 : আইরিস virginica

বৈশিষ্ট্য এবং লেবেল সম্পর্কে আরো তথ্যের জন্য, দেখুন মেশিন লার্নিং ক্র্যাশ কোর্সের এমএল পরিভাষা অধ্যায়

class_names = ['Iris setosa', 'Iris versicolor', 'Iris virginica']

একটি তৈরি করুন tf.data.Dataset

TensorFlow এর ডেটা সেটটি এপিআই হ্যান্ডলগুলি একটি মডেল মধ্যে লোড ডেটার জন্য অনেক সাধারণ ক্ষেত্রে। এটি একটি উচ্চ-স্তরের API ডেটা পড়ার জন্য এবং এটিকে প্রশিক্ষণের জন্য ব্যবহৃত ফর্মে রূপান্তরিত করার জন্য।

যেহেতু ডেটা সেটটি একটি CSV বিন্যস্ত টেক্সট ফাইল ব্যবহার tf.data.experimental.make_csv_dataset উপযুক্ত বিন্যাসে তথ্য বিশ্লেষণ করতে ফাংশন। এই ফাংশন প্রশিক্ষণ মডেলের জন্য ডেটা উত্পন্ন সাল থেকে, ডিফল্ট আচরণ ডেটা এলোমেলো হয় ( shuffle=True, shuffle_buffer_size=10000 ), এবং ডেটা সেটটি চিরতরে (পুনরাবৃত্তি num_epochs=None )। আমরা সেট batch_size পরামিতি:

batch_size = 32

train_dataset = tf.data.experimental.make_csv_dataset(
    train_dataset_fp,
    batch_size,
    column_names=column_names,
    label_name=label_name,
    num_epochs=1)

make_csv_dataset ফাংশন আয় একটি tf.data.Dataset এর (features, label) জোড়া, যেখানে features একটি অভিধান হল: {'feature_name': value}

এই Dataset বস্তু iterable হয়। আসুন বৈশিষ্ট্যগুলির একটি ব্যাচ দেখি:

features, labels = next(iter(train_dataset))

print(features)
OrderedDict([('sepal_length', <tf.Tensor: shape=(32,), dtype=float32, numpy=
array([4.6, 4.5, 7. , 4.9, 6.7, 5.4, 6.2, 5.9, 6.3, 6.4, 6.1, 5.3, 4.6,
       6.5, 5.1, 5.2, 5.6, 4.7, 5.2, 4.4, 4.9, 6.4, 6.8, 6.9, 4.8, 7.6,

       6. , 4.8, 5.4, 6.1, 5.1, 5.4], dtype=float32)>), ('sepal_width', <tf.Tensor: shape=(32,), dtype=float32, numpy=
array([3.1, 2.3, 3.2, 3. , 3. , 3.7, 2.2, 3. , 3.3, 2.8, 2.6, 3.7, 3.2,
       2.8, 3.8, 3.4, 2.9, 3.2, 2.7, 3. , 3.1, 3.2, 3.2, 3.2, 3.4, 3. ,
       2.2, 3. , 3.9, 2.8, 3.7, 3.4], dtype=float32)>), ('petal_length', <tf.Tensor: shape=(32,), dtype=float32, numpy=
array([1.5, 1.3, 4.7, 1.4, 5. , 1.5, 4.5, 5.1, 6. , 5.6, 5.6, 1.5, 1.4,
       4.6, 1.5, 1.4, 3.6, 1.3, 3.9, 1.3, 1.5, 4.5, 5.9, 5.7, 1.6, 6.6,
       5. , 1.4, 1.3, 4.7, 1.5, 1.5], dtype=float32)>), ('petal_width', <tf.Tensor: shape=(32,), dtype=float32, numpy=
array([0.2, 0.3, 1.4, 0.2, 1.7, 0.2, 1.5, 1.8, 2.5, 2.1, 1.4, 0.2, 0.2,
       1.5, 0.3, 0.2, 1.3, 0.2, 1.4, 0.2, 0.1, 1.5, 2.3, 2.3, 0.2, 2.1,
       1.5, 0.3, 0.4, 1.2, 0.4, 0.4], dtype=float32)>)])

লক্ষ্য করুন যে মত-বৈশিষ্ট্য একসঙ্গে দলবদ্ধ করা হয়, অথবা শ্রেণীবদ্ধ। প্রতিটি উদাহরণ সারির ক্ষেত্র সংশ্লিষ্ট বৈশিষ্ট্য অ্যারেতে যুক্ত করা হয়। পরিবর্তন batch_size এই বৈশিষ্ট্য অ্যারে সঞ্চিত উদাহরণ সংখ্যা সেট করতে।

আপনি ব্যাচ থেকে কয়েকটি বৈশিষ্ট্য প্লট করে কিছু ক্লাস্টার দেখতে শুরু করতে পারেন:

plt.scatter(features['petal_length'],
            features['sepal_length'],
            c=labels,
            cmap='viridis')

plt.xlabel("Petal length")
plt.ylabel("Sepal length")
plt.show()

png

: মডেল ভবন পদক্ষেপ প্রক্রিয়া সহজ করার জন্য, বৈশিষ্ট্য আকৃতি সঙ্গে একটি একক অ্যারের মধ্যে অভিধানে পুনঃপ্যাকেজ করার জন্য একটি ফাংশন তৈরি (batch_size, num_features)

এই ফাংশনটি ব্যবহার tf.stack পদ্ধতি যা tensors একটি তালিকা থেকে মান নেয় এবং নিদিষ্ট মাত্রা একটি সম্মিলিত টেন্সর তৈরি করে:

def pack_features_vector(features, labels):
  """Pack the features into a single array."""
  features = tf.stack(list(features.values()), axis=1)
  return features, labels

তারপর ব্যবহার tf.data.Dataset#map প্যাক করার পদ্ধতি features প্রতিটি (features,label) প্রশিক্ষণ ডেটা সেটটি মধ্যে যুগল:

train_dataset = train_dataset.map(pack_features_vector)

বৈশিষ্ট্য উপাদান Dataset এখন আকৃতি সঙ্গে অ্যারে (batch_size, num_features) । আসুন প্রথম কয়েকটি উদাহরণ দেখি:

features, labels = next(iter(train_dataset))

print(features[:5])
tf.Tensor(
[[6.7 3.1 4.4 1.4]
 [6.8 2.8 4.8 1.4]
 [5.  3.4 1.5 0.2]
 [7.4 2.8 6.1 1.9]
 [4.5 2.3 1.3 0.3]], shape=(5, 4), dtype=float32)

মডেলের ধরন নির্বাচন করুন

মডেল কেন?

একটি মডেল বৈশিষ্ট্য এবং ট্যাগ এর মধ্যে একটি সম্পর্ক রয়েছে। আইরিস শ্রেণীবিভাগের সমস্যার জন্য, মডেলটি সেপাল এবং পাপড়ির পরিমাপ এবং পূর্বাভাসিত আইরিস প্রজাতির মধ্যে সম্পর্ককে সংজ্ঞায়িত করে। কিছু সাধারণ মডেলকে বীজগণিতের কয়েকটি লাইন দিয়ে বর্ণনা করা যেতে পারে, কিন্তু জটিল মেশিন লার্নিং মডেলগুলিতে প্রচুর পরিমাণে পরামিতি থাকে যা সংক্ষিপ্ত করা কঠিন।

আপনি মেশিন লার্নিং ব্যবহার না করেই চার বৈশিষ্ট্য এবং আইরিস প্রজাতির মধ্যে সম্পর্ক নির্ধারণ করতে পারে? যে, আপনি একটি মডেল তৈরি করতে ঐতিহ্যগত প্রোগ্রামিং কৌশল (উদাহরণস্বরূপ, অনেক শর্তসাপেক্ষ বিবৃতি) ব্যবহার করতে পারেন? সম্ভবত—যদি আপনি একটি নির্দিষ্ট প্রজাতির পাপড়ি এবং সিপাল পরিমাপের মধ্যে সম্পর্ক নির্ধারণের জন্য যথেষ্ট দীর্ঘ ডেটাসেট বিশ্লেষণ করেন। এবং এটি আরও জটিল ডেটাসেটে কঠিন-হয়ত অসম্ভব হয়ে ওঠে। একটি ভাল মেশিন লার্নিং পদ্ধতির তোমার জন্য মডেল নির্ধারণ করে। আপনি যদি সঠিক মেশিন লার্নিং মডেল টাইপের মধ্যে যথেষ্ট প্রতিনিধি উদাহরণ প্রদান করেন, তাহলে প্রোগ্রামটি আপনার জন্য সম্পর্ক খুঁজে বের করবে।

মডেল নির্বাচন করুন

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

নেটওয়ার্ক আর্কিটেকচারের একটি চিত্র: ইনপুট, 2টি লুকানো স্তর এবং আউটপুট
চিত্র 2. একটি বৈশিষ্ট্য, লুকানো স্তর এবং পূর্বানুমান সহ স্নায়ুর নেটওয়ার্ক।

যখন চিত্র 2 থেকে মডেলটিকে প্রশিক্ষণ দেওয়া হয় এবং একটি লেবেলবিহীন উদাহরণ খাওয়ানো হয়, তখন এটি তিনটি ভবিষ্যদ্বাণী দেয়: সম্ভাবনা যে এই ফুলটি প্রদত্ত আইরিস প্রজাতি। এই ভবিষ্যদ্বাণী বলা হয় অনুমান । এই উদাহরণের জন্য, আউটপুট পূর্বাভাসের যোগফল হল 1.0। চিত্র 2, যেমন নিচে এই ভবিষ্যদ্বাণী বিরতি: 0.02 আইরিস setosa জন্য, 0.95 আইরিস versicolor জন্য, এবং 0.03 আইরিস virginica জন্য। এর অর্থ এই যে মডেল অনুমান-সঙ্গে 95% সম্ভাবনা যে লেবেল নেই উদাহরণস্বরূপ ফুল একটি আইরিস versicolor হয়।

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

TensorFlow tf.keras এপিআই পছন্দের পথ মডেল এবং স্তর তৈরি করা। এটি মডেল তৈরি করা এবং পরীক্ষা করা সহজ করে তোলে যখন কেরাস সবকিছু একসাথে সংযুক্ত করার জটিলতা পরিচালনা করে।

tf.keras.Sequential মডেল স্তর একটি রৈখিক স্ট্যাক হয়। তার কন্সট্রাকটর এই ক্ষেত্রে, স্তর দৃষ্টান্ত একটি তালিকা লাগে দুই tf.keras.layers.Dense 10 নোড প্রতিটি স্তরগুলির, এবং আমাদের ট্যাগ ভবিষ্যৎবাণী প্রতিনিধিত্বমূলক 3 নোড সঙ্গে একটি আউটপুট স্তর। প্রথম লেয়ারটির input_shape ডেটা সেটটি থেকে বৈশিষ্ট্যগুলি সংখ্যা প্যারামিটার অনুরূপ, এবং প্রয়োজনীয় হয়:

model = tf.keras.Sequential([
  tf.keras.layers.Dense(10, activation=tf.nn.relu, input_shape=(4,)),  # input shape required
  tf.keras.layers.Dense(10, activation=tf.nn.relu),
  tf.keras.layers.Dense(3)
])

সক্রিয়করণ ফাংশন স্তরে প্রতিটি নোডের আউটপুট আকৃতি নির্ধারণ করে। এই অ-রৈখিকতাগুলি গুরুত্বপূর্ণ—এগুলি ছাড়া মডেলটি একটি একক স্তরের সমতুল্য হবে৷ অনেক আছে tf.keras.activations কিন্তু ReLU গোপন স্তরগুলির জন্য সাধারণ।

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

মডেল ব্যবহার করে

আসুন এই মডেলটি বৈশিষ্ট্যগুলির একটি ব্যাচের সাথে কী করে তা দ্রুত দেখে নেওয়া যাক:

predictions = model(features)
predictions[:5]
<tf.Tensor: shape=(5, 3), dtype=float32, numpy=
array([[3.3970695 , 2.5164433 , 1.6042098 ],
       [3.5879614 , 2.7150419 , 1.7798408 ],
       [2.0230737 , 1.2138845 , 0.5435198 ],
       [4.1191735 , 3.1622481 , 2.1603928 ],
       [1.965474  , 1.2190092 , 0.54945964]], dtype=float32)>

এখানে, প্রতিটি উদাহরণ হচ্ছে ফেরৎ logit প্রতিটি বর্গ জন্য।

প্রতিটি ক্লাসের জন্য একটি সম্ভাব্যতা এইসব logits রূপান্তর করতে, softmax ফাংশন:

tf.nn.softmax(predictions[:5])
<tf.Tensor: shape=(5, 3), dtype=float32, numpy=
array([[0.6325084 , 0.26218945, 0.10530216],
       [0.6322343 , 0.26410332, 0.10366239],
       [0.5977436 , 0.26612675, 0.13612968],
       [0.6556937 , 0.25183356, 0.09247267],
       [0.5825066 , 0.27613106, 0.1413623 ]], dtype=float32)>

টেকিং tf.argmax শ্রেণীর জুড়ে আমাদের পূর্বাভাস বর্গ সূচক দেয়। কিন্তু, মডেলটি এখনও প্রশিক্ষিত হয়নি, তাই এগুলি ভাল ভবিষ্যদ্বাণী নয়:

print("Prediction: {}".format(tf.argmax(predictions, axis=1)))
print("    Labels: {}".format(labels))
Prediction: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    Labels: [1 1 0 2 0 2 2 0 2 2 1 1 0 2 0 2 2 2 0 0 0 0 0 2 1 2 0 1 0 1 1 1]

মডেলকে প্রশিক্ষণ দিন

প্রশিক্ষণ মেশিন লার্নিং মঞ্চ যখন মডেল ধীরে ধীরে অপ্টিমাইজ করা হয়, অথবা মডেল ডেটা সেটটি learns। লক্ষ্য হল অদেখা ডেটা সম্পর্কে ভবিষ্যদ্বাণী করার জন্য প্রশিক্ষণ ডেটাসেটের কাঠামো সম্পর্কে পর্যাপ্ত জ্ঞান অর্জন করা। আপনি যদি খুব বেশী প্রশিক্ষণ ডেটা সেটটি সম্পর্কে জানতে, তাহলে ভবিষ্যৎবাণী শুধুমাত্র ডেটা দেখেনি জন্য কাজ এবং generalizable হবে না। এই সমস্যা বলা হয় overfitting -এটা এর উত্তর memorizing পরিবর্তে কিভাবে সমস্যা সমাধানের জন্য বুঝতে পারে।

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

ক্ষতি এবং গ্রেডিয়েন্ট ফাংশন সংজ্ঞায়িত করুন

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

আমাদের মডেল তার ক্ষতি ব্যবহার নিরূপণ করবে tf.keras.losses.SparseCategoricalCrossentropy ফাংশন যা মডেলের বর্গ সম্ভাব্যতা ভবিষ্যৎবাণী আর কাঙ্খিত ট্যাগ লাগে, এবং উদাহরণ জুড়ে গড় ক্ষতির ফেরৎ।

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
def loss(model, x, y, training):
  # training=training is needed only if there are layers with different
  # behavior during training versus inference (e.g. Dropout).
  y_ = model(x, training=training)

  return loss_object(y_true=y, y_pred=y_)


l = loss(model, features, labels, training=False)
print("Loss test: {}".format(l))
Loss test: 1.3074543476104736

ব্যবহার করুন tf.GradientTape নিরূপণ করা প্রসঙ্গ গ্রেডিয়েন্ট আপনার মডেল নিখুত ব্যবহৃত:

def grad(model, inputs, targets):
  with tf.GradientTape() as tape:
    loss_value = loss(model, inputs, targets, training=True)
  return loss_value, tape.gradient(loss_value, model.trainable_variables)

একটি অপ্টিমাইজার তৈরি করুন

একটি অপটিমাইজার কমান মডেলের ভেরিয়েবল নির্ণিত গ্রেডিয়েন্ট প্রযোজ্য loss ফাংশন। আপনি ক্ষতি ফাংশনটিকে একটি বাঁকা পৃষ্ঠ হিসাবে ভাবতে পারেন (চিত্র 3 দেখুন) এবং আমরা চারপাশে হেঁটে এর সর্বনিম্ন বিন্দু খুঁজে পেতে চাই। গ্রেডিয়েন্টগুলি খাড়া চড়ার দিকে নির্দেশ করে—তাই আমরা বিপরীত পথে যাত্রা করব এবং পাহাড়ের নিচে চলে যাব। পুনরাবৃত্তিমূলকভাবে প্রতিটি ব্যাচের জন্য ক্ষতি এবং গ্রেডিয়েন্ট গণনা করে, আমরা প্রশিক্ষণের সময় মডেলটি সামঞ্জস্য করব। ধীরে ধীরে, মডেলটি ক্ষতি কমাতে ওজন এবং পক্ষপাতের সর্বোত্তম সমন্বয় খুঁজে পাবে। এবং ক্ষতি যত কম হবে, মডেলের ভবিষ্যদ্বাণী তত ভাল হবে।

অপ্টিমাইজেশান অ্যালগরিদমগুলি 3D স্পেসে সময়ের সাথে সাথে কল্পনা করা হয়েছে৷
চিত্র 3. অপ্টিমাইজেশান আলগোরিদিম 3D স্থান সময়ের ভিজ্যুয়ালাইজ।
(সূত্র: স্ট্যানফোর্ড বর্গ CS231n এমআইটি লাইসেন্স, ভাবমূর্তি ক্রেডিট: অ্যালেক Radford )

টেনসরফ্লো-তে প্রশিক্ষণের জন্য অনেক অপ্টিমাইজেশান অ্যালগরিদম উপলব্ধ রয়েছে। এই মডেল ব্যবহার tf.keras.optimizers.SGD যে কার্যকরী সম্ভাব্যতার সূত্রাবলি গ্রেডিয়েন্ট বংশদ্ভুত (SGD) অ্যালগরিদম। learning_rate পাহাড় নিচে প্রতিটি পুনরাবৃত্তির জন্য নেওয়া ধাপে আকার সেট করে। এই hyperparameter আপনি সাধারণভাবে ভালো ফলাফল অর্জন করার জন্য সমন্বয় পাবেন।

আসুন অপ্টিমাইজার সেটআপ করি:

optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)

আমরা একটি একক অপ্টিমাইজেশান ধাপ গণনা করতে এটি ব্যবহার করব:

loss_value, grads = grad(model, features, labels)

print("Step: {}, Initial Loss: {}".format(optimizer.iterations.numpy(),
                                          loss_value.numpy()))

optimizer.apply_gradients(zip(grads, model.trainable_variables))

print("Step: {},         Loss: {}".format(optimizer.iterations.numpy(),
                                          loss(model, features, labels, training=True).numpy()))
Step: 0, Initial Loss: 1.3074543476104736
Step: 1,         Loss: 1.2451764345169067

প্রশিক্ষণ লুপ

জায়গায় সব টুকরা সঙ্গে, মডেল প্রশিক্ষণের জন্য প্রস্তুত! একটি প্রশিক্ষণ লুপ মডেলটিতে ডেটাসেট উদাহরণগুলিকে ফিড করে যাতে এটি আরও ভাল ভবিষ্যদ্বাণী করতে সহায়তা করে। নিম্নলিখিত কোড ব্লক এই প্রশিক্ষণ পদক্ষেপ সেট আপ করে:

  1. প্রতিটি যুগে বারবার। একটি যুগ হল ডেটাসেটের মধ্য দিয়ে এক পাস।
  2. যুগান্তকারী মধ্যেই বারবার প্রশিক্ষণ প্রতিটি উদাহরণ ওভার Dataset তার বৈশিষ্ট্য (দখল x ) এবং লেবেল ( y )।
  3. উদাহরণের বৈশিষ্ট্যগুলি ব্যবহার করে, একটি ভবিষ্যদ্বাণী করুন এবং এটি লেবেলের সাথে তুলনা করুন। ভবিষ্যদ্বাণীর ভুলতা পরিমাপ করুন এবং মডেলের ক্ষতি এবং গ্রেডিয়েন্ট গণনা করতে এটি ব্যবহার করুন।
  4. একটি ব্যবহার করুন optimizer মডেলের ভেরিয়েবল আপডেট করার জন্য।
  5. ভিজ্যুয়ালাইজেশন জন্য কিছু পরিসংখ্যান ট্র্যাক রাখুন.
  6. প্রতিটি যুগের জন্য পুনরাবৃত্তি করুন।

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

## Note: Rerunning this cell uses the same model variables

# Keep results for plotting
train_loss_results = []
train_accuracy_results = []

num_epochs = 201

for epoch in range(num_epochs):
  epoch_loss_avg = tf.keras.metrics.Mean()
  epoch_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()

  # Training loop - using batches of 32
  for x, y in train_dataset:
    # Optimize the model
    loss_value, grads = grad(model, x, y)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))

    # Track progress
    epoch_loss_avg.update_state(loss_value)  # Add current batch loss
    # Compare predicted label to actual label
    # training=True is needed only if there are layers with different
    # behavior during training versus inference (e.g. Dropout).
    epoch_accuracy.update_state(y, model(x, training=True))

  # End epoch
  train_loss_results.append(epoch_loss_avg.result())
  train_accuracy_results.append(epoch_accuracy.result())

  if epoch % 50 == 0:
    print("Epoch {:03d}: Loss: {:.3f}, Accuracy: {:.3%}".format(epoch,
                                                                epoch_loss_avg.result(),
                                                                epoch_accuracy.result()))
Epoch 000: Loss: 1.195, Accuracy: 35.000%
Epoch 050: Loss: 0.462, Accuracy: 86.667%
Epoch 100: Loss: 0.287, Accuracy: 93.333%
Epoch 150: Loss: 0.193, Accuracy: 98.333%
Epoch 200: Loss: 0.158, Accuracy: 97.500%

সময়ের সাথে ক্ষতির ফাংশনটি কল্পনা করুন

যদিও এটা মডেলের প্রশিক্ষণ উন্নতি প্রিন্ট আউট করতে সহায়ক, এটি প্রায়ই এই অগ্রগতি দেখতে আরো সহায়ক হবে। TensorBoard একটা চমৎকার কল্পনা সরঞ্জাম যা TensorFlow সঙ্গে প্যাকেজ হয়, কিন্তু আমরা ব্যবহার মৌলিক চার্ট তৈরি করতে পারেন matplotlib মডিউল।

এই চার্ট ব্যাখ্যা করতে অভিজ্ঞতা নেয়, কিন্তু আপনি কি সত্যিই ক্ষতির নামা দেখতে চাই এবং নির্ভুলতার আপ যান:

fig, axes = plt.subplots(2, sharex=True, figsize=(12, 8))
fig.suptitle('Training Metrics')

axes[0].set_ylabel("Loss", fontsize=14)
axes[0].plot(train_loss_results)

axes[1].set_ylabel("Accuracy", fontsize=14)
axes[1].set_xlabel("Epoch", fontsize=14)
axes[1].plot(train_accuracy_results)
plt.show()

png

মডেলের কার্যকারিতা মূল্যায়ন করুন

এখন যেহেতু মডেলটি প্রশিক্ষিত, আমরা এর কার্যকারিতার কিছু পরিসংখ্যান পেতে পারি।

নির্ণয় কিভাবে কার্যকরভাবে মডেল ভবিষ্যৎবাণী তোলে মানে মূল্যায়ন। আইরিস শ্রেণীবিভাগে মডেলের কার্যকারিতা নির্ধারণ করতে, মডেলকে কিছু সিপাল এবং পাপড়ি পরিমাপ দিন এবং মডেলকে ভবিষ্যদ্বাণী করতে বলুন যে তারা কোন আইরিস প্রজাতির প্রতিনিধিত্ব করে। তারপর প্রকৃত লেবেলের বিপরীতে মডেলের ভবিষ্যদ্বাণীর তুলনা করুন। উদাহরণস্বরূপ, একটি মডেল অর্ধেক ইনপুট উদাহরণ সঠিক প্রজাতি বাছাই করা যে হয়েছে সঠিকতা এর 0.5 । চিত্র 4 একটি সামান্য বেশি কার্যকরী মডেল দেখায়, 80% নির্ভুলতায় 5টির মধ্যে 4টি ভবিষ্যদ্বাণী সঠিক হয়েছে:

উদাহরণ বৈশিষ্ট্য লেবেল মডেল ভবিষ্যদ্বাণী
৫.৯ 3.0 4.3 1.5 1 1
৬.৯ 3.1 5.4 2.1 2 2
5.1 3.3 1.7 0.5 0 0
6.0 3.4 4.5 1.6 1 2
5.5 2.5 4.0 1.3 1 1
চিত্র 4. একটি আইরিস ক্লাসিফায়ার যে 80% সঠিক।

পরীক্ষার ডেটাসেট সেটআপ করুন

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

পরীক্ষার জন্য সেটআপ Dataset প্রশিক্ষণ জন্য সেটআপ অনুরূপ Dataset । CSV পাঠ্য ফাইলটি ডাউনলোড করুন এবং সেই মানগুলিকে পার্স করুন, তারপরে এটিকে একটু এলোমেলো করুন:

test_url = "https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv"

test_fp = tf.keras.utils.get_file(fname=os.path.basename(test_url),
                                  origin=test_url)
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv
16384/573 [=========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================] - 0s 0us/step
test_dataset = tf.data.experimental.make_csv_dataset(
    test_fp,
    batch_size,
    column_names=column_names,
    label_name='species',
    num_epochs=1,
    shuffle=False)

test_dataset = test_dataset.map(pack_features_vector)

পরীক্ষার ডেটাসেটে মডেলটি মূল্যায়ন করুন

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

test_accuracy = tf.keras.metrics.Accuracy()

for (x, y) in test_dataset:
  # training=False is needed only if there are layers with different
  # behavior during training versus inference (e.g. Dropout).
  logits = model(x, training=False)
  prediction = tf.argmax(logits, axis=1, output_type=tf.int32)
  test_accuracy(prediction, y)

print("Test set accuracy: {:.3%}".format(test_accuracy.result()))
Test set accuracy: 100.000%

আমরা শেষ ব্যাচে দেখতে পারি, উদাহরণস্বরূপ, মডেলটি সাধারণত সঠিক:

tf.stack([y,prediction],axis=1)
<tf.Tensor: shape=(30, 2), dtype=int32, numpy=
array([[1, 1],
       [2, 2],
       [0, 0],
       [1, 1],
       [1, 1],
       [1, 1],
       [0, 0],
       [2, 2],
       [1, 1],
       [2, 2],
       [2, 2],
       [0, 0],
       [2, 2],
       [1, 1],
       [1, 1],
       [0, 0],
       [1, 1],
       [0, 0],
       [0, 0],
       [2, 2],
       [0, 0],
       [1, 1],
       [2, 2],
       [1, 1],
       [1, 1],
       [1, 1],
       [0, 0],
       [1, 1],
       [2, 2],
       [1, 1]], dtype=int32)>

ভবিষ্যদ্বাণী করতে প্রশিক্ষিত মডেল ব্যবহার করুন

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

বাস্তব জীবনে, লেবেলবিহীন উদাহরণগুলি অ্যাপ, CSV ফাইল এবং ডেটা ফিড সহ অনেকগুলি বিভিন্ন উত্স থেকে আসতে পারে৷ আপাতত, আমরা তাদের লেবেলগুলির পূর্বাভাস দিতে ম্যানুয়ালি তিনটি লেবেলবিহীন উদাহরণ প্রদান করতে যাচ্ছি। স্মরণ করুন, লেবেল নম্বরগুলি একটি নামযুক্ত প্রতিনিধিত্বের সাথে ম্যাপ করা হয়েছে:

  • 0 : আইরিস setosa
  • 1 : আইরিস versicolor
  • 2 : আইরিস virginica
predict_dataset = tf.convert_to_tensor([
    [5.1, 3.3, 1.7, 0.5,],
    [5.9, 3.0, 4.2, 1.5,],
    [6.9, 3.1, 5.4, 2.1]
])

# training=False is needed only if there are layers with different
# behavior during training versus inference (e.g. Dropout).
predictions = model(predict_dataset, training=False)

for i, logits in enumerate(predictions):
  class_idx = tf.argmax(logits).numpy()
  p = tf.nn.softmax(logits)[class_idx]
  name = class_names[class_idx]
  print("Example {} prediction: {} ({:4.1f}%)".format(i, name, 100*p))
Example 0 prediction: Iris setosa (97.6%)
Example 1 prediction: Iris versicolor (90.4%)
Example 2 prediction: Iris virginica (63.3%)