Rev 6.0
মনে আছে ছোট্ট রকিব এবং তার ফুপিমার গল্পের কথা? আমি আগের বই “শূন্য থেকে পাইথন মেশিন লার্নিং” বইটার কথা বলছিলাম। সেখানে গল্পটা ছিল এরকম, কোন এক রাত্রে যখন সবাই গরমে কাহিল, তখন ওই সময়ে কত টেম্পারেচার সেটা নিয়ে কথা হচ্ছিল ছোট্ট রকিবের গ্রামের দাদা বাড়িতে। ফুঁপিমা বলছিলেন, বাইরের বসার ঘরের সেই বড় থার্মোমিটার না দেখেও তখনকার টেম্পারেচার আন্দাজ করা যাবে ঝিঁঝিঁপোকার ডাক থেকে। সবাই অবাক, সবার প্রশ্ন কিভাবে?
বোঝা গেল যে ঝিঁঝিঁপোকার ডাকের সাথে তাপমাত্রা একটা সম্পর্ক আছে। তাপমাত্রা বাড়লে ঝিঁঝিঁপোকার ডাকার ফ্রিকোয়েন্সি বেড়ে যায়। এবং এই ডাকার ফ্রিকোয়েন্সি তাপমাত্রা সাথে অনেকটাই লিনিয়ার। মানে, তাপমাত্রা বাড়লে ডাকের ফ্রিকুয়েন্সি বাড়ে। ব্যাপারটাকে উল্টো করে ধরলে বলা যায়, ঝিঁঝিঁপোকার ডাককে ঠিকমত গুনতে পারলে ওই মুহূর্তের তাপমাত্রা বের করা সম্ভব হবে। ফুঁপিমা এর নোটবুক থেকে দেখা গেল, উনি একেকদিনের ঝিঁঝিঁপোকার ডাক এবং তাপমাত্রা পাশাপাশি লিখে সেটার মধ্যে একটা যোগসুত্র বের করেছিলেন সেগুলোকে প্লট করে। পুরো ১ মিনিটের ডাক রেকর্ড না করে তার প্রতি ১৫ সেকেন্ডের ঝিঁঝিঁপোকার ডাক এর সাথে তাপমাত্রাকে প্লটিংয়েই বোঝা গেল সেই লিনিয়ার সম্পর্ককে।
ঝিঁঝিঁপোকার ডাক বেড়ে যাওয়া মানে তাপমাত্রা বেড়ে যাওয়া। সেখান থেকে একটা ফর্মুলা বের করেছিলেন ওই সময়। ওই ফর্মুলা দিয়ে আমাদেরকে কেউ ঝিঁঝিঁপোকার ডাক এর সংখ্যা বললে তার করেসপন্ডিং ওই সময়ে কত তাপমাত্রা হবে সেটা বের করা যাবে ওই ফর্মুলা দিয়ে। তাহলে তো আর সেটা মেশিন লার্নিং হলো না। ফর্মুলা হচ্ছে একটা রুল বেইজড সিস্টেম, যা মেশিন ডেটা থেকে শেখে না। আমি এই মুহূর্তে ফর্মুলাটা আমাদের মেশিনের কাছে আগে থেকে বলছি না, কারণ আমাদের ফুঁপিমা নোটবুক থেকে ডেটা সরাসরি মেশিনে দিয়ে দেবো - সে তার ফর্মুলা বের করতে পারে কিনা? যদি সে ইনপুট ডেটা থেকেই ফর্মুলা বের করতে পারে তাহলে আমরা বুঝে যাবো আমাদের মেশিন শিখছে। সে একটা লার্নিং মেশিন। ডেটা পাল্টে গেলে আবার সে নতুন ফর্মুলা দেবে।
রাজি তো? আবারো বলছি - আমরা মেশিনকে আগে থেকে ফর্মুলা বলবো না। দেখি সে ফর্মুলা বের করতে পারে কিনা?
আমরা ঝিঝি পোকার 15 সেকেন্ডের ডাকের সংখ্যা বলবো, মেশিন কে আমাদেরকে বলতে হবে এখনকার তাপমাত্রা কত? এই মুহূর্তে আমাদের কাছে 55 টা রেকর্ড আছে যেখানে 15 সেকেন্ডের ঝিঝি পোকার ডাকের করেসপন্ডিং তাপমাত্রা দেয়া আছে টেবিলে। আপনারা শূন্য থেকে পাইথন মেশিন লার্নিং বইটা দেখতে পারেন। পাশাপাশি সেই ডাটা সেটের লিংক নিচে দেয়া হল।
ব্যাপারটাকে আমি তিন ভাবে করতে পারি।
শুধুমাত্র এটুকু বলতে পারি, প্রথম দুটো মেশিন লার্নিং নয়।
প্রথমেই টেন্সর-ফ্লো, এটাকে আমরা tf
বলবো সুবিধার জন্য।
টেন্সর-ফ্লো আর নামপাই খুব কাছের জিনিস। নামপাইকে শর্ট করে np
, যা আমাদেরকে দেবে C++ এর গতি।
import tensorflow
বইটা যখন বাজারে যাবে, আমি ধারণা করি তখন টেন্সর-ফ্লো ২.x.x সব জায়গায় আপডেট হয়ে যাবে। আমি ধরে নিচ্ছি আমাদের কোথাও (বিশেষ করে জুপিটার নোটবুকে পুরানো ভার্সন ইনস্টল করা আছে। সেকারণে আগে দেখে নেই আমাদের টেন্সর-ফ্লো এর কতো ভার্সন ইনস্টল করা আছে। অন্য ভার্সন থাকলে সেটাকে আপগ্রেড করে নেবো নতুন ভার্শনে।
tensorflow.__version__
'1.15.0'
%tensorflow_version
Currently selected TF version: 1.x Available versions: * 1.x * 2.x
আপগ্রেড করে নিচ্ছি ২.০তে। এমুহুর্তে দরকার না থাকলেও আমরা পুরো বইটা টেন্সর-ফ্লো ২.০ দিয়ে সাঁজাতে চাই প্লাটফর্মের কনসিস্টেন্সির জন্য।
!pip install -q tensorflow==2.1.0
রানটাইম এনভায়রনমেন্ট রিস্টার্ট করি
import tensorflow
tensorflow.__version__
'2.1.0'
পুরো বইকে কনসিস্টেন্ট রাখার জন্য আমরা নিচের এই কোড ব্যবহার করবো যাতে গুগল কোলাব/জুপিটার নোটবুকে টেন্সর-ফ্লো ২.x সিলেক্ট করতে পারে। রিসেট করে নিন গুগল কোলাবের সব রানটাইম।
try:
# শুধুমাত্র টেন্সর-ফ্লো ২.x ব্যবহার করবো
%tensorflow_version 2.x
except Exception:
pass
import tensorflow as tf
keras = tf.keras
TensorFlow 2.x selected.
# আমাদের জিপিউ কয়টা এখানে?
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
Num GPUs Available: 1
শুরুতেই আমরা ডাটাগুলোকে দুটো লিস্টে ভাগ করি। প্রথম লিস্ট 'chirp15s' যেখানে আমরা ১৫ সেকেন্ডে ঝিঁঝিঁ পোকার ডাকের সংখ্যা রেকর্ড করেছি। প্রথম দুটো রেকর্ড দেখলে বোঝা যায় ঝিঁঝিঁপোকা ১৫ সেকেন্ডে ৪৪ এবং ৪৬ বার ডেকেছে। পরের লিস্টে হচ্ছে তাপমাত্রা, যা সেলসিয়াস "temp_celsius" রেকর্ড করা হয়েছে। সেলসিয়াস মানে আমাদের সেন্টিগ্রেড। বোঝার সুবিধার জন্য এখানে একটা ফর লুপে আমরা ঝিঁঝিঁপোকার ডাক এর পাশাপাশি তাপমাত্রা ফেলে দিচ্ছি।
import numpy as np
chips_15s = np.array([44.000,46.400,43.600,35.000,35.000,32.600,28.900,27.700,25.500,20.375,12.500,37.000,37.500,36.500,36.200,33.000,43.000,46.000,29.000,31.700,31.000,28.750,23.500,32.400,31.000,29.500,22.500,20.600,35.000,33.100,31.500,28.800,21.300,37.800,37.000,37.100,36.200,31.400,30.200,31.300,26.100,25.200,23.660,22.250,17.500,15.500,14.750,15.000,14.000,18.500,27.700,26.000,21.700,12.500,12.500], dtype=float)
temp_celsius = np.array([26.944, 25.833, 25.556, 23.056, 21.389, 20.000, 18.889, 18.333, 16.389, 13.889, 12.778, 24.583, 23.333, 23.333, 22.500, 18.889, 25.278, 25.833, 20.278, 20.278, 20.000, 18.889, 15.000, 21.111, 20.556, 19.444, 16.250, 14.722, 22.222, 21.667, 20.556, 19.167, 15.556, 23.889, 22.917, 22.500, 21.111, 19.722, 18.889, 20.556, 17.222, 17.222, 16.111, 16.667, 13.611, 12.778, 11.111, 11.667, 10.000, 11.111, 18.333, 17.222, 15.000, 10.417, 9.5833], dtype=float)
# আলাদাভাবে দেখি পাশাপাশি
for i,c in enumerate(chips_15s):
print("{} Chirps in 15 Seconds = {} degrees Celsius (C)".format(c, temp_celsius[i]))
44.0 Chirps in 15 Seconds = 26.944 degrees Celsius (C) 46.4 Chirps in 15 Seconds = 25.833 degrees Celsius (C) 43.6 Chirps in 15 Seconds = 25.556 degrees Celsius (C) 35.0 Chirps in 15 Seconds = 23.056 degrees Celsius (C) 35.0 Chirps in 15 Seconds = 21.389 degrees Celsius (C) 32.6 Chirps in 15 Seconds = 20.0 degrees Celsius (C) 28.9 Chirps in 15 Seconds = 18.889 degrees Celsius (C) 27.7 Chirps in 15 Seconds = 18.333 degrees Celsius (C) 25.5 Chirps in 15 Seconds = 16.389 degrees Celsius (C) 20.375 Chirps in 15 Seconds = 13.889 degrees Celsius (C) 12.5 Chirps in 15 Seconds = 12.778 degrees Celsius (C) 37.0 Chirps in 15 Seconds = 24.583 degrees Celsius (C) 37.5 Chirps in 15 Seconds = 23.333 degrees Celsius (C) 36.5 Chirps in 15 Seconds = 23.333 degrees Celsius (C) 36.2 Chirps in 15 Seconds = 22.5 degrees Celsius (C) 33.0 Chirps in 15 Seconds = 18.889 degrees Celsius (C) 43.0 Chirps in 15 Seconds = 25.278 degrees Celsius (C) 46.0 Chirps in 15 Seconds = 25.833 degrees Celsius (C) 29.0 Chirps in 15 Seconds = 20.278 degrees Celsius (C) 31.7 Chirps in 15 Seconds = 20.278 degrees Celsius (C) 31.0 Chirps in 15 Seconds = 20.0 degrees Celsius (C) 28.75 Chirps in 15 Seconds = 18.889 degrees Celsius (C) 23.5 Chirps in 15 Seconds = 15.0 degrees Celsius (C) 32.4 Chirps in 15 Seconds = 21.111 degrees Celsius (C) 31.0 Chirps in 15 Seconds = 20.556 degrees Celsius (C) 29.5 Chirps in 15 Seconds = 19.444 degrees Celsius (C) 22.5 Chirps in 15 Seconds = 16.25 degrees Celsius (C) 20.6 Chirps in 15 Seconds = 14.722 degrees Celsius (C) 35.0 Chirps in 15 Seconds = 22.222 degrees Celsius (C) 33.1 Chirps in 15 Seconds = 21.667 degrees Celsius (C) 31.5 Chirps in 15 Seconds = 20.556 degrees Celsius (C) 28.8 Chirps in 15 Seconds = 19.167 degrees Celsius (C) 21.3 Chirps in 15 Seconds = 15.556 degrees Celsius (C) 37.8 Chirps in 15 Seconds = 23.889 degrees Celsius (C) 37.0 Chirps in 15 Seconds = 22.917 degrees Celsius (C) 37.1 Chirps in 15 Seconds = 22.5 degrees Celsius (C) 36.2 Chirps in 15 Seconds = 21.111 degrees Celsius (C) 31.4 Chirps in 15 Seconds = 19.722 degrees Celsius (C) 30.2 Chirps in 15 Seconds = 18.889 degrees Celsius (C) 31.3 Chirps in 15 Seconds = 20.556 degrees Celsius (C) 26.1 Chirps in 15 Seconds = 17.222 degrees Celsius (C) 25.2 Chirps in 15 Seconds = 17.222 degrees Celsius (C) 23.66 Chirps in 15 Seconds = 16.111 degrees Celsius (C) 22.25 Chirps in 15 Seconds = 16.667 degrees Celsius (C) 17.5 Chirps in 15 Seconds = 13.611 degrees Celsius (C) 15.5 Chirps in 15 Seconds = 12.778 degrees Celsius (C) 14.75 Chirps in 15 Seconds = 11.111 degrees Celsius (C) 15.0 Chirps in 15 Seconds = 11.667 degrees Celsius (C) 14.0 Chirps in 15 Seconds = 10.0 degrees Celsius (C) 18.5 Chirps in 15 Seconds = 11.111 degrees Celsius (C) 27.7 Chirps in 15 Seconds = 18.333 degrees Celsius (C) 26.0 Chirps in 15 Seconds = 17.222 degrees Celsius (C) 21.7 Chirps in 15 Seconds = 15.0 degrees Celsius (C) 12.5 Chirps in 15 Seconds = 10.417 degrees Celsius (C) 12.5 Chirps in 15 Seconds = 9.5833 degrees Celsius (C)
আমরা পুরো ডাটাসেটকে এক্স এবং ওয়াই এক্সিসে প্লট করতে পারি। যেহেতু আমরা আগেই দেখেছি ঝিঁঝিঁপোকার ডাক এবং তাপমাত্রার সম্পর্কটা লিনিয়ার, সেখানে একটা 'বেস্ট ফিট লাইন' আমাদেরকে ভবিষ্যৎ যে কোনো ডাকের সংখ্যার করেসপন্ডিং তাপমাত্রা দেখাতে পারবে। এক্স অ্যাক্সিস যদি ঝিঁঝিঁপোকার ডাকের সংখ্যা হয় তাহলে ওয়াই এক্সিসে তারপর করেসপন্ডিং তাপমাত্রা পাওয়া যাবে।
নতুন ঝিঁঝিঁপোকার ডাক এর সংখ্যা যেটা এখানে নেই, সেটাও এই প্লটিং এ এক্স এক্সিসের যে অংশটা ওয়াই এক্সিসের এর সঙ্গে স্পর্শ করেছে সেটাই প্রেডিক্টেড তাপমাত্রা হবে।
তবে, এই ছবিতে আমরা সেটা না দেখিয়ে সামনে দেখানোর প্ল্যান করছি।
import matplotlib.pyplot as plt
X = chips_15s
y = temp_celsius
plt.scatter(X, y, color='red')
plt.show()
** আমরা সরল রেখার অংক মানে ইকুয়েশন (y = mx + b) নিয়ে আলাপ করছি। আগের বই "শূন্য থেকে পাইথন মেশিন লার্নিং" বইয়ে বড় করে আলাপ করেছিলাম আগে। **
কোন মেশিন লার্নিং নয়
আমাদের ৫৫টা ডেটাপয়েন্ট থেকে অংকে ফর্মুলাতে নিয়ে আসি। সরল রেখার অংক। ফর্মুলা নিচে দেখুন।
আমাদের "chips_15s" মানে X এর সব ভ্যালুগুলোকে যোগ করি।
X_sum =
44.000+46.400+43.600+35.000+35.000+32.600+28.900+27.700+25.500+20.375+12.500+37.000+37.500+36.500+36.200+33.000+43.000+46.000+29.000+31.700+31.000+28.750+23.500+32.400+31.000+29.500+22.500+20.600+35.000+33.100+31.500+28.800+21.300+37.800+37.000+37.100+36.200+31.400+30.200+31.300+26.100+25.200+23.660+22.250+17.500+15.500+14.750+15.000+14.000+18.500+27.700+26.000+21.700+12.500+12.500= 1584.285
এখন আমরা 'temp_celsius' মানে y ভ্যালুগুলোকে যোগ করি।
y_sum =
26.944+ 25.833+ 25.556+ 23.056+ 21.389+ 20.000+ 18.889+ 18.333+ 16.389+ 13.889+ 12.778+ 24.583+ 23.333+ 23.333+ 22.500+ 18.889+ 25.278+ 25.833+ 20.278+ 20.278+ 20.000+ 18.889+ 15.000+ 21.111+ 20.556+ 19.444+ 16.250+ 14.722+ 22.222+ 21.667+ 20.556+ 19.167+ 15.556+ 23.889+ 22.917+ 22.500+ 21.111+ 19.722+ 18.889+ 20.556+ 17.222+ 17.222+ 16.111+ 16.667+ 13.611+ 12.778+ 11.111+ 11.667+ 10.000+ 11.111+ 18.333+ 17.222+ 15.000+ 10.417+ 9.5833= 1030.1403
এখন প্রতিটা ডেটা পয়েন্টের প্রোডাক্টকে যোগ করে ফেলি।
Xy_sum =
44.00026.944+ 46.40025.833+ 43.60025.556+ 35.00023.056+ 35.00021.389+ 32.60020.000+ 28.90018.889+ 27.70018.333+ 25.50016.389+ 20.37513.889+ 12.50012.778+ 37.00024.583+ 37.50023.333+ 36.50023.333+ 36.20022.500+ 33.00018.889+ 43.00025.278+ 46.00025.833+ 29.00020.278+ 31.70020.278+ 31.00020.000+ 28.75018.889+ 23.50015.000+ 32.40021.111+ 31.00020.556+ 29.50019.444+ 22.50016.250+ 20.60014.722+ 35.00022.222+ 33.10021.667+ 31.50020.556+ 28.80019.167+ 21.30015.556+ 37.80023.889+ 37.00022.917+ 37.10022.500+ 36.20021.111+ 31.40019.722+ 30.20018.889+ 31.30020.556+ 26.10017.222+ 25.20017.222+ 23.66016.111+ 22.25016.667+ 17.50013.611+ 15.50012.778+ 14.75011.111+ 15.00011.667+ 14.00010.000+ 18.50011.111+ 27.70018.333+ 26.00017.222+ 21.70015.000+ 12.50010.417+ 12.500*9.5833= 31775.986435
এখন X এবং y ভ্যালুগুলোর যোগফলকে আলাদা আলাদা করে বর্গ করি।
X_square_sum =
44.000^2+46.400^2+43.600^2+35.000^2+35.000^2+32.600^2+28.900^2+27.700^2+25.500^2+20.375^2+12.500^2+37.000^2+37.500^2+36.500^2+36.200^2+33.000^2+43.000^2+46.000^2+29.000^2+31.700^2+31.000^2+28.750^2+23.500^2+32.400^2+31.000^2+29.500^2+22.500^2+20.600^2+35.000^2+33.100^2+31.500^2+28.800^2+21.300^2+37.800^2+37.000^2+37.100^2+36.200^2+31.400^2+30.200^2+31.300^2+26.100^2+25.200^2+23.660^2+22.250^2+17.500^2+15.500^2+14.750^2+15.000^2+14.000^2+18.500^2+27.700^2+26.000^2+21.700^2+12.500^2+12.500^2= 49879.553725
আগেই বলেছি, আমাদের ডেটাপয়েন্ট আছে ৫৫টা। মানে N=55. তাহলে বেস্ট ফিট লাইনের গ্রাডিয়েন্ট পাওয়া যাবে নিচের ফর্মুলা থেকে। আগের বইটা দেখতে পারেন।
m = (N * Xy_sum) - (X_sum * y_sum) / (N * X_square_sum) - (X_sum * X_sum) = (55 * 31775.986435) - (1584.285 * 1030.1403) / (55 * 49879.553725) - (1584.285^2) = 0.49543811976
এখন এই বেস্ট ফিট লাইনের ইন্টারসেপ্ট দরকার আমার লাইনের জন্য। সেটার ফর্মুলা;
b = (X_square_sum * y_sum ) - (X_sum * Xy_sum) / (N * X_square_sum) - (X_sum * x_sum) = (49879.553725 * 1030.1403) - (1584.285 * 31775.986435) / (55 * 49879.553725) - (1584.285* 1584.285) = 4.45863851637
তাহলে আমাদের এই রিগ্রেশন লাইনের সরলরেখার ইক্যুয়েশন কি?
y = 0.49543811976X + 4.45863851637
অংকে তো মাথা খারাপ হয়ে গেলো। একটু পাইথনে দেখি। এখনো মেশিন লার্নিং নয় কিন্তু। একটা ফাংশন তৈরি করি best_fit_slope_and_intercept নাম দিয়ে। সেখানে m এবং b এর মান (X,y) থেকে বের করে নিয়ে আসি। কি দেখলাম? একই রেজাল্ট।
from statistics import mean
def best_fit_slope_and_intercept(X,y):
m = (((mean(X)*mean(y)) - mean(X*y)) /
((mean(X)*mean(X)) - mean(X*X)))
b = mean(y) - m*mean(X)
return m, b
m, b = best_fit_slope_and_intercept(X,y)
print(m,b)
0.49543811977958857 4.458638516454446
y = mx + b এর হিসেবে
y = 0.49543811977958857X + 4.458638516454446
একদম কাছাকাছি।
আমরা একটা রিগ্রেশন লাইন টেনে ফেলি। ধরুন ১৫ সেকেন্ডের ঝিঁঝিঁপোকার ৪১ ডাকের প্রেডিকশন কি হবে? Y এক্সিসের বরাবর রেখাটা এক্স এক্সিসের কোথায় স্পর্শ করেছে সেটা দেখলেই কিন্তু পাওয়া যাবে।
আচ্ছা, লাইনটা কিভাবে টানলাম সেটা নিয়ে আলাপ নয় এখন।
# regression_line = [(m*x)+b for x in X]
regression_line = []
for x in X:
regression_line.append((m*x)+b)
plt.scatter(X,y,color='red')
plt.plot(X, regression_line)
plt.show()
ফিচার — আমাদের মডেলের ইনপুট ডেটা। আমাদের এখানে একটা ভ্যালু - ১৫ সেকেন্ডে ঝিঁঝিঁপোকার ডাকের সংখ্যা।
লেবেল — যেই আউটপুটটা আমাদের মডেল শিখে প্রেডিক্ট করবে। আমাদের এখানে তাপমাত্রা।
এক্সাম্পল — ইনপুট/আউটপুট ডেটার একটা জোড়া, যা দরকার পড়ছে ট্রেনিং এর সময়। আমাদের এখানে chips_15s এবং temp_celsius অ্যারে থেকে দুটো ডেটা একটা ইনডেক্সে দেখলে (44.000,26.944) পাওয়া যাবে।
আমরা সাইকিট-লার্ন দিয়েও এই জিনিসটা করতে পারতাম। তবে, যেহেতু আমরা ডিপ লার্নিং মানে টেন্সর-ফ্লো নিয়ে কাজ করতে চাই, সেকারণে আমাদের শুরুতে ফোকাস থাকবে একটা সাধারণ মডেলে। বিশেষ করে বোঝার ক্ষেত্রে। একটা লিনিয়ার মডেলে নিউরাল নেটওয়ার্ক দরকার নেই, বরং নন-লিনিয়ার মডেলের জন্য দরকার নিউরাল নেটওয়ার্ক। সেগুলো নিয়ে সামনে আলাপ হবে।
** আমাদের এই মডেল তৈরি করতে ডিপ লার্নিং অথবা টেন্সর-ফ্লো লাগবে না। তবে ডিপ লার্নিং ফ্রেমওয়ার্ক নিয়ে ধারণা পাবার জন্য একটা অগভীর মানে 'শ্যালো' এক লেয়ারের, এক নিউরনের নেটওয়ার্ক বানানোর চেষ্টা করবো। **
টেন্সর-ফ্লো ডিপ লার্নিং ফ্রেমওয়ার্ক হিসেবে একটু কমপ্লেক্স। সাইকিট-লার্ন এপিআইএর মতো এতো কম হাইপার-প্যারামিটার নিয়ে তাকে চালানো দুস্কর। যেহেতু ফ্রেমওয়ার্কটা অনেক শক্তিশালী, সেকারণে আমরা এটাকে এক্সেস করবো একটা হাই-লেভেল এপিআই দিয়ে যার কাজ হচ্ছে এই ভেতরের কমপ্লেক্সিটিকে লুকিয়ে রাখবে আমাদের কাছ থেকে। একারণে টেন্সর-ফ্লো ২.০ শুরুতেই যুক্ত করে নিয়েছে কেরাসকে। কেরাস দিয়ে ৯০%এর বেশি কাজ করা সম্ভব।
আমরা পুরো জিনিসকে ৫টা ভাগে ভাগ করে ফেলেছি।
এখন আমরা একটা মডেল তৈরি করতে চাই। মেশিন লার্নিং মডেল তবে জিনিসটা হবে খুবই সিম্প্লিস্টিক। একটা নিউরাল নেটওয়ার্ক। এখন কথা আসতে পারে নিউরাল নেটওয়ার্ক কি? (সামনে বিস্তারিত লিখেছি) নিউরন নেটওয়ার্ক আসলে কিছু অ্যালগরিদমের সেট যেটাকে কিছুটা তৈরি করা হয়েছে মানুষের মস্তিষ্কের নিউরাল এর ধারণার ওপর ভিত্তি করে। মানুষের মস্তিষ্কের সেই নিউরালকে আমরা নিয়ে এসেছি মেশিন লার্নিং এ। কারণ দুটোর কাজই এক। মেশিন লার্নিং এর যে নিউরাল নেটওয়ার্ক ব্যবহার করছি তার কাজ হচ্ছে বিভিন্ন লেয়ারে প্যাটার্ন ধরতে পারা। মানুষ যেমন তার হাজারো সেন্সর ডাটা আমাদের মস্তিষ্কে পাঠাচ্ছে, সেরকমভাবে নিউরাল নেটওয়ার্কের সবচেয়ে ছোট ইউনিট হচ্ছে একটা 'পারসেপ্ট্রন'। এই 'পারসেপ্ট্রন'গুলো যেভাবে প্যাটার্ন বুঝতে পারে তা সব সংখ্যার ভেক্টরে থাকে। আমাদের ইনপুট হিসেবে সেটা ছবি, শব্দ, লেখা অথবা টাইম সিরিজ হতে পারে - তবে সবকিছুকেই পাল্টে ফেলতে হবে সংখ্যায়।
সাধারণত: নিউরাল নেটওয়ার্কগুলো আমাদেরকে ডেটাকে বিভিন্ন গ্রুপে ক্লাস্টার করে দেয়। আমাদের ইনপুট ডাটার ওপর ভিত্তি করে সেটার ক্লাসিফিকেশন/রিগ্রেশন হবে শেষ লেয়ারে। ধরা যাক আমাদের কাছে বেশ কিছু 'লেবেল ছাড়া' ডাটা আছে। নিউরাল নেটওয়ার্কগুলো এই লেবেল ছাড়া ডাটাগুলোকে তাদের মধ্যে বিভিন্ন মিল/সঙ্গতি/অসঙ্গতি দেখে সেগুলোকে আলাদা করে গ্রুপিং করে সে। এরপর তাকে একটা লেবেল সহ ডাটাসেট দিলে সেই ট্রেনিং থেকে ফিচারগুলোকে 'এক্সট্রাক্ট' করতে পারে। নিউরাল নেটওয়ার্ক এর একটা বড় কাজ হচ্ছে বিভিন্ন লেয়ারে বিভিন্ন ফিচার এক্সট্রাক্ট করে সে। (সামনে বিস্তারিত আলাপ করেছি) সবশেষে একটা মানুষকে যদি ক্লাসিফাই করতে হয়, মানে চিনতে হয়, তাহলে সেটা শুরু হবে সেই পিক্সেল থেকে যার পর মানুষের মুখের একেকটা ফিচারের কোনা, মানে নাক, মুখ বানানোর জন্য যা যা ফিচার লাগবে সেগুলোকে সে এক্সট্রাক্ট করবে তার নিচের লেয়ার থেকে।
শুরুতেই একটু অংক। ডিপ লার্নিং একটা এন্ড টু এন্ড ইকোসিস্টেম, বিশেষ করে আমরা যখন টেন্সর-ফ্লো এনভায়রমেন্ট ব্যবহার করব। আমাদের এই নিউরাল নেটওয়ার্ক আউটপুটের সাথে ইনপুটের একটা চমৎকার ম্যাপিং করে। এর কাজ হচ্ছে ডাটার মধ্যে কোরিলেশন বের করা। অনেকে এইজন্য এর নাম বলে থাকেন 'ইউনিভার্সাল অ্যাপ্রক্সিমেটর'। কারণ এর কাজ হচ্ছে একটা অজানা ফাংশন f(x) = y এর ভ্যালুকে ধারণা করা, x আর y হচ্ছে তার ইনপুট এবং আউটপুট। আগের বইয়ে আলাপ করা হয়েছে। মেশিন লার্নিং এর এই শেখার প্রসেসে, নিউরাল নেটওয়ার্ক খুঁজে পায় তার আসল ফাংশন, যেটাকে আমরা বলতে পারি একটা প্রসেস যা x থেকে থেকে ইনপুট নিয়ে আপডেট করবে y কে।
উদাহরণ কি দেব একটা? f(x) = 2x + 9 = y এর মত অসংখ্য উদাহরণ নিয়ে আলাপ করব সামনে।
যেহেতু আমরা একটা খুবই সহজ মডেল তৈরি করছি সেটাকে ডিপ লার্নিং এর ভাষায় আমরা বলছি ‘ডেন্স’ নেটওয়ার্ক। মানে একটার সাথে আরেকটার সরাসরি কানেকশন। গায়ে গায়ে লেগে থাকা। নেটওয়ার্কের একেকটা পারসেপ্ট্রন আরেকটার সাথে সম্পূর্ণভাবে কানেক্টেড থাকে। এর জন্যই একে বলা হচ্ছে 'ডেন্স'। 'ডেন্স'লি কানেক্টেড। (সামনে বিস্তারিত বলেছি) ‘ডেন্স’এর মডেল একেকটার সাথে স্ট্যাক করে কানেক্টেড মডেল। সেখানে আমরা ব্যবহার করবো "সিকোয়েন্সিয়াল", মানে একটার পর আরেকটা।
নিউরাল নেটওয়ার্ক তৈরি করতে আমাদের এটার লেয়ারগুলোর কনফিগারেশন বলতে হবে। লেয়ার ঠিকমতো কনফিগার করা হলে আমরা মডেলকে কম্পাইল করব। আগের ছবিতেও দেখেছেন এই জিনিসটা। যেহেতু আমাদের সমস্যা একটা লিনিয়ার রিগ্রেশন এর মত, মানে একটা সরল রেখার ইকুয়েশনের মত, সে কারণে আমাদের নেটওয়ার্কে একটা লেয়ার প্রয়োজন। সঙ্গে একটা নিউরন। সামনে দরকার মতো আমরা আরো কিছু লেয়ার নিয়ে আলাপ করব।
একটা নিউরাল নেটওয়ার্কের বেসিক বিল্ডিং ব্লক হচ্ছে লেয়ার। লেয়ারগুলোতে যে ডেটা ফিড করানো হয় সেখান থেকে সে ডেটার রিপ্রেজেন্টেশনগুলোকে ঠিকমতো এক্সট্রাক্ট করে নিয়ে নেয় একেকটা লেয়ারে। বেশিরভাগ ডিপ লার্নিং মডেলগুলোর লেয়ার একটার সাথে আরেকটার কানেকশন ডেটাগুলোকে ঠিকমতো বুঝতে সাহায্য করে (ভিন্ন চ্যাপ্টার আছে সামনে)। যেহেতু আমাদের সমস্যাটা খুবই সহজ সে কারণে কিন্তু আমাদের এই নেটওয়ার্কে একটা লেয়ার হলেই চলবে। এই একটা লেয়ারে আমরা একটা নিউরন চালাবো।
শুরুতেই লেয়ারটার নাম দিয়ে দিচ্ছি l0
। মনে আছে scikit-learn এর কথা? সেই একইভাবে আমরা টেন্সর-ফ্লো একটা এপিআই কল করব আমাদের এই 'ডেন্স' লেয়ারের জন্য। যেহেতু আমরা সরাসরি টেন্সর-ফ্লো এর সাথে কথা বলতে চাইবো না এই মুহূর্তে, অবশ্যই সেটা বেশ কমপ্লেক্স, তাই একটা হাই লেভেল হেল্পার এপিআই দিয়ে এক্সেস করব নিচের কঠিন টেন্সর-ফ্লোকে। এখন আমরা শুধু মনে রাখি 'কেরাস' হচ্ছে আমাদের সেই হাই-লেভেল এপিআই যা টেন্সর-ফ্লো এর কম্প্লেক্সিটি লুকিয়ে রাখে। সবচেয়ে বড় কথা হচ্ছে টেন্সর-ফ্লো ২.০ এর সঙ্গে ইন-বিল্ট এসেছে এই 'কেরাস এপিআই'।
আমাদের লেয়ার l0
মানে লেয়ার জিরো। এটাকে তৈরি করছি tf.keras.layers.Dense
কে ইন্সট্যান্সিয়েট করে। ইন্সট্যান্সিয়েট ব্যাপারটা আমরা আলাপ করেছি সাইকিট-লার্নের আগের বইতে। নিচের কনফিগারেশনগুলো দেখি।
এখানে একটা ইনপুট, একটা লেয়ার, একটা নিউরন, এবং একটা আউটপুট। ছবি দেখুন। ইনপুটে একটা ভ্যালু, input_shape=[1], এটা একটা ১ ডাইমেনশনের একটা সংখ্যা।
input_shape=[1]
— Input এর অর্থ হচ্ছে ইনপুট লেয়ার এ একটা ভ্যালু সে এক্সপেক্ট করছে। সিঙ্গেল ভ্যালু। সেই হিসেবে আমরা এটাকে বলছি এক ডাইমেনশনের একটা অ্যারে যার একটাই সদস্য। যেহেতু এটা এই মডেলের প্রথম এবং একটাই লেয়ার সে কারণে এই ইনপুট শেপ হচ্ছে পুরো মডেলিং ইনপুট শেপ। আমাদের এই সিঙ্গেল ভ্যালু হচ্ছে একটা ফ্লোটিং পয়েন্ট সংখ্যা, যা আসলে 15 সেকেন্ডে ঝিঁঝিঁপোকার ডাকের সংখ্যা।
units=1
— এই সংখ্যা দিয়ে আমরা বোঝাতে চাচ্ছি কতগুলো নিউরন হবে ওই লেয়ারে। আমাদের এই নিউরনের সংখ্যা বলে দেয় কতগুলো ইন্টারনাল ভ্যারিয়েবল সেই লেয়ারকে চেষ্টা করতে হবে শিখতে সমস্যাটা সমাধান করতে। সেটা নির্ভর করছে কতগুলো ইনপুট যুক্ত আছে সেই নিউরনের সাথে। মিতু এটাই এই মডেলের সব শেষ লেয়ার, আমাদের মডেলের আউটপুটের সাইজও কিন্তু ১। সারাদিন আউটপুট হচ্ছে একটা সিঙ্গেল ফ্লোট ভ্যালু ডিগ্রী সেলসিয়াস। ঝিঝি পোকা কত ডাক দিলে তার করেসপন্ডিং তাপমাত্রা। এটা যখন কয়েকটা লেয়ারের নেটওয়ার্ক হবে তাহলে সেই লেয়ারের সাইজ এবং সেপ একি হতে হবে পরবর্তী লেয়ারের input_shape।
l0 = tf.keras.layers.Dense(units=1, input_shape=[1])
যখন আমরা লেয়ারগুলোকে ডিফাইন করে ফেললাম এখন তাদেরকে মডেল এ যোগ করার পালা। আমরা যখন সিকুয়েন্সিয়াল মডেলকে আমাদের লেয়ারের আর্গুমেন্ট চেপে ধরে নেব তখন একটার পর আরেকটা লেয়ার কানেক্টেড থাকবে যেভাবে আমরা একটা থেকে আরেকটা লিস্ট করতে থাকবো। এখানে আমরা কেরাসের "সিকোয়েন্সিয়াল" ক্লাস ব্যবহার করছি।
কোরাসে নিউরাল নেটওয়ার্কগুলো ডিফাইন করা থাকে লেয়ারের সিকোয়েন্স হিসেবে। এই লেয়ারের কনটেইনার হচ্ছে "সিকোয়েন্সিয়াল" ক্লাস।
এই মডেলটার কিন্তু একটাই লেয়ার l0 ।
model = tf.keras.Sequential([l0])
আরেক ভাবেও করা যায়
আমরা যদি আগে থেকে মডেলকে ডিফাইন করি, তাহলে লেয়ারগুলোকে ভেতরে ফেলা যায়। এটা একটা ভালো প্রোগ্রামিং স্টাইল।
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))
এই ফাংশনগুলো সাধারণত ব্যবহার হয় ট্রেনিং এর সময়। দুটোর কাজ কিন্তু প্রাসঙ্গিক। প্রথমটার কাজ হচ্ছে প্রতিটা পয়েন্টে কত লস হচ্ছে সেটা বের করা, পরেরটা সেটাকে ধরে সেই লসকে কমিয়ে নিয়ে আসে। এই যে আমরা প্রতিটা পয়েন্টে লস ক্যালকুলেট করি, মানে ট্রেনিং ডেটার আসল ‘আউটকাম’ থেকে প্রেডিকশন কত দূরে আছে, আর সেই দুটোকে কমিয়ে নিয়ে আসতে যা কাজ করতে হয় এই দুটো ফাংশনকে - সেটাকে আমরা ট্রেনিং বলতে পারি।
আমাদের এই ট্রেনিং এর সময় "model.fit()
" ‘অপটিমাইজার’ ফাংশন মডেলের যে ইন্টারনাল ভ্যারিয়েবলগুলো (ওয়েট) আছে সেগুলোর মধ্যে দূরত্বকে কমিয়ে আনার জন্য যা যা এডজাস্টমেন্ট দরকার সেগুলো করে সে। সে ততক্ষণ এই কাজ করতে থাকে (ওই ইন্টারনাল ভেরিয়েবলগুলোর মধ্যে যা যা এডজাস্টমেন্ট দরকার) যতক্ষণ পর্যন্ত আমাদের মডেলের ভেতরের আসল ইকুয়েশনের সমান না হয়। আমাদের ইকুয়েশন হচ্ছে ১৫ সেকেন্ডে ঝিঝি পোকার ডাকের সংখ্যার সাথে ওই সময়ের তাপমাত্রার একটা সম্পর্ক বের করা। এটা বের করতে পারলে আমাদের কাজ হাসিল।
আমরা এতক্ষণ যে ইন্টারনাল ভেরিয়েবলগুলোর কথা বললাম সেগুলো কিন্তু ইনপুট এর সাথে তার ‘করেসপন্ডিং’ ‘ওয়েট’। এগুলো নিয়ে আমরা নিউরাল নেটওয়ার্কের ‘পারসেপট্রন’ নিয়ে যখন আলাপ করব তখন বোঝা যাবে। আমাদের ডিপ লার্নিং ফ্রেমওয়ার্ক টেন্সর-ফ্লো এর ব্যাকএন্ডে কিছু বড় বড় অংকের অ্যানালাইসিস করে এই এডজাস্টমেন্ট টিউনিং করার জন্য। এর ব্যাকএন্ডে যে অংকটা আছে সেটাকে আমরা বলছি ‘গ্রেডিয়েন্ট ডিসেন্ট’। সেটা নিয়েও আলাপ করব সামনে।
আপনি যদি ভালোভাবে দেখেন আমাদের এখানে যে লস ফাংশন ব্যবহার করেছি সেটা হচ্ছে ‘মিন স্কোয়ারড এরর’। সাইকিট-লার্ন বইটাতে এটা নিয়ে বেশ বড় একটা অংক করেছিলাম। পাশাপাশি ‘অপটিমাইজার’ এর ক্ষেত্রে ‘অ্যাডাম’ ব্যবহার করেছি যা আসলে এ ধরনের মডেলের জন্য ভালোভাবেই কাজ করে। এটা একটা লেটেস্ট ট্রেন্ড, সুন্দর কাজ করে। ‘অ্যাডাম’ মানে এডাপ্টিভ মোমেন্ট এস্টিমেশন। তবে এছাড়াও আমরা অন্যান্য প্যারামিটারগুলো নিয়েও সামনে আলাপ করব।
‘অপটিমাইজার’ এর ভেতরের আরেকটা অংশ নিয়ে এখনই আলাপ করলে ব্যাপারটা সামনে সহজ হয়ে যাবে। এখানে দেখুন আমরা 0.1 যে সংখ্যাটা ব্যবহার করেছি, সেটা আসলে ‘লার্নিং রেট’। কি হারে মডেল শিখছে। এটা মডেলের ভেতরে যখন ইন্টারনাল ভেরিয়েবল বা ওয়েট নিজেদের মধ্যে এডজাস্ট করে সেটা একটা স্টেপ সাইজ ধরে করে। হাটিহাটি পা পা করে। পাহাড় থেকে নামার মতো। এই সংখ্যাটা যদি খুব কম হয় তাহলে একটা মডেল ট্রেইন করতে অনেক বেশি ‘আইটারেশন’ লাগবে। আবার সংখ্যাটা বড় হলে মডেলের অ্যাক্যুরেসি কমে যাবে। তাহলে মধ্য়পন্থা। হাতে কলমের একটা বড় মজা হচ্ছে হাইপার প্যারামিটারগুলোকে টিউন করার জন্য আমাদের ভ্যালুগুলো দিয়ে কিছুটা ট্রায়াল দিতে হবে। তবে ইন্ডাস্ট্রি স্ট্যান্ডার্ড অনুযায়ী এটার একটা ডিফল্ট ভ্যালু আছে যা ০.০০১ থেকে ০.১ পর্যন্ত ভালো কাজ করে।
Scikit-learn এর মত এখানেও আমরা মডেলকে ট্রেইন করবো ফিট "fit
" মেথডকে কল করে। ট্রেনিং এর সময় আমাদের মডেল ১৫ সেকেন্ডের ঝিঁঝিঁ পোকার ডাক এর সংখ্যার সাথে বর্তমান যে ইন্টার্নাল ভেরিয়েবলগুলো আছে (যাকে আমরা বলছি ওয়েট) তাদেরকে ব্যবহার করে এবং তার আউটপুট ভ্যালু যেটাকে আমরা বলছি বর্তমান তাপমাত্রা - এ দুটোর মধ্যে একটা ক্যালকুলেশন করে এদের মধ্যে রিলেশনশিপ এডজাস্ট করতে থাকে। যেহেতু শুরুতেই এই ওয়েটগুলোকে দৈব চয়নের ভিত্তিতে সেট করা হয় সে কারণে শুরুর দিকে তাদের আউটপুট আসল ভ্যালুর কাছাকাছি না আসার সম্ভাবনা বেশি। সে কারণে আমাদের যে আসল আউটপুট (ট্রেনিং ডেটা থেকে) আর যে আউটপুটটা এখন ক্যালকুলেট করা হলো লস ফাংশন দিয়ে, সেটাকে অপটিমাইজার ফাংশন পই পই করে বলে দেয় কিভাবে ওয়েটগুলোকে এডজাস্ট করবে সামনে।
এই পুরো ব্যাপারটা মানে পুরো সাইকেলকে আমরা বলছি ১. একটা ক্যালকুলেশন, ২. তার সঙ্গে মিলিয়ে দেখা, ৩. এর পাশাপাশি ওয়েটগুলোর যে এডজাস্টমেন্ট এই তিনটা জিনিসকে ম্যানেজ করে আমাদের এই ফিট মেথড। Scikit-learn এর মত একই ধরনের আর্গুমেন্ট তবে সঙ্গে আরো কয়েকটা এলিমেন্ট এসেছে নতুন করে। আমাদের প্রথম আর্গুমেন্ট হচ্ছে ইনপুট আর পরের আর্গুমেন্টটা হচ্ছে আমরা যেটা পেতে চাই। একদম scikit-learn। এরপরের আর্গুমেন্ট হচ্ছে ইপক (epochs), মানে পুরো ট্রেনিং ডাটা কতবার পুরোপুরি আগা থেকে গোড়া পর্যন্ত চালাবে, শেষে হচ্ছে ভার্বস (verbose) আর্গুমেন্ট যেটা নির্ধারণ করে আমাদের আউটপুটে বাড়তি ইনফরমেশন দিবে কি দিবেনা।
# X = chips_15s
# y = temp_celsius
# history = model.fit(chips_15s, temp_celsius, epochs=500, verbose=True)
history = model.fit(X, y, epochs=500, verbose=True)
Train on 55 samples Epoch 1/500 55/55 [==============================] - 2s 36ms/sample - loss: 4047.1307 Epoch 2/500 55/55 [==============================] - 0s 140us/sample - loss: 3274.3914 Epoch 3/500 55/55 [==============================] - 0s 161us/sample - loss: 2634.7248 Epoch 4/500 55/55 [==============================] - 0s 131us/sample - loss: 2043.6359 Epoch 5/500 55/55 [==============================] - 0s 154us/sample - loss: 1544.0610 Epoch 6/500 55/55 [==============================] - 0s 167us/sample - loss: 1117.1716 Epoch 7/500 55/55 [==============================] - 0s 169us/sample - loss: 778.5863 Epoch 8/500 55/55 [==============================] - 0s 155us/sample - loss: 497.9578 Epoch 9/500 55/55 [==============================] - 0s 167us/sample - loss: 302.0412 Epoch 10/500 55/55 [==============================] - 0s 158us/sample - loss: 161.9794 Epoch 11/500 55/55 [==============================] - 0s 161us/sample - loss: 74.5582 Epoch 12/500 55/55 [==============================] - 0s 147us/sample - loss: 23.6584 Epoch 13/500 55/55 [==============================] - 0s 129us/sample - loss: 3.2971 Epoch 14/500 55/55 [==============================] - 0s 112us/sample - loss: 3.8596 Epoch 15/500 55/55 [==============================] - 0s 106us/sample - loss: 15.9007 Epoch 16/500 55/55 [==============================] - 0s 100us/sample - loss: 32.1232 Epoch 17/500 55/55 [==============================] - 0s 130us/sample - loss: 47.1600 Epoch 18/500 55/55 [==============================] - 0s 141us/sample - loss: 57.8819 Epoch 19/500 55/55 [==============================] - 0s 126us/sample - loss: 62.9485 Epoch 20/500 55/55 [==============================] - 0s 128us/sample - loss: 62.0691 Epoch 21/500 55/55 [==============================] - 0s 130us/sample - loss: 56.1761 Epoch 22/500 55/55 [==============================] - 0s 145us/sample - loss: 47.4685 Epoch 23/500 55/55 [==============================] - 0s 155us/sample - loss: 37.3952 Epoch 24/500 55/55 [==============================] - 0s 157us/sample - loss: 26.8025 Epoch 25/500 55/55 [==============================] - 0s 185us/sample - loss: 17.7664 Epoch 26/500 55/55 [==============================] - 0s 147us/sample - loss: 10.4587 Epoch 27/500 55/55 [==============================] - 0s 153us/sample - loss: 5.6765 Epoch 28/500 55/55 [==============================] - 0s 130us/sample - loss: 2.5226 Epoch 29/500 55/55 [==============================] - 0s 135us/sample - loss: 1.4136 Epoch 30/500 55/55 [==============================] - 0s 220us/sample - loss: 1.3471 Epoch 31/500 55/55 [==============================] - 0s 236us/sample - loss: 2.0276 Epoch 32/500 55/55 [==============================] - 0s 208us/sample - loss: 2.8290 Epoch 33/500 55/55 [==============================] - 0s 243us/sample - loss: 3.5474 Epoch 34/500 55/55 [==============================] - 0s 194us/sample - loss: 3.9861 Epoch 35/500 55/55 [==============================] - 0s 215us/sample - loss: 4.0466 Epoch 36/500 55/55 [==============================] - 0s 185us/sample - loss: 3.7982 Epoch 37/500 55/55 [==============================] - 0s 166us/sample - loss: 3.3394 Epoch 38/500 55/55 [==============================] - 0s 232us/sample - loss: 2.7839 Epoch 39/500 55/55 [==============================] - 0s 224us/sample - loss: 2.2991 Epoch 40/500 55/55 [==============================] - 0s 204us/sample - loss: 1.8071 Epoch 41/500 55/55 [==============================] - 0s 202us/sample - loss: 1.4986 Epoch 42/500 55/55 [==============================] - 0s 188us/sample - loss: 1.2965 Epoch 43/500 55/55 [==============================] - 0s 183us/sample - loss: 1.2177 Epoch 44/500 55/55 [==============================] - 0s 243us/sample - loss: 1.2417 Epoch 45/500 55/55 [==============================] - 0s 194us/sample - loss: 1.2792 Epoch 46/500 55/55 [==============================] - 0s 164us/sample - loss: 1.3373 Epoch 47/500 55/55 [==============================] - 0s 207us/sample - loss: 1.3948 Epoch 48/500 55/55 [==============================] - 0s 179us/sample - loss: 1.4081 Epoch 49/500 55/55 [==============================] - 0s 176us/sample - loss: 1.3977 Epoch 50/500 55/55 [==============================] - 0s 163us/sample - loss: 1.3643 Epoch 51/500 55/55 [==============================] - 0s 209us/sample - loss: 1.3296 Epoch 52/500 55/55 [==============================] - 0s 182us/sample - loss: 1.2837 Epoch 53/500 55/55 [==============================] - 0s 220us/sample - loss: 1.2576 Epoch 54/500 55/55 [==============================] - 0s 179us/sample - loss: 1.2417 Epoch 55/500 55/55 [==============================] - 0s 235us/sample - loss: 1.2145 Epoch 56/500 55/55 [==============================] - 0s 142us/sample - loss: 1.2188 Epoch 57/500 55/55 [==============================] - 0s 234us/sample - loss: 1.2129 Epoch 58/500 55/55 [==============================] - 0s 219us/sample - loss: 1.2216 Epoch 59/500 55/55 [==============================] - 0s 195us/sample - loss: 1.2282 Epoch 60/500 55/55 [==============================] - 0s 199us/sample - loss: 1.2289 Epoch 61/500 55/55 [==============================] - 0s 142us/sample - loss: 1.2276 Epoch 62/500 55/55 [==============================] - 0s 148us/sample - loss: 1.2225 Epoch 63/500 55/55 [==============================] - 0s 128us/sample - loss: 1.2179 Epoch 64/500 55/55 [==============================] - 0s 142us/sample - loss: 1.2131 Epoch 65/500 55/55 [==============================] - 0s 167us/sample - loss: 1.2076 Epoch 66/500 55/55 [==============================] - 0s 140us/sample - loss: 1.2049 Epoch 67/500 55/55 [==============================] - 0s 131us/sample - loss: 1.2097 Epoch 68/500 55/55 [==============================] - 0s 167us/sample - loss: 1.2067 Epoch 69/500 55/55 [==============================] - 0s 240us/sample - loss: 1.2073 Epoch 70/500 55/55 [==============================] - 0s 161us/sample - loss: 1.2065 Epoch 71/500 55/55 [==============================] - 0s 303us/sample - loss: 1.2061 Epoch 72/500 55/55 [==============================] - 0s 170us/sample - loss: 1.2038 Epoch 73/500 55/55 [==============================] - 0s 191us/sample - loss: 1.2025 Epoch 74/500 55/55 [==============================] - 0s 186us/sample - loss: 1.2011 Epoch 75/500 55/55 [==============================] - 0s 183us/sample - loss: 1.1993 Epoch 76/500 55/55 [==============================] - 0s 124us/sample - loss: 1.1976 Epoch 77/500 55/55 [==============================] - 0s 120us/sample - loss: 1.1956 Epoch 78/500 55/55 [==============================] - 0s 133us/sample - loss: 1.1953 Epoch 79/500 55/55 [==============================] - 0s 177us/sample - loss: 1.1959 Epoch 80/500 55/55 [==============================] - 0s 179us/sample - loss: 1.1936 Epoch 81/500 55/55 [==============================] - 0s 184us/sample - loss: 1.1929 Epoch 82/500 55/55 [==============================] - 0s 188us/sample - loss: 1.1921 Epoch 83/500 55/55 [==============================] - 0s 215us/sample - loss: 1.1925 Epoch 84/500 55/55 [==============================] - 0s 191us/sample - loss: 1.1899 Epoch 85/500 55/55 [==============================] - 0s 138us/sample - loss: 1.1891 Epoch 86/500 55/55 [==============================] - 0s 210us/sample - loss: 1.1877 Epoch 87/500 55/55 [==============================] - 0s 182us/sample - loss: 1.1867 Epoch 88/500 55/55 [==============================] - 0s 204us/sample - loss: 1.1847 Epoch 89/500 55/55 [==============================] - 0s 165us/sample - loss: 1.1837 Epoch 90/500 55/55 [==============================] - 0s 188us/sample - loss: 1.1825 Epoch 91/500 55/55 [==============================] - 0s 219us/sample - loss: 1.1818 Epoch 92/500 55/55 [==============================] - 0s 192us/sample - loss: 1.1805 Epoch 93/500 55/55 [==============================] - 0s 180us/sample - loss: 1.1796 Epoch 94/500 55/55 [==============================] - 0s 210us/sample - loss: 1.1784 Epoch 95/500 55/55 [==============================] - 0s 190us/sample - loss: 1.1769 Epoch 96/500 55/55 [==============================] - 0s 148us/sample - loss: 1.1783 Epoch 97/500 55/55 [==============================] - 0s 164us/sample - loss: 1.1748 Epoch 98/500 55/55 [==============================] - 0s 157us/sample - loss: 1.1740 Epoch 99/500 55/55 [==============================] - 0s 170us/sample - loss: 1.1725 Epoch 100/500 55/55 [==============================] - 0s 175us/sample - loss: 1.1716 Epoch 101/500 55/55 [==============================] - 0s 221us/sample - loss: 1.1706 Epoch 102/500 55/55 [==============================] - 0s 204us/sample - loss: 1.1698 Epoch 103/500 55/55 [==============================] - 0s 224us/sample - loss: 1.1692 Epoch 104/500 55/55 [==============================] - 0s 181us/sample - loss: 1.1682 Epoch 105/500 55/55 [==============================] - 0s 192us/sample - loss: 1.1666 Epoch 106/500 55/55 [==============================] - 0s 179us/sample - loss: 1.1652 Epoch 107/500 55/55 [==============================] - 0s 179us/sample - loss: 1.1641 Epoch 108/500 55/55 [==============================] - 0s 146us/sample - loss: 1.1633 Epoch 109/500 55/55 [==============================] - 0s 191us/sample - loss: 1.1627 Epoch 110/500 55/55 [==============================] - 0s 188us/sample - loss: 1.1609 Epoch 111/500 55/55 [==============================] - 0s 301us/sample - loss: 1.1593 Epoch 112/500 55/55 [==============================] - 0s 188us/sample - loss: 1.1582 Epoch 113/500 55/55 [==============================] - 0s 169us/sample - loss: 1.1579 Epoch 114/500 55/55 [==============================] - 0s 177us/sample - loss: 1.1563 Epoch 115/500 55/55 [==============================] - 0s 200us/sample - loss: 1.1551 Epoch 116/500 55/55 [==============================] - 0s 143us/sample - loss: 1.1542 Epoch 117/500 55/55 [==============================] - 0s 164us/sample - loss: 1.1531 Epoch 118/500 55/55 [==============================] - 0s 213us/sample - loss: 1.1513 Epoch 119/500 55/55 [==============================] - 0s 152us/sample - loss: 1.1501 Epoch 120/500 55/55 [==============================] - 0s 183us/sample - loss: 1.1505 Epoch 121/500 55/55 [==============================] - 0s 164us/sample - loss: 1.1478 Epoch 122/500 55/55 [==============================] - 0s 150us/sample - loss: 1.1468 Epoch 123/500 55/55 [==============================] - 0s 186us/sample - loss: 1.1462 Epoch 124/500 55/55 [==============================] - 0s 191us/sample - loss: 1.1445 Epoch 125/500 55/55 [==============================] - 0s 168us/sample - loss: 1.1432 Epoch 126/500 55/55 [==============================] - 0s 237us/sample - loss: 1.1420 Epoch 127/500 55/55 [==============================] - 0s 190us/sample - loss: 1.1406 Epoch 128/500 55/55 [==============================] - 0s 151us/sample - loss: 1.1407 Epoch 129/500 55/55 [==============================] - 0s 224us/sample - loss: 1.1384 Epoch 130/500 55/55 [==============================] - 0s 172us/sample - loss: 1.1390 Epoch 131/500 55/55 [==============================] - 0s 267us/sample - loss: 1.1354 Epoch 132/500 55/55 [==============================] - 0s 187us/sample - loss: 1.1348 Epoch 133/500 55/55 [==============================] - 0s 175us/sample - loss: 1.1338 Epoch 134/500 55/55 [==============================] - 0s 168us/sample - loss: 1.1331 Epoch 135/500 55/55 [==============================] - 0s 192us/sample - loss: 1.1326 Epoch 136/500 55/55 [==============================] - 0s 170us/sample - loss: 1.1315 Epoch 137/500 55/55 [==============================] - 0s 182us/sample - loss: 1.1300 Epoch 138/500 55/55 [==============================] - 0s 178us/sample - loss: 1.1281 Epoch 139/500 55/55 [==============================] - 0s 143us/sample - loss: 1.1268 Epoch 140/500 55/55 [==============================] - 0s 187us/sample - loss: 1.1254 Epoch 141/500 55/55 [==============================] - 0s 157us/sample - loss: 1.1241 Epoch 142/500 55/55 [==============================] - 0s 158us/sample - loss: 1.1233 Epoch 143/500 55/55 [==============================] - 0s 162us/sample - loss: 1.1229 Epoch 144/500 55/55 [==============================] - 0s 145us/sample - loss: 1.1214 Epoch 145/500 55/55 [==============================] - 0s 122us/sample - loss: 1.1196 Epoch 146/500 55/55 [==============================] - 0s 137us/sample - loss: 1.1182 Epoch 147/500 55/55 [==============================] - 0s 141us/sample - loss: 1.1174 Epoch 148/500 55/55 [==============================] - 0s 178us/sample - loss: 1.1171 Epoch 149/500 55/55 [==============================] - 0s 182us/sample - loss: 1.1142 Epoch 150/500 55/55 [==============================] - 0s 173us/sample - loss: 1.1182 Epoch 151/500 55/55 [==============================] - 0s 186us/sample - loss: 1.1135 Epoch 152/500 55/55 [==============================] - 0s 166us/sample - loss: 1.1120 Epoch 153/500 55/55 [==============================] - 0s 166us/sample - loss: 1.1105 Epoch 154/500 55/55 [==============================] - 0s 176us/sample - loss: 1.1086 Epoch 155/500 55/55 [==============================] - 0s 153us/sample - loss: 1.1082 Epoch 156/500 55/55 [==============================] - 0s 198us/sample - loss: 1.1065 Epoch 157/500 55/55 [==============================] - 0s 157us/sample - loss: 1.1061 Epoch 158/500 55/55 [==============================] - 0s 185us/sample - loss: 1.1043 Epoch 159/500 55/55 [==============================] - 0s 239us/sample - loss: 1.1027 Epoch 160/500 55/55 [==============================] - 0s 182us/sample - loss: 1.1025 Epoch 161/500 55/55 [==============================] - 0s 163us/sample - loss: 1.1002 Epoch 162/500 55/55 [==============================] - 0s 173us/sample - loss: 1.0993 Epoch 163/500 55/55 [==============================] - 0s 174us/sample - loss: 1.0982 Epoch 164/500 55/55 [==============================] - 0s 170us/sample - loss: 1.0978 Epoch 165/500 55/55 [==============================] - 0s 152us/sample - loss: 1.0957 Epoch 166/500 55/55 [==============================] - 0s 177us/sample - loss: 1.0946 Epoch 167/500 55/55 [==============================] - 0s 171us/sample - loss: 1.0935 Epoch 168/500 55/55 [==============================] - 0s 179us/sample - loss: 1.0922 Epoch 169/500 55/55 [==============================] - 0s 168us/sample - loss: 1.0914 Epoch 170/500 55/55 [==============================] - 0s 167us/sample - loss: 1.0896 Epoch 171/500 55/55 [==============================] - 0s 133us/sample - loss: 1.0888 Epoch 172/500 55/55 [==============================] - 0s 175us/sample - loss: 1.0889 Epoch 173/500 55/55 [==============================] - 0s 160us/sample - loss: 1.0866 Epoch 174/500 55/55 [==============================] - 0s 158us/sample - loss: 1.0858 Epoch 175/500 55/55 [==============================] - 0s 152us/sample - loss: 1.0834 Epoch 176/500 55/55 [==============================] - 0s 138us/sample - loss: 1.0882 Epoch 177/500 55/55 [==============================] - 0s 155us/sample - loss: 1.0826 Epoch 178/500 55/55 [==============================] - 0s 165us/sample - loss: 1.0802 Epoch 179/500 55/55 [==============================] - 0s 218us/sample - loss: 1.0788 Epoch 180/500 55/55 [==============================] - 0s 191us/sample - loss: 1.0784 Epoch 181/500 55/55 [==============================] - 0s 181us/sample - loss: 1.0772 Epoch 182/500 55/55 [==============================] - 0s 224us/sample - loss: 1.0755 Epoch 183/500 55/55 [==============================] - 0s 178us/sample - loss: 1.0755 Epoch 184/500 55/55 [==============================] - 0s 166us/sample - loss: 1.0740 Epoch 185/500 55/55 [==============================] - 0s 198us/sample - loss: 1.0722 Epoch 186/500 55/55 [==============================] - 0s 186us/sample - loss: 1.0707 Epoch 187/500 55/55 [==============================] - 0s 194us/sample - loss: 1.0689 Epoch 188/500 55/55 [==============================] - 0s 177us/sample - loss: 1.0683 Epoch 189/500 55/55 [==============================] - 0s 173us/sample - loss: 1.0679 Epoch 190/500 55/55 [==============================] - 0s 168us/sample - loss: 1.0688 Epoch 191/500 55/55 [==============================] - 0s 222us/sample - loss: 1.0653 Epoch 192/500 55/55 [==============================] - 0s 168us/sample - loss: 1.0644 Epoch 193/500 55/55 [==============================] - 0s 173us/sample - loss: 1.0622 Epoch 194/500 55/55 [==============================] - 0s 168us/sample - loss: 1.0610 Epoch 195/500 55/55 [==============================] - 0s 169us/sample - loss: 1.0604 Epoch 196/500 55/55 [==============================] - 0s 179us/sample - loss: 1.0593 Epoch 197/500 55/55 [==============================] - 0s 147us/sample - loss: 1.0581 Epoch 198/500 55/55 [==============================] - 0s 171us/sample - loss: 1.0583 Epoch 199/500 55/55 [==============================] - 0s 170us/sample - loss: 1.0553 Epoch 200/500 55/55 [==============================] - 0s 189us/sample - loss: 1.0542 Epoch 201/500 55/55 [==============================] - 0s 153us/sample - loss: 1.0529 Epoch 202/500 55/55 [==============================] - 0s 175us/sample - loss: 1.0513 Epoch 203/500 55/55 [==============================] - 0s 197us/sample - loss: 1.0505 Epoch 204/500 55/55 [==============================] - 0s 159us/sample - loss: 1.0498 Epoch 205/500 55/55 [==============================] - 0s 190us/sample - loss: 1.0492 Epoch 206/500 55/55 [==============================] - 0s 196us/sample - loss: 1.0489 Epoch 207/500 55/55 [==============================] - 0s 177us/sample - loss: 1.0472 Epoch 208/500 55/55 [==============================] - 0s 176us/sample - loss: 1.0461 Epoch 209/500 55/55 [==============================] - 0s 153us/sample - loss: 1.0437 Epoch 210/500 55/55 [==============================] - 0s 225us/sample - loss: 1.0420 Epoch 211/500 55/55 [==============================] - 0s 164us/sample - loss: 1.0415 Epoch 212/500 55/55 [==============================] - 0s 186us/sample - loss: 1.0404 Epoch 213/500 55/55 [==============================] - 0s 173us/sample - loss: 1.0402 Epoch 214/500 55/55 [==============================] - 0s 183us/sample - loss: 1.0378 Epoch 215/500 55/55 [==============================] - 0s 151us/sample - loss: 1.0369 Epoch 216/500 55/55 [==============================] - 0s 180us/sample - loss: 1.0353 Epoch 217/500 55/55 [==============================] - 0s 172us/sample - loss: 1.0343 Epoch 218/500 55/55 [==============================] - 0s 191us/sample - loss: 1.0329 Epoch 219/500 55/55 [==============================] - 0s 161us/sample - loss: 1.0334 Epoch 220/500 55/55 [==============================] - 0s 170us/sample - loss: 1.0318 Epoch 221/500 55/55 [==============================] - 0s 242us/sample - loss: 1.0294 Epoch 222/500 55/55 [==============================] - 0s 244us/sample - loss: 1.0288 Epoch 223/500 55/55 [==============================] - 0s 181us/sample - loss: 1.0270 Epoch 224/500 55/55 [==============================] - 0s 176us/sample - loss: 1.0293 Epoch 225/500 55/55 [==============================] - 0s 176us/sample - loss: 1.0255 Epoch 226/500 55/55 [==============================] - 0s 194us/sample - loss: 1.0243 Epoch 227/500 55/55 [==============================] - 0s 167us/sample - loss: 1.0232 Epoch 228/500 55/55 [==============================] - 0s 309us/sample - loss: 1.0215 Epoch 229/500 55/55 [==============================] - 0s 174us/sample - loss: 1.0221 Epoch 230/500 55/55 [==============================] - 0s 173us/sample - loss: 1.0190 Epoch 231/500 55/55 [==============================] - 0s 178us/sample - loss: 1.0200 Epoch 232/500 55/55 [==============================] - 0s 233us/sample - loss: 1.0173 Epoch 233/500 55/55 [==============================] - 0s 172us/sample - loss: 1.0159 Epoch 234/500 55/55 [==============================] - 0s 217us/sample - loss: 1.0183 Epoch 235/500 55/55 [==============================] - 0s 184us/sample - loss: 1.0137 Epoch 236/500 55/55 [==============================] - 0s 193us/sample - loss: 1.0131 Epoch 237/500 55/55 [==============================] - 0s 143us/sample - loss: 1.0132 Epoch 238/500 55/55 [==============================] - 0s 123us/sample - loss: 1.0105 Epoch 239/500 55/55 [==============================] - 0s 130us/sample - loss: 1.0097 Epoch 240/500 55/55 [==============================] - 0s 132us/sample - loss: 1.0083 Epoch 241/500 55/55 [==============================] - 0s 129us/sample - loss: 1.0098 Epoch 242/500 55/55 [==============================] - 0s 133us/sample - loss: 1.0089 Epoch 243/500 55/55 [==============================] - 0s 163us/sample - loss: 1.0048 Epoch 244/500 55/55 [==============================] - 0s 167us/sample - loss: 1.0057 Epoch 245/500 55/55 [==============================] - 0s 163us/sample - loss: 1.0036 Epoch 246/500 55/55 [==============================] - 0s 165us/sample - loss: 1.0009 Epoch 247/500 55/55 [==============================] - 0s 160us/sample - loss: 1.0003 Epoch 248/500 55/55 [==============================] - 0s 174us/sample - loss: 1.0028 Epoch 249/500 55/55 [==============================] - 0s 162us/sample - loss: 1.0012 Epoch 250/500 55/55 [==============================] - 0s 158us/sample - loss: 0.9996 Epoch 251/500 55/55 [==============================] - 0s 121us/sample - loss: 0.9959 Epoch 252/500 55/55 [==============================] - 0s 173us/sample - loss: 0.9961 Epoch 253/500 55/55 [==============================] - 0s 187us/sample - loss: 0.9940 Epoch 254/500 55/55 [==============================] - 0s 201us/sample - loss: 0.9954 Epoch 255/500 55/55 [==============================] - 0s 169us/sample - loss: 0.9923 Epoch 256/500 55/55 [==============================] - 0s 169us/sample - loss: 0.9905 Epoch 257/500 55/55 [==============================] - 0s 142us/sample - loss: 0.9917 Epoch 258/500 55/55 [==============================] - 0s 195us/sample - loss: 0.9890 Epoch 259/500 55/55 [==============================] - 0s 155us/sample - loss: 0.9899 Epoch 260/500 55/55 [==============================] - 0s 155us/sample - loss: 0.9880 Epoch 261/500 55/55 [==============================] - 0s 169us/sample - loss: 0.9879 Epoch 262/500 55/55 [==============================] - 0s 158us/sample - loss: 0.9853 Epoch 263/500 55/55 [==============================] - 0s 192us/sample - loss: 0.9846 Epoch 264/500 55/55 [==============================] - 0s 177us/sample - loss: 0.9824 Epoch 265/500 55/55 [==============================] - 0s 221us/sample - loss: 0.9831 Epoch 266/500 55/55 [==============================] - 0s 146us/sample - loss: 0.9835 Epoch 267/500 55/55 [==============================] - 0s 144us/sample - loss: 0.9796 Epoch 268/500 55/55 [==============================] - 0s 209us/sample - loss: 0.9815 Epoch 269/500 55/55 [==============================] - 0s 193us/sample - loss: 0.9775 Epoch 270/500 55/55 [==============================] - 0s 272us/sample - loss: 0.9765 Epoch 271/500 55/55 [==============================] - 0s 153us/sample - loss: 0.9748 Epoch 272/500 55/55 [==============================] - 0s 131us/sample - loss: 0.9736 Epoch 273/500 55/55 [==============================] - 0s 148us/sample - loss: 0.9733 Epoch 274/500 55/55 [==============================] - 0s 180us/sample - loss: 0.9721 Epoch 275/500 55/55 [==============================] - 0s 156us/sample - loss: 0.9729 Epoch 276/500 55/55 [==============================] - 0s 127us/sample - loss: 0.9722 Epoch 277/500 55/55 [==============================] - 0s 154us/sample - loss: 0.9689 Epoch 278/500 55/55 [==============================] - 0s 158us/sample - loss: 0.9671 Epoch 279/500 55/55 [==============================] - 0s 143us/sample - loss: 0.9671 Epoch 280/500 55/55 [==============================] - 0s 126us/sample - loss: 0.9670 Epoch 281/500 55/55 [==============================] - 0s 160us/sample - loss: 0.9687 Epoch 282/500 55/55 [==============================] - 0s 118us/sample - loss: 0.9674 Epoch 283/500 55/55 [==============================] - 0s 140us/sample - loss: 0.9657 Epoch 284/500 55/55 [==============================] - 0s 131us/sample - loss: 0.9639 Epoch 285/500 55/55 [==============================] - 0s 298us/sample - loss: 0.9614 Epoch 286/500 55/55 [==============================] - 0s 204us/sample - loss: 0.9594 Epoch 287/500 55/55 [==============================] - 0s 199us/sample - loss: 0.9600 Epoch 288/500 55/55 [==============================] - 0s 187us/sample - loss: 0.9596 Epoch 289/500 55/55 [==============================] - 0s 176us/sample - loss: 0.9588 Epoch 290/500 55/55 [==============================] - 0s 184us/sample - loss: 0.9576 Epoch 291/500 55/55 [==============================] - 0s 191us/sample - loss: 0.9568 Epoch 292/500 55/55 [==============================] - 0s 272us/sample - loss: 0.9545 Epoch 293/500 55/55 [==============================] - 0s 193us/sample - loss: 0.9530 Epoch 294/500 55/55 [==============================] - 0s 232us/sample - loss: 0.9527 Epoch 295/500 55/55 [==============================] - 0s 189us/sample - loss: 0.9520 Epoch 296/500 55/55 [==============================] - 0s 159us/sample - loss: 0.9513 Epoch 297/500 55/55 [==============================] - 0s 173us/sample - loss: 0.9495 Epoch 298/500 55/55 [==============================] - 0s 204us/sample - loss: 0.9486 Epoch 299/500 55/55 [==============================] - 0s 227us/sample - loss: 0.9486 Epoch 300/500 55/55 [==============================] - 0s 199us/sample - loss: 0.9491 Epoch 301/500 55/55 [==============================] - 0s 187us/sample - loss: 0.9483 Epoch 302/500 55/55 [==============================] - 0s 201us/sample - loss: 0.9446 Epoch 303/500 55/55 [==============================] - 0s 209us/sample - loss: 0.9448 Epoch 304/500 55/55 [==============================] - 0s 204us/sample - loss: 0.9427 Epoch 305/500 55/55 [==============================] - 0s 224us/sample - loss: 0.9460 Epoch 306/500 55/55 [==============================] - 0s 210us/sample - loss: 0.9423 Epoch 307/500 55/55 [==============================] - 0s 187us/sample - loss: 0.9403 Epoch 308/500 55/55 [==============================] - 0s 227us/sample - loss: 0.9386 Epoch 309/500 55/55 [==============================] - 0s 253us/sample - loss: 0.9394 Epoch 310/500 55/55 [==============================] - 0s 159us/sample - loss: 0.9370 Epoch 311/500 55/55 [==============================] - 0s 232us/sample - loss: 0.9378 Epoch 312/500 55/55 [==============================] - 0s 177us/sample - loss: 0.9373 Epoch 313/500 55/55 [==============================] - 0s 237us/sample - loss: 0.9338 Epoch 314/500 55/55 [==============================] - 0s 209us/sample - loss: 0.9354 Epoch 315/500 55/55 [==============================] - 0s 259us/sample - loss: 0.9329 Epoch 316/500 55/55 [==============================] - 0s 140us/sample - loss: 0.9312 Epoch 317/500 55/55 [==============================] - 0s 247us/sample - loss: 0.9308 Epoch 318/500 55/55 [==============================] - 0s 197us/sample - loss: 0.9304 Epoch 319/500 55/55 [==============================] - 0s 196us/sample - loss: 0.9290 Epoch 320/500 55/55 [==============================] - 0s 204us/sample - loss: 0.9282 Epoch 321/500 55/55 [==============================] - 0s 154us/sample - loss: 0.9271 Epoch 322/500 55/55 [==============================] - 0s 183us/sample - loss: 0.9259 Epoch 323/500 55/55 [==============================] - 0s 152us/sample - loss: 0.9251 Epoch 324/500 55/55 [==============================] - 0s 145us/sample - loss: 0.9238 Epoch 325/500 55/55 [==============================] - 0s 168us/sample - loss: 0.9235 Epoch 326/500 55/55 [==============================] - 0s 142us/sample - loss: 0.9226 Epoch 327/500 55/55 [==============================] - 0s 120us/sample - loss: 0.9217 Epoch 328/500 55/55 [==============================] - 0s 169us/sample - loss: 0.9205 Epoch 329/500 55/55 [==============================] - 0s 192us/sample - loss: 0.9195 Epoch 330/500 55/55 [==============================] - 0s 160us/sample - loss: 0.9196 Epoch 331/500 55/55 [==============================] - 0s 164us/sample - loss: 0.9176 Epoch 332/500 55/55 [==============================] - 0s 156us/sample - loss: 0.9180 Epoch 333/500 55/55 [==============================] - 0s 182us/sample - loss: 0.9165 Epoch 334/500 55/55 [==============================] - 0s 221us/sample - loss: 0.9213 Epoch 335/500 55/55 [==============================] - 0s 145us/sample - loss: 0.9164 Epoch 336/500 55/55 [==============================] - 0s 165us/sample - loss: 0.9143 Epoch 337/500 55/55 [==============================] - 0s 187us/sample - loss: 0.9133 Epoch 338/500 55/55 [==============================] - 0s 186us/sample - loss: 0.9136 Epoch 339/500 55/55 [==============================] - 0s 178us/sample - loss: 0.9116 Epoch 340/500 55/55 [==============================] - 0s 204us/sample - loss: 0.9105 Epoch 341/500 55/55 [==============================] - 0s 132us/sample - loss: 0.9098 Epoch 342/500 55/55 [==============================] - 0s 131us/sample - loss: 0.9085 Epoch 343/500 55/55 [==============================] - 0s 164us/sample - loss: 0.9100 Epoch 344/500 55/55 [==============================] - 0s 161us/sample - loss: 0.9083 Epoch 345/500 55/55 [==============================] - 0s 169us/sample - loss: 0.9078 Epoch 346/500 55/55 [==============================] - 0s 182us/sample - loss: 0.9083 Epoch 347/500 55/55 [==============================] - 0s 187us/sample - loss: 0.9063 Epoch 348/500 55/55 [==============================] - 0s 171us/sample - loss: 0.9062 Epoch 349/500 55/55 [==============================] - 0s 173us/sample - loss: 0.9031 Epoch 350/500 55/55 [==============================] - 0s 171us/sample - loss: 0.9028 Epoch 351/500 55/55 [==============================] - 0s 189us/sample - loss: 0.9013 Epoch 352/500 55/55 [==============================] - 0s 175us/sample - loss: 0.9027 Epoch 353/500 55/55 [==============================] - 0s 185us/sample - loss: 0.9004 Epoch 354/500 55/55 [==============================] - 0s 171us/sample - loss: 0.8984 Epoch 355/500 55/55 [==============================] - 0s 168us/sample - loss: 0.9019 Epoch 356/500 55/55 [==============================] - 0s 142us/sample - loss: 0.8983 Epoch 357/500 55/55 [==============================] - 0s 122us/sample - loss: 0.8996 Epoch 358/500 55/55 [==============================] - 0s 126us/sample - loss: 0.8965 Epoch 359/500 55/55 [==============================] - 0s 141us/sample - loss: 0.8961 Epoch 360/500 55/55 [==============================] - 0s 118us/sample - loss: 0.8942 Epoch 361/500 55/55 [==============================] - 0s 126us/sample - loss: 0.8944 Epoch 362/500 55/55 [==============================] - 0s 131us/sample - loss: 0.8934 Epoch 363/500 55/55 [==============================] - 0s 148us/sample - loss: 0.8952 Epoch 364/500 55/55 [==============================] - 0s 175us/sample - loss: 0.8928 Epoch 365/500 55/55 [==============================] - 0s 170us/sample - loss: 0.8917 Epoch 366/500 55/55 [==============================] - 0s 176us/sample - loss: 0.8963 Epoch 367/500 55/55 [==============================] - 0s 164us/sample - loss: 0.8898 Epoch 368/500 55/55 [==============================] - 0s 134us/sample - loss: 0.8891 Epoch 369/500 55/55 [==============================] - 0s 166us/sample - loss: 0.8903 Epoch 370/500 55/55 [==============================] - 0s 155us/sample - loss: 0.8874 Epoch 371/500 55/55 [==============================] - 0s 165us/sample - loss: 0.8870 Epoch 372/500 55/55 [==============================] - 0s 174us/sample - loss: 0.8901 Epoch 373/500 55/55 [==============================] - 0s 184us/sample - loss: 0.8850 Epoch 374/500 55/55 [==============================] - 0s 180us/sample - loss: 0.8852 Epoch 375/500 55/55 [==============================] - 0s 221us/sample - loss: 0.8855 Epoch 376/500 55/55 [==============================] - 0s 223us/sample - loss: 0.8840 Epoch 377/500 55/55 [==============================] - 0s 195us/sample - loss: 0.8845 Epoch 378/500 55/55 [==============================] - 0s 195us/sample - loss: 0.8818 Epoch 379/500 55/55 [==============================] - 0s 211us/sample - loss: 0.8850 Epoch 380/500 55/55 [==============================] - 0s 212us/sample - loss: 0.8826 Epoch 381/500 55/55 [==============================] - 0s 180us/sample - loss: 0.8805 Epoch 382/500 55/55 [==============================] - 0s 207us/sample - loss: 0.8795 Epoch 383/500 55/55 [==============================] - 0s 204us/sample - loss: 0.8779 Epoch 384/500 55/55 [==============================] - 0s 190us/sample - loss: 0.8775 Epoch 385/500 55/55 [==============================] - 0s 196us/sample - loss: 0.8774 Epoch 386/500 55/55 [==============================] - 0s 180us/sample - loss: 0.8840 Epoch 387/500 55/55 [==============================] - 0s 192us/sample - loss: 0.8803 Epoch 388/500 55/55 [==============================] - 0s 184us/sample - loss: 0.8778 Epoch 389/500 55/55 [==============================] - 0s 200us/sample - loss: 0.8762 Epoch 390/500 55/55 [==============================] - 0s 156us/sample - loss: 0.8741 Epoch 391/500 55/55 [==============================] - 0s 166us/sample - loss: 0.8734 Epoch 392/500 55/55 [==============================] - 0s 168us/sample - loss: 0.8716 Epoch 393/500 55/55 [==============================] - 0s 160us/sample - loss: 0.8715 Epoch 394/500 55/55 [==============================] - 0s 178us/sample - loss: 0.8715 Epoch 395/500 55/55 [==============================] - 0s 178us/sample - loss: 0.8712 Epoch 396/500 55/55 [==============================] - 0s 211us/sample - loss: 0.8708 Epoch 397/500 55/55 [==============================] - 0s 189us/sample - loss: 0.8698 Epoch 398/500 55/55 [==============================] - 0s 180us/sample - loss: 0.8702 Epoch 399/500 55/55 [==============================] - 0s 198us/sample - loss: 0.8674 Epoch 400/500 55/55 [==============================] - 0s 287us/sample - loss: 0.8669 Epoch 401/500 55/55 [==============================] - 0s 299us/sample - loss: 0.8676 Epoch 402/500 55/55 [==============================] - 0s 252us/sample - loss: 0.8670 Epoch 403/500 55/55 [==============================] - 0s 193us/sample - loss: 0.8655 Epoch 404/500 55/55 [==============================] - 0s 203us/sample - loss: 0.8652 Epoch 405/500 55/55 [==============================] - 0s 225us/sample - loss: 0.8633 Epoch 406/500 55/55 [==============================] - 0s 185us/sample - loss: 0.8715 Epoch 407/500 55/55 [==============================] - 0s 181us/sample - loss: 0.8635 Epoch 408/500 55/55 [==============================] - 0s 172us/sample - loss: 0.8627 Epoch 409/500 55/55 [==============================] - 0s 190us/sample - loss: 0.8610 Epoch 410/500 55/55 [==============================] - 0s 178us/sample - loss: 0.8639 Epoch 411/500 55/55 [==============================] - 0s 164us/sample - loss: 0.8602 Epoch 412/500 55/55 [==============================] - 0s 177us/sample - loss: 0.8600 Epoch 413/500 55/55 [==============================] - 0s 173us/sample - loss: 0.8615 Epoch 414/500 55/55 [==============================] - 0s 169us/sample - loss: 0.8601 Epoch 415/500 55/55 [==============================] - 0s 158us/sample - loss: 0.8579 Epoch 416/500 55/55 [==============================] - 0s 154us/sample - loss: 0.8571 Epoch 417/500 55/55 [==============================] - 0s 154us/sample - loss: 0.8569 Epoch 418/500 55/55 [==============================] - 0s 169us/sample - loss: 0.8564 Epoch 419/500 55/55 [==============================] - 0s 204us/sample - loss: 0.8554 Epoch 420/500 55/55 [==============================] - 0s 129us/sample - loss: 0.8560 Epoch 421/500 55/55 [==============================] - 0s 161us/sample - loss: 0.8544 Epoch 422/500 55/55 [==============================] - 0s 198us/sample - loss: 0.8539 Epoch 423/500 55/55 [==============================] - 0s 183us/sample - loss: 0.8530 Epoch 424/500 55/55 [==============================] - 0s 233us/sample - loss: 0.8524 Epoch 425/500 55/55 [==============================] - 0s 206us/sample - loss: 0.8522 Epoch 426/500 55/55 [==============================] - 0s 203us/sample - loss: 0.8545 Epoch 427/500 55/55 [==============================] - 0s 160us/sample - loss: 0.8509 Epoch 428/500 55/55 [==============================] - 0s 184us/sample - loss: 0.8530 Epoch 429/500 55/55 [==============================] - 0s 160us/sample - loss: 0.8525 Epoch 430/500 55/55 [==============================] - 0s 188us/sample - loss: 0.8539 Epoch 431/500 55/55 [==============================] - 0s 179us/sample - loss: 0.8500 Epoch 432/500 55/55 [==============================] - 0s 167us/sample - loss: 0.8502 Epoch 433/500 55/55 [==============================] - 0s 152us/sample - loss: 0.8490 Epoch 434/500 55/55 [==============================] - 0s 164us/sample - loss: 0.8481 Epoch 435/500 55/55 [==============================] - 0s 136us/sample - loss: 0.8477 Epoch 436/500 55/55 [==============================] - 0s 156us/sample - loss: 0.8497 Epoch 437/500 55/55 [==============================] - 0s 179us/sample - loss: 0.8461 Epoch 438/500 55/55 [==============================] - 0s 176us/sample - loss: 0.8459 Epoch 439/500 55/55 [==============================] - 0s 169us/sample - loss: 0.8454 Epoch 440/500 55/55 [==============================] - 0s 253us/sample - loss: 0.8447 Epoch 441/500 55/55 [==============================] - 0s 148us/sample - loss: 0.8453 Epoch 442/500 55/55 [==============================] - 0s 168us/sample - loss: 0.8452 Epoch 443/500 55/55 [==============================] - 0s 167us/sample - loss: 0.8424 Epoch 444/500 55/55 [==============================] - 0s 171us/sample - loss: 0.8446 Epoch 445/500 55/55 [==============================] - 0s 154us/sample - loss: 0.8414 Epoch 446/500 55/55 [==============================] - 0s 168us/sample - loss: 0.8413 Epoch 447/500 55/55 [==============================] - 0s 169us/sample - loss: 0.8402 Epoch 448/500 55/55 [==============================] - 0s 171us/sample - loss: 0.8396 Epoch 449/500 55/55 [==============================] - 0s 160us/sample - loss: 0.8390 Epoch 450/500 55/55 [==============================] - 0s 160us/sample - loss: 0.8388 Epoch 451/500 55/55 [==============================] - 0s 166us/sample - loss: 0.8385 Epoch 452/500 55/55 [==============================] - 0s 156us/sample - loss: 0.8386 Epoch 453/500 55/55 [==============================] - 0s 156us/sample - loss: 0.8391 Epoch 454/500 55/55 [==============================] - 0s 329us/sample - loss: 0.8365 Epoch 455/500 55/55 [==============================] - 0s 146us/sample - loss: 0.8362 Epoch 456/500 55/55 [==============================] - 0s 166us/sample - loss: 0.8389 Epoch 457/500 55/55 [==============================] - 0s 167us/sample - loss: 0.8349 Epoch 458/500 55/55 [==============================] - 0s 156us/sample - loss: 0.8389 Epoch 459/500 55/55 [==============================] - 0s 157us/sample - loss: 0.8348 Epoch 460/500 55/55 [==============================] - 0s 167us/sample - loss: 0.8370 Epoch 461/500 55/55 [==============================] - 0s 180us/sample - loss: 0.8340 Epoch 462/500 55/55 [==============================] - 0s 168us/sample - loss: 0.8329 Epoch 463/500 55/55 [==============================] - 0s 165us/sample - loss: 0.8323 Epoch 464/500 55/55 [==============================] - 0s 224us/sample - loss: 0.8321 Epoch 465/500 55/55 [==============================] - 0s 197us/sample - loss: 0.8316 Epoch 466/500 55/55 [==============================] - 0s 191us/sample - loss: 0.8313 Epoch 467/500 55/55 [==============================] - 0s 183us/sample - loss: 0.8306 Epoch 468/500 55/55 [==============================] - 0s 193us/sample - loss: 0.8335 Epoch 469/500 55/55 [==============================] - 0s 175us/sample - loss: 0.8301 Epoch 470/500 55/55 [==============================] - 0s 168us/sample - loss: 0.8299 Epoch 471/500 55/55 [==============================] - 0s 189us/sample - loss: 0.8293 Epoch 472/500 55/55 [==============================] - 0s 187us/sample - loss: 0.8291 Epoch 473/500 55/55 [==============================] - 0s 177us/sample - loss: 0.8320 Epoch 474/500 55/55 [==============================] - 0s 178us/sample - loss: 0.8292 Epoch 475/500 55/55 [==============================] - 0s 176us/sample - loss: 0.8290 Epoch 476/500 55/55 [==============================] - 0s 155us/sample - loss: 0.8269 Epoch 477/500 55/55 [==============================] - 0s 201us/sample - loss: 0.8272 Epoch 478/500 55/55 [==============================] - 0s 207us/sample - loss: 0.8260 Epoch 479/500 55/55 [==============================] - 0s 190us/sample - loss: 0.8264 Epoch 480/500 55/55 [==============================] - 0s 202us/sample - loss: 0.8253 Epoch 481/500 55/55 [==============================] - 0s 169us/sample - loss: 0.8292 Epoch 482/500 55/55 [==============================] - 0s 157us/sample - loss: 0.8242 Epoch 483/500 55/55 [==============================] - 0s 227us/sample - loss: 0.8251 Epoch 484/500 55/55 [==============================] - 0s 185us/sample - loss: 0.8241 Epoch 485/500 55/55 [==============================] - 0s 169us/sample - loss: 0.8233 Epoch 486/500 55/55 [==============================] - 0s 190us/sample - loss: 0.8230 Epoch 487/500 55/55 [==============================] - 0s 182us/sample - loss: 0.8222 Epoch 488/500 55/55 [==============================] - 0s 196us/sample - loss: 0.8226 Epoch 489/500 55/55 [==============================] - 0s 182us/sample - loss: 0.8286 Epoch 490/500 55/55 [==============================] - 0s 148us/sample - loss: 0.8239 Epoch 491/500 55/55 [==============================] - 0s 238us/sample - loss: 0.8213 Epoch 492/500 55/55 [==============================] - 0s 194us/sample - loss: 0.8217 Epoch 493/500 55/55 [==============================] - 0s 230us/sample - loss: 0.8216 Epoch 494/500 55/55 [==============================] - 0s 118us/sample - loss: 0.8215 Epoch 495/500 55/55 [==============================] - 0s 132us/sample - loss: 0.8191 Epoch 496/500 55/55 [==============================] - 0s 141us/sample - loss: 0.8195 Epoch 497/500 55/55 [==============================] - 0s 155us/sample - loss: 0.8185 Epoch 498/500 55/55 [==============================] - 0s 167us/sample - loss: 0.8189 Epoch 499/500 55/55 [==============================] - 0s 258us/sample - loss: 0.8186 Epoch 500/500 55/55 [==============================] - 0s 124us/sample - loss: 0.8172
আমরা সামনের জুপিটার/কোলাব নোটবুকে আরো উদাহরণ দেখবো। ঘাবড়াবেন না।
বরাবরের মতো ফিট মেথডটার আউটপুট একটা অবজেক্ট এ ফেরত পাঠাচ্ছি। এখানকার অবজেক্টের নাম বলছি হিস্ট্রি, সেটা যে কোন নামেই হতে পারে। এখন এই অবজেক্টকে ঠিকমতো প্লট করলে বোঝা যাবে প্রতিটা ট্রেনিং এর সাথে কিভাবে মডেলের লস কমে আসে। শুরুর দিকের বেশি লস - মানে হচ্ছে আমরা যে তাপমাত্রাকে প্রেডিক্ট করতে চাচ্ছি, তার থেকে ট্রেনিং ডাটাবেজে যে তাপমাত্রা আছে সেটা আসলে বেশি ছিল। বেশি ইপকের সাথে সাথে কমে এসেছে সেই লস এর মাত্রা।
আগের বইয়ের মত আমরা এখানে ‘ম্যাটপ্লটলিব’ লাইব্রেরি ব্যবহার করছি ডেটা ভিজুয়ালাইজেশন এর জন্য। ভালোভাবে লক্ষ্য করলেই বোঝা যাবে আমাদের মডেল শুরুতেই কিন্তু কমিয়ে নিয়েছে লসের মাত্রা, তবে মাঝে সেটা একটু কমে গিয়েছিল যার শেষের দিকে সেটা একদম শূন্যের কাছাকাছি চলে গিয়েছে। এর মানে হচ্ছে মডেলটা অনেকটাই ভালো পারফরম্যান্স দেবে।
import matplotlib.pyplot as plt
plt.xlabel('Epoch Number')
plt.ylabel("Loss Level")
plt.plot(history.history['loss'])
[<matplotlib.lines.Line2D at 0x7fde74379b00>]
আমাদের হাতে চলে এলো এমন একটা মডেল যাকে ট্রেইন করা হয়েছে আমাদের ১৫ সেকেন্ডের ঝিঁঝিঁপোকার ডাকের সংখ্যার সাথে তার করেসপন্ডিং তাপমাত্রা। তাহলে তো আমরা একটা অজানা ১৫ সেকেন্ডের ঝিঁঝিঁ পোকার ডাক এর সংখ্যা দিলে মডেল বলে দিতে পারবে ওই মুহূর্তের তাপমাত্রা। ভুল বললাম?
আমাদেরকে দেখতে হবে কোন ডাটাটা সেই ৫৫টা রেকর্ড এর মধ্যে নেই।
৩৪, মানে ১৫ সেকেন্ডের ঝিঁঝিঁপোকার ডাকের সংখ্যা = ৩৪
এখন প্রেডিক্ট করতে হবে ওই সময়ে তাপমাত্রা কতো ছিলো? পারবোনা?
print(model.predict([34]))
[[21.358658]]
এর আসল উত্তর হবে $34 \times 0.49543811976 + 4.45863851637 = 21.303534$, এর মানে হচ্ছে আমাদের মডেল একদম প্রায় মিলিয়ে দিয়েছে।
আমাদের মডেল ডেন্স লেয়ারে ইন্টারনাল ভ্যারিয়েবল (ওয়েট)গুলোকে সেভাবেই টিউন করেছে যাতে ঠিক তাপমাত্রাটা বলতে পারে যদি কেউ ১৫ সেকেন্ডের ওই সময়ের ঝিঁঝিঁপোকার ডাকের সংখ্যা দিতে পারেন।
আমরা অনেক্ষন ডেন্স লেয়ারের ভেতর ইন্টারনাল ভ্যারিয়েবলের কথা বলেছি। সেটা কি খালি চোখে দেখা যাবে না? অবশ্যই যাবে।
কেরাসের লেয়ারের_নাম.get_weights()
দিলেই চলে আসবে নামপাই অ্যারের লিস্ট হিসেবে।
l0.get_weights()
[array([[0.518712]], dtype=float32), array([3.7224503], dtype=float32)]
তাহলে আমাদের ফর্মুলা কি ছিলো?
y = 0.49543811976X + 4.45863851637 [y = mX + b]
আমাদের প্রথম ভ্যারিয়েবল m হচ্ছে ~0.4954 আর পরেরটা মানে b হচ্ছে ~4.4586. এর অর্থ হচ্ছে আমাদের মেশিন লার্নিং মডেল ইনপুট ডেটা থেকে ফর্মুলা বের করে ফেলেছে। এটাই চাইছিলাম আমরা। যেহেতু এটা মাত্র একটা লেয়ার, একটা নিউরন - সেকারণে এর আউটকাম এসেছে একটা লাইনের ইকুয়েশনের মতো।