টেনসরফ্লো ব্যবহার করে নিউরাল নেটওয়ার্ক ট্রেনিং এবং প্রিডিকশন

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

যদিও সেলসিয়াসের ভ্যালু জানলে আমরা ফারেনহাইটের ভ্যালু নিচের সমীকরণের মাধ্যমে ব্যবহার করতে পারি।

𝑓=𝑐×1.8+32

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

আমরা যেহেতু টেনসরফ্লো ব্যববার করব, তাই আমাদের টেনসরফ্লো ইম্পোর্ট করে নিতে হবে। সাথে লাগবে Numpy। সম্পূর্ণ প্রোগ্রামটি দেখা এবং রান করা যাবে গুগল কো-ল্যাবে। এছাড়া  নিজের কম্পিউটারেও টেনসরফ্লো ব্যবহার করে কাজ করা যাবে। তা সম্পর্কে বিস্তারিত জানা যাবে টেনসরফ্লো / TensorFlow – মেশিন লার্নিং লাইব্রেরী ইন্সটলেশন এবং ব্যবহার লেখা থেকে। টার্ম গুলো নতুন মনে হলে নিচের লেখা দুইটি পড়ে দেখতে পারেনঃ

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

import tensorflow as tf
import numpy as np

নিচের ডেটা গুলো দিয়ে আমাদের মডেল ট্রেইন করবঃ

# training data 
celsius    = np.array([-40, -10,  0,  8, 15, 22,  38],  dtype=float)
fahrenheit = np.array([-40,  14, 32, 46.4, 59, 71.6, 100.4],  dtype=float)

মডেল তৈরিঃ

আমাদের সমস্যাটা খুবি সিম্পল। তাই একটা লেয়ার এবং একটা নিউরন দিয়েই সমাধান করতে পারব। লেয়ারঃ

l0 = tf.keras.layers.Dense(units=1, input_shape=[1])

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

units মানে হচ্ছে কয়টা নিউরন থাকবে আমাদের লেয়ারে। আমাদের একটি নিউরন হলেই হবে, তাই আমরা units=1 দিয়েছি। যত গুলো নিউরন থাকবে, লেয়ারটি তত বেশি ভ্যারিয়েবল ব্যবহার করবে সমস্যা সমাধানের জন্য।

input_shape হচ্ছে ইনপুট হিসেবে আমরা কয়টা ভ্যালু দিব। যেহেতু আমরা ইনপুট হিসেবে একটি ভ্যালু দিচ্ছি, তাই আমরা ব্যবহার করেছি input_shape=[1]।

লেয়ারটি মডেলে যুক্ত করাঃ

model = tf.keras.Sequential([l0])

লেয়ার তৈরি এবং মডেলে যুক্ত করা এক স্টেপেই করতে পারি এভাবেঃ

# model creation
model = tf.keras.Sequential([
tf.keras.layers.Dense(units=1, input_shape=[1])
])

মডেল কম্পাইলেশনঃ

model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.Adam(0.1))

এখানে Loss function হিসেবে mean_squared_error ব্যবহার করা হয়েছে। প্রিডিকশন এবং কাঙ্ক্ষিত ফলাফলের দূরত্ব/পার্থক্য এই লস ফাংশন দিয়ে বের করা হয়।
Optimizer function হিসেবে ব্যবহার করা হয়েছে Adam Optimiser। এর কাজ হচ্ছে লস কমানোর জন্য লেয়ারের ইন্টারনাল ভ্যালু গুলো পরিবর্তন করা।
মডেল ট্রেইনিং এর সময় লস ক্যালকুলেট করে এরপর মডেলটি ইম্প্রুভ করার চেষ্টা করবে। আর ট্রেনিং এর কাজই হচ্ছে এটা। প্রতিটা ধাপে ইম্প্রুভ করা।

মডেল ট্রেইন করাঃ

model.fit(celsius, fahrenheit, epochs=500, verbose=False)

মডেল ট্রেইন করার জন্য আমরা ট্রেনিং ডেটা দিয়েছি। এখানে epochs হচ্ছে ট্রেইনিং ডেটার উপর কতবার ইটারেট করবে। আমরা ৫০০ বার ইটারেট করছি। আমাদের মোট ডেটা সেট রয়েছে ৭টি। তাহলে সঠিক ভ্যালু পাওয়ার জন্য টোটাল 7*500 = 3500 বার মডেলটি নিজেকে ইম্প্রুভ করার চেষ্টা করবে। verbose=False দিয়ে ট্রেইনিং এর ইনফমেশন গুলো না দেখানোর জন্য বলছি। এটা তুলে দিলে আমরা প্রতিটা স্টেপে লস এবং কত সময় লেগেছে ট্রেইং এ, তা দেখতে পাবো।

প্রিডিকশনঃ

এবার আমরা দেখব আমাদের মডেল সেলসিয়াল ভ্যালুর জন্য ফারেনহাইট ভ্যালু কত দেয়।

print(model.predict(np.array([100.0])))

আউটপুট পাবো 211.58559  এর মত। যেখানে ফারেনহাইট থেকে সেলসিয়াস বের করার সূত্র হচ্ছেঃ 𝑓=𝑐×1.8+32। তাহলে 100 এর জন্য ফারেনহাইট ভ্যালু হবেঃ 100×1.8+32 = 212। অনেকটাই কাছাকাছি।

সম্পূর্ণ প্রোগ্রামঃ

import tensorflow as tf
import numpy as np
 
# training data 
celsius    = np.array([-40, -10,  0,  8, 15, 22,  38],  dtype=float)
fahrenheit = np.array([-40,  14, 32, 46.4, 59, 71.6, 100.4],  dtype=float)
 
 
# model creation
l0 = tf.keras.layers.Dense(units=1, input_shape=[1])
model = tf.keras.Sequential([l0])
 
# model compilation 
model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.Adam(0.1))
# model training 
model.fit(celsius, fahrenheit, epochs=500, verbose=False)
print("Finished training the model")
 
# predict
print(model.predict(np.array([100.0])))

একই লাইনে যদি লেয়ার তৈরি এবং মডেলে লেয়ার যুক্ত করি, তাহলে এভাবে লিখতে পারি উপরের প্রোগ্রামঃ

import tensorflow as tf
import numpy as np
 
# training data
celsius = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float)
fahrenheit = np.array([-40, 14, 32, 46.4, 59, 71.6, 100.4], dtype=float)
 
# model creation
model = keras.Sequential([
layers.Dense(units=1, input_shape=[1])
])
 
# model compilation
model.compile(loss='mean_squared_error',
optimizer=tf.keras.optimizers.Adam(0.1))
# model training
model.fit(celsius, fahrenheit, epochs=500, verbose=False)
print("Finished training the model")
 
# predict
print(model.predict(np.array([100.0])))

উভয় মডেল একই রেজাল্ট দিবে। [[211.58005]] এর কাছাকাছি কোন রেজাল্ট পাবো। এখনের প্রোগ্রামটি অনেক সিম্পল। কিন্তু যে কোন কমপ্লিকেটেড প্রোগ্রামে ঠিক এই স্টেপ গুলোই থাকবে। ডেটা অনেক বেশি থাকবে, আবার ডেটাকে ট্রেইনিং সেট, টেস্টিং সেটে আলাদা করতে হবে, দরকার হলে ডেটা ক্লিনিং এর কাজ থাকবে আরো অনেক স্টেপ। তবে মূল স্টাকচার এটাই। এই স্টেপ গুলো বুঝতে পারবে বাকি কাজ গুলো সহজ হয়ে যাবে।

উপরের প্রজেক্ট পাওয়া যাবে গুগলের কোল্যাবে। সেখানে গিয়ে সরাসরি রান করে আউটপুট দেখা যাবে।

মেশিন লার্নিং নিয়ে এই ব্লগে অনেক গুলো লেখা রয়েছে, সেগুলো পাওয়া যাবে আর্টিফিশিয়াল ইন্টিলিজেন্স এবং মেশিন লার্নিং পেইজে। এছাড়া কিভাবে লেয়ার কাজ করে তা সম্পর্কে বিস্তারিত জানা যাবে ডিপ লার্নিং সম্পর্কে সূচনা নিয়ে লেখাটিতে।

 

Leave a Reply