প্রথম মডেল – নিউরাল নেটওয়ার্ক

আজকে আমরা রিয়েল মডেল বানানো শিখব এবং একই সাথে শিখব কিভাবে মডেলটি ট্রেইন এবং টেস্ট করা যায়। এর জন্য প্রথমে আমাদের দরকার হবে ডেটা। এখান থেকে প্রথমে Cats vs Dogs ডেটাসেট ডাউনলোড করে নিন। এরপর প্রোজেক্ট ফোল্ডারে নতুন একটি ফোল্ডার তৈরী করে সেখানে আনজিপ করুন।

প্রথমে আমরা ইমেজ ডেটা গুলো রিড করে একটা এরে তে রাখব। একই সাথে আরেকটা এরে তে ঐ ইমেজটার ক্লাস(cat or dog) এর নামও রাখব। তবে এক্ষেত্রে আমরা বিড়ালের এর জন্য 0 এবং কুকুরের জন্য 1 রাখব।

প্রথমেই দরকারি লাইব্রেরি গুলো ইম্পোর্ট করে নেই।

import cv2
from matplotlib import pyplot as plt
from keras.models import *
from keras.layers import *
from keras.optimizers import Adam
import numpy as np
import os
from sklearn.model_selection import train_test_split

এখন আমরা df_x এরে এর মধ্যে ইমেজ ডেটা রাখব এবং df_y এর মধ্যে রাখব ক্লাস বা লেবেল। আর প্রতিটা ইমেজই একই সাইজের হতে হবে। যেহেতু ডাউনলোড করা ইমেজগুলোর সাইজ ভিন্ন ভিন্ন সেহেতু আমাদেরকে এগুলা রিসাইজ করে নিতে হবে। ইমেজের সাইজ বেশি বড় হলে মডেল বেশি টাইম নিবে ট্রেইন হতে। আবার বেশি ছোট হলে একুরেসিও কমে যাবে।

 df_x = [] #empty list to store image data
 df_y = [] #empty list to store animal type. 0 for cats and 1 for dogs
 train_path = './data/train' #path of the image data 
 files = os.listdir(train_path) #make a list of all images in the directory
 for file in files: #access every single image one by one
     animal = file.split('.')[0] #file name contains the animal name also, extract it
     if animal == 'cat':
         df_y.append(0) #0 for cats
     else:
         df_y.append(1) #1 for dogs
     img = cv2.imread(os.path.join(train_path,file)) #read the image
     img = cv2.resize(img,(64,64)) #resize it to 64,64. we will need same size for every images
     df_x.append(img) #add the image data(3d array) to the list
 df_x = np.asarray(df_x) #list to numpy array
 df_y = np.asarray(df_y) 
 print('processing done!')

লোড হয়ে গেলে এখন চলুন দেখি df_x এর বর্তমান অবস্থা।

উপরে লক্ষ্য করে দেখুন, df_x এর মধ্যে ২৫০০০ হাজার ইমেজ ডেটা আছে। আর সবগুলোই 64×64 সাইজের। এবার আমরা এই ইমেজগুলোকে ৩ ভাগে ভাগ করব। ৬০% থাকবে ট্রেইনের জন্য, ২০% ভেলিডেশনের জন্য আর বাকি ২০% টেস্টের জন্য। আর এগুলা আমরা র‍্যান্ডমলি বাছাই করব। র‍্যান্ডম ভাগ করার জন্য train_test_split ফাংশন ব্যবহার করব আমরা। কিন্তু সমস্যা হচ্ছে আমরা একসাথে শুধু মাত্র দুই ভাগেই ভাগ করতে পারবো। ৩ভাগে ভাগ করা সম্ভব না। সলিউশনও আছে। আমরা একবার না, দুইবার ভাগ করব। তাহলেই হয়ে গেল।

X_train, X_test, y_train, y_test = train_test_split(df_x, df_y, test_size=0.4)
X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, test_size=0.5)

কনফার্ম হওয়ার জন্য শেপ দেখতে পারেন।

আমরা ১৫০০০ ইমেজ দিয়ে ট্রেইন করব, ৫০০০ ইমেজ দিয়ে ভ্যালিডেট করব এবং বাকি ৫০০০ দিয়ে টেস্ট করব।

এবার চলুন আমাদের মডেল বানিয়ে ফেলি। আমরা শুধুমাত্র Dense লেয়ার দিয়ে টেস্ট করে দেখব।

 model = Sequential()
 model.add(Dense(32, input_shape=(64,64,3), activation='relu'))
 model.add(Dense(64,activation='relu'))
 model.add(Flatten())
 model.add(Dense(1, activation='sigmoid'))

একদমই সাধারণ মডেল। যার প্রথম ইনপুট লেয়ার সাইজ হচ্ছে (64,64,3), এটা ইমেজ সাইজের মত হতে হবে। আর প্রথম লেয়ারে রয়েছে ৩২টি নিউরন, এবং দ্বিতীয় লেয়ারে রয়েছে ৬৪টি নিউরন। সবশেষে আউটপুট লেয়ারে আছে মাত্র ১টি নিউরন। আপনার মনে প্রশ্ন আসতে পারে যে আমাদের ক্লাস আছে ২ টা তাহলে আউটপুট লেয়ারে মাত্র ১টি নিউরন কেন? আমরা এখানে বাইনারি ক্রসএনট্রপি লস ব্যবহার করবো এবং আমাদের আইডিয়া হল যে ঐ একটি নিউরনের আউটপুট যদি ০.৫ এর বেশি হয় তাহলে ১ ধরে নিব নাহলে ০। চলুন বাইনারি ক্রসএন্ট্রপি লস ব্যবহার করে আমাদের মডেল কম্পাইল করে ফেলি।

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

মেট্রিক এর মধ্য একুরেসি দেবার উদ্দেশ্য হলো, আমরা প্রতি ইপোকে লস এর পাশাপাশি ট্রেনিং একুরেসি এবং ভ্যালিডেশন একুরেসিও দেখব।

model.fit(X_train, y_train, epochs=30, batch_size=32, validation_data=(X_val,y_val))

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

ট্রেনিং শেষ হলে চলুন এবার আমরা আমাদের ৫০০০টেস্ট ইমেজ দিয়ে টেস্ট করে ফেলি আমাদের মডেল।

টেস্ট একুরেসি দেখুন ৫৩%। বলতে পারেন যে এর থেকে তো কয়েন দিয়ে টস করাই ভালো। হেডস পড়লে বিড়াল, টেইল পড়লে কুকুর। সেখানে ৫০% প্রোবাবিলিটি।

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


2 thoughts on “প্রথম মডেল – নিউরাল নেটওয়ার্ক”

  1. আশিক says:

    আমরা যদি কোন কুকুর বা বিড়ালের ছবি ইনপুট দিয়ে সেটাকে প্রিডিক্ট করতে বলি সেটা কিভাবে করা যাবে?

    1. admin says:

      @আশিক, উপরে দেখানো আছে কিভাবে একটি ছবিকে Numpy array তে কনভার্ট করবেন। সেভাবে কনভার্ট করার পরে আপনি জাস্ট আপনার মডেলের প্রেডিক্ট ফাংশন কল করবেন আর প্যারামিটার হিসেবে image array টা পাঠাবেন। বিস্তারিত এই পোস্টে পাবেনঃ
      https://bit.ly/3cE5z1j

Leave a Reply

Your email address will not be published. Required fields are marked *