টেনসরফ্লো দিয়ে একটি কম্পিউটার ভিশন মডেল তৈরি করুন

1. আপনি শুরু করার আগে

এই কোডল্যাবে, আপনি একটি কম্পিউটার ভিশন মডেল তৈরি করবেন যা টেনসরফ্লো দিয়ে পোশাকের আইটেম চিনতে পারে।

পূর্বশর্ত

  • পাইথন সম্পর্কে একটি কঠিন জ্ঞান
  • মৌলিক প্রোগ্রামিং দক্ষতা

আপনি কি শিখবেন

এই কোডল্যাবে, আপনি করবেন:

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

আপনি কি নির্মাণ করবেন

  • একটি নিউরাল নেটওয়ার্ক যা পোশাকের প্রবন্ধ শনাক্ত করে

আপনি কি প্রয়োজন হবে

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

অন্যথায়, আপনি প্রশিক্ষণ মডেলের জন্য যে প্রধান ভাষাটি ব্যবহার করবেন তা হল পাইথন, তাই আপনাকে এটি ইনস্টল করতে হবে। এটি ছাড়াও, আপনার টেনসরফ্লো এবং NumPy লাইব্রেরিও প্রয়োজন। আপনি এখানে TensorFlow সম্পর্কে আরও জানতে এবং ইনস্টল করতে পারেন। এখানে NumPy ইনস্টল করুন।

2. কোডিং শুরু করুন

প্রথমে এক্সিকিউটেবল Colab নোটবুকের মধ্য দিয়ে যান।

TensorFlow আমদানি করে শুরু করুন।

import tensorflow as tf
print(tf.__version__)

ফ্যাশন MNIST নামক একটি সাধারণ ডেটাসেট থেকে পোশাকের আইটেম চিনতে আপনি একটি নিউরাল নেটওয়ার্ককে প্রশিক্ষণ দেবেন। এটিতে 10টি বিভিন্ন বিভাগে 70,000টি পোশাক রয়েছে। পোশাকের প্রতিটি আইটেম একটি 28x28 গ্রেস্কেল চিত্রে রয়েছে। আপনি এখানে কিছু উদাহরণ দেখতে পারেন:

ডেটাসেটের সাথে যুক্ত লেবেলগুলি হল:

লেবেল

বর্ণনা

0

টি-শার্ট/টপ

1

ট্রাউজার

2

পুলওভার

3

পোষাক

4

কোট

5

চন্দন

6

শার্ট

7

স্নিকার

8

থলে

9

গোড়ালি বুট

ফ্যাশন MNIST ডেটা tf.keras.datasets API-তে উপলব্ধ। এটি এই মত লোড করুন:

mnist = tf.keras.datasets.fashion_mnist

সেই বস্তুতে load_data কল করা আপনাকে দুটি তালিকার দুটি সেট দেয়: প্রশিক্ষণের মান এবং পরীক্ষার মান, যা পোশাকের আইটেম এবং তাদের লেবেলগুলি দেখায় এমন গ্রাফিক্স উপস্থাপন করে।

(training_images, training_labels), (test_images, test_labels) = mnist.load_data()

সেই মানগুলো কেমন দেখায়? একটি প্রশিক্ষণ চিত্র এবং একটি প্রশিক্ষণ লেবেল প্রিন্ট করুন। আপনি অ্যারেতে বিভিন্ন সূচক নিয়ে পরীক্ষা করতে পারেন।

import matplotlib.pyplot as plt
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])

আইটেম 0 এর জন্য ডেটার মুদ্রণ এইরকম দেখায়:

আপনি লক্ষ্য করবেন যে সমস্ত মানগুলি 0 এবং 255 এর মধ্যে পূর্ণসংখ্যা। একটি নিউরাল নেটওয়ার্ককে প্রশিক্ষণ দেওয়ার সময়, 0 এবং 1 এর মধ্যে সমস্ত মানকে বিবেচনা করা সহজ, একটি প্রক্রিয়া যাকে বলা হয় স্বাভাবিককরণ । সৌভাগ্যবশত, পাইথন লুপ না করে এমন একটি তালিকাকে স্বাভাবিক করার একটি সহজ উপায় প্রদান করে।

training_images  = training_images / 255.0
test_images = test_images / 255.0

আপনি 42 দেখতে চাইতে পারেন, সূচক 0-এর থেকে একটি ভিন্ন বুট।

এখন, আপনি ভাবছেন কেন দুটি ডেটাসেট রয়েছে - প্রশিক্ষণ এবং পরীক্ষা।

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

3. মডেল ডিজাইন করুন

এবার মডেল ডিজাইন করুন। আপনার তিনটি স্তর থাকবে। একে একে সেগুলির মধ্য দিয়ে যান এবং বিভিন্ন ধরণের স্তর এবং প্রতিটির জন্য ব্যবহৃত পরামিতিগুলি অন্বেষণ করুন৷

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), 
                                    tf.keras.layers.Dense(128, activation=tf.nn.relu), 
                                    tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  • Sequential নিউরাল নেটওয়ার্কে স্তরগুলির একটি ক্রম সংজ্ঞায়িত করে।
  • Flatten একটি বর্গক্ষেত্র নেয় এবং এটিকে এক-মাত্রিক ভেক্টরে পরিণত করে।
  • Dense নিউরনের একটি স্তর যোগ করে।
  • Activation ফাংশনগুলি নিউরনের প্রতিটি স্তরকে কী করতে হবে তা বলে। অনেকগুলি বিকল্প আছে, কিন্তু এখন এইগুলি ব্যবহার করুন:
  • Relu কার্যকরভাবে বোঝায় যে যদি X 0 এর চেয়ে বড় হয় তবে X ফেরত দেয়, অন্যথায় 0 ফেরত দেয়। এটি শুধুমাত্র নেটওয়ার্কের পরবর্তী স্তরে 0 বা তার বেশি মান পাস করে।
  • Softmax মানগুলির একটি সেট নেয় এবং কার্যকরভাবে সবচেয়ে বড়টি বেছে নেয়। উদাহরণস্বরূপ, যদি শেষ স্তরের আউটপুট [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05] এর মতো দেখায়, তাহলে এটি আপনাকে সবচেয়ে বড় মানের জন্য বাছাই করা থেকে বাঁচায়- এটি [0, 0,0,0,1,0,0,0,0]।

4. মডেল কম্পাইল এবং প্রশিক্ষণ

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

একটি প্যারামিটার হিসাবে metrics= এর ব্যবহার লক্ষ্য করুন, যা টেনসরফ্লোকে পরিচিত উত্তরগুলির (লেবেলগুলির) বিপরীতে পূর্বাভাসিত ফলাফলগুলি পরীক্ষা করে প্রশিক্ষণের নির্ভুলতার বিষয়ে রিপোর্ট করতে দেয়।

model.compile(optimizer = tf.keras.optimizers.Adam(),
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5)

model.fit হলে, আপনি ক্ষতি এবং সঠিকতা দেখতে পাবেন:

Epoch 1/5
60000/60000 [=======] - 6s 101us/sample - loss: 0.4964 - acc: 0.8247
Epoch 2/5
60000/60000 [=======] - 5s 86us/sample - loss: 0.3720 - acc: 0.8656
Epoch 3/5
60000/60000 [=======] - 5s 85us/sample - loss: 0.3335 - acc: 0.8780
Epoch 4/5
60000/60000 [=======] - 6s 103us/sample - loss: 0.3134 - acc: 0.8844
Epoch 5/5
60000/60000 [=======] - 6s 94us/sample - loss: 0.2931 - acc: 0.8926

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

5. মডেল পরীক্ষা করুন

মডেলটি কীভাবে দেখেনি এমন ডেটাতে পারফর্ম করবে? সেজন্য আপনার পরীক্ষা সেট আছে। আপনি model.evaluate কল করুন এবং দুটি সেটে পাস করুন এবং এটি প্রতিটির জন্য ক্ষতির প্রতিবেদন করে। একবার চেষ্টা করে দেখো:

model.evaluate(test_images, test_labels)

এবং এখানে আউটপুট:

10000/10000 [=====] - 1s 56us/sample - loss: 0.3365 - acc: 0.8789
[0.33648381242752073, 0.8789]

এই উদাহরণটি .8789 এর নির্ভুলতা প্রদান করেছে, যার অর্থ এটি প্রায় 88% নির্ভুল। (আপনার সামান্য ভিন্ন মান থাকতে পারে।)

প্রত্যাশিত হিসাবে, মডেলটি অজানা ডেটার সাথে ততটা সঠিক নয় যতটা এটি প্রশিক্ষণপ্রাপ্ত ডেটার সাথে ছিল! আপনি TensorFlow সম্পর্কে আরও জানলে, আপনি এটি উন্নত করার উপায় খুঁজে পাবেন।

আরও অন্বেষণ করতে, পরবর্তী ধাপে অনুশীলনগুলি চেষ্টা করুন।

6. অন্বেষণ অনুশীলন

অনুশীলনী 1

এই প্রথম অনুশীলনের জন্য, নিম্নলিখিত কোডটি চালান:

classifications = model.predict(test_images)
print(classifications[0])

এটি প্রতিটি পরীক্ষার চিত্রের জন্য শ্রেণিবিন্যাসের একটি সেট তৈরি করে, তারপর শ্রেণীবিভাগের প্রথম এন্ট্রিটি প্রিন্ট করে। আপনি এটি চালানোর পরে আউটপুট সংখ্যার একটি তালিকা. কেন আপনি যে মনে করেন এবং যারা সংখ্যা প্রতিনিধিত্ব করে কি?

print(test_labels[0]) চালানোর চেষ্টা করুন এবং আপনি একটি 9 পাবেন। এটি কি আপনাকে বুঝতে সাহায্য করে কেন তালিকাটি এমন দেখাচ্ছে?

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

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

ব্যায়াম 2

আপনার মডেলের স্তরগুলি দেখুন। 512 নিউরনের সাথে ঘন স্তরের জন্য বিভিন্ন মান নিয়ে পরীক্ষা করুন।

আপনি ক্ষতি এবং প্রশিক্ষণ সময় জন্য বিভিন্ন ফলাফল কি পেতে? কেন আপনি যে ক্ষেত্রে মনে করেন?

উদাহরণস্বরূপ, যদি আপনি 1,024 নিউরনে বৃদ্ধি করেন তবে আপনাকে আরও গণনা করতে হবে, প্রক্রিয়াটি ধীর করে দিতে হবে। কিন্তু এই ক্ষেত্রে তারা একটি ভাল প্রভাব আছে কারণ মডেল আরো সঠিক। এর মানে এই নয় যে আরও সবসময় ভাল। আপনি খুব দ্রুত আয় হ্রাস করার আইনে আঘাত করতে পারেন।

ব্যায়াম 3

আপনি যদি Flatten() স্তরটি সরিয়ে দেন তাহলে কি হবে। কেন আপনি যে ক্ষেত্রে মনে করেন?

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

সমস্ত কোড লেখার পরিবর্তে, শুরুতে Flatten() স্তর যোগ করুন। অ্যারেগুলি পরে মডেলে লোড করা হলে, সেগুলি স্বয়ংক্রিয়ভাবে আপনার জন্য সমতল হয়ে যাবে৷

ব্যায়াম 4

চূড়ান্ত (আউটপুট) স্তর বিবেচনা করুন। কেন তাদের 10 আছে? আপনার যদি 10 এর চেয়ে আলাদা পরিমাণ থাকে তবে কী হবে?

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

ব্যায়াম 5

নেটওয়ার্কে অতিরিক্ত স্তরের প্রভাব বিবেচনা করুন। আপনি যদি 512 সহ একটি এবং 10 এর সাথে চূড়ান্ত স্তরটির মধ্যে আরেকটি স্তর যুক্ত করেন তবে কী হবে?

একটি উল্লেখযোগ্য প্রভাব নেই কারণ এটি তুলনামূলকভাবে সহজ ডেটা। অনেক বেশি জটিল ডেটার জন্য, অতিরিক্ত স্তরগুলি প্রায়ই প্রয়োজনীয়।

ব্যায়াম 6

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

আপনি কেন ভিন্ন ফলাফল পেতে মনে করেন? স্ট্যাক ওভারফ্লোতে এখানে একটি দুর্দান্ত উত্তর রয়েছে।

import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
#training_images=training_images/255.0
#test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5)
model.evaluate(test_images, test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])

7. কলব্যাকগুলি অন্বেষণ করুন৷

আগে, যখন আপনি অতিরিক্ত যুগের জন্য প্রশিক্ষণ নিয়েছিলেন, তখন আপনার একটি সমস্যা ছিল যেখানে আপনার ক্ষতি পরিবর্তিত হতে পারে। এটি করার জন্য প্রশিক্ষণের জন্য অপেক্ষা করতে আপনার কিছুটা সময় লাগতে পারে এবং আপনি হয়তো ভেবেছিলেন যে আপনি যদি 95% নির্ভুলতার মতো একটি পছন্দসই মূল্যে পৌঁছানোর পরে প্রশিক্ষণটি বন্ধ করতে পারেন তবে এটি ভাল হবে। আপনি যদি 3 যুগের পরে পৌঁছে যান তবে আরও অনেক যুগ শেষ হওয়ার অপেক্ষায় বসে থাকবেন কেন?

অন্য কোন প্রোগ্রামের মত, আপনি কলব্যাক আছে! তাদের কর্মে দেখুন:

import tensorflow as tf

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('accuracy')>0.95):
      print("\nReached 95% accuracy so cancelling training!")
      self.model.stop_training = True

callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])

8. অভিনন্দন

আপনি আপনার প্রথম কম্পিউটার ভিশন মডেল তৈরি করেছেন! আপনার কম্পিউটার ভিশন মডেলগুলিকে কীভাবে উন্নত করতে হয় তা শিখতে, বিল্ড কনভোলিউশনে এগিয়ে যান এবং পুলিং সম্পাদন করুন।