কম্পিউটারের দৃষ্টিশক্তি বাড়াতে কনভোলিউশনাল নিউরাল নেটওয়ার্ক (সিএনএন) তৈরি করুন

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

এই কোডল্যাবে, আপনি আপনার ইমেজ শ্রেণীবিভাগ মডেল উন্নত করতে CNN ব্যবহার করতে শিখবেন।

পূর্বশর্ত

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

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

  • কনভল্যুশনের সাথে কম্পিউটারের দৃষ্টি এবং নির্ভুলতা কীভাবে উন্নত করা যায়

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

  • আপনার নিউরাল নেটওয়ার্ক উন্নত করতে স্তরগুলি

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

আপনি Colab- এ চলমান বাকি কোডল্যাবের কোড খুঁজে পেতে পারেন।

আপনাকে টেনসরফ্লো ইনস্টল করতে হবে, এবং আগের কোডল্যাবে আপনি যে লাইব্রেরিগুলি ইনস্টল করেছেন।

2. কনভল্যুশনের সাথে কম্পিউটারের দৃষ্টি সঠিকতা উন্নত করুন

আপনি এখন জানেন কিভাবে একটি ডিপ নিউরাল নেটওয়ার্ক (DNN) ব্যবহার করে ফ্যাশন ইমেজ রিকগনিশন করতে হয় যার মধ্যে তিনটি স্তর রয়েছে- ইনপুট স্তর (ইনপুট ডেটার আকারে), আউটপুট স্তর (কাঙ্খিত আউটপুটের আকারে) এবং একটি লুকানো স্তর। . আপনি বেশ কয়েকটি পরামিতি নিয়ে পরীক্ষা করেছেন যা চূড়ান্ত নির্ভুলতাকে প্রভাবিত করে, যেমন বিভিন্ন আকারের লুকানো স্তর এবং প্রশিক্ষণ যুগের সংখ্যা।

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

import tensorflow as tf
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(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy*100))

আপনার নির্ভুলতা সম্ভবত প্রায় 89% প্রশিক্ষণে এবং 87% বৈধতার উপর। আপনি কনভোলিউশনগুলি ব্যবহার করে এটি আরও ভাল করতে পারেন, যা নির্দিষ্ট, স্বতন্ত্র বিবরণগুলিতে ফোকাস করার জন্য চিত্রের বিষয়বস্তুকে সংকুচিত করে।

আপনি যদি কখনো ফিল্টার ব্যবহার করে ইমেজ প্রসেসিং করে থাকেন, তাহলে কনভোল্যুশনগুলো খুব পরিচিত দেখাবে।

সংক্ষেপে, আপনি একটি অ্যারে নিন (সাধারণত 3x3 বা 5x5) এবং এটি ছবিটির উপর দিয়ে দিন। সেই ম্যাট্রিক্সের মধ্যে সূত্রের উপর ভিত্তি করে অন্তর্নিহিত পিক্সেল পরিবর্তন করে, আপনি প্রান্ত সনাক্তকরণের মতো ক্রিয়াকলাপ সম্পাদন করতে পারেন। উদাহরণস্বরূপ, সাধারণত একটি 3x3 প্রান্ত সনাক্তকরণের জন্য সংজ্ঞায়িত করা হয় যেখানে মধ্যম কোষটি 8 এবং এর সমস্ত প্রতিবেশী -1। এই ক্ষেত্রে, প্রতিটি পিক্সেলের জন্য, আপনি এর মান 8 দ্বারা গুণ করবেন, তারপর প্রতিটি প্রতিবেশীর মান বিয়োগ করবেন। প্রতিটি পিক্সেলের জন্য এটি করুন, এবং আপনি একটি নতুন চিত্রের সাথে শেষ করবেন যার প্রান্তগুলি উন্নত হয়েছে৷

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

এটি কনভোলিউশনাল নিউরাল নেটওয়ার্কের ধারণা। ঘন স্তরগুলি পাওয়ার আগে কনভল্যুশন করতে কিছু স্তর যুক্ত করুন এবং তারপরে ঘন স্তরগুলিতে যাওয়া তথ্যগুলি আরও বেশি ফোকাসড এবং সম্ভবত আরও সঠিক হয়ে ওঠে।

3. কোড চেষ্টা করুন

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

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.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images / 255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)),
  tf.keras.layers.MaxPooling2D(2, 2),
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
model.fit(training_images, training_labels, epochs=5)
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy*100))

এটি সম্ভবত প্রশিক্ষণের ডেটাতে প্রায় 93% এবং বৈধতা ডেটাতে 91% পর্যন্ত চলে গেছে।

এখন এটিকে আরও যুগের জন্য চালানোর চেষ্টা করুন—বলুন প্রায় 20—এবং ফলাফলগুলি অন্বেষণ করুন৷ যদিও প্রশিক্ষণের ফলাফলগুলি সত্যিই ভাল বলে মনে হতে পারে, ওভারফিটিং নামক একটি ঘটনার কারণে বৈধতার ফলাফলগুলি আসলে কমে যেতে পারে।

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

কোডটি আবার দেখুন, এবং ধাপে ধাপে দেখুন কিভাবে কনভল্যুশন তৈরি করা হয়েছিল।

4. তথ্য সংগ্রহ করুন

প্রথম ধাপ হল তথ্য সংগ্রহ করা।

আপনি লক্ষ্য করবেন যে এখানে একটি পরিবর্তন হয়েছে এবং প্রশিক্ষণের ডেটা পুনরায় আকার দিতে হবে। এর কারণ হল প্রথম কনভোলিউশনে সবকিছু রয়েছে এমন একটি একক টেনসর আশা করে, তাই একটি তালিকায় 60,000 28x28x1 আইটেমের পরিবর্তে, আপনার কাছে একটি একক 4D তালিকা রয়েছে যা 60,000x28x28x1 এবং পরীক্ষার চিত্রগুলির জন্য একই। আপনি যদি তা না করেন, তাহলে প্রশিক্ষণের সময় আপনি একটি ত্রুটি পাবেন কারণ কনভোলিউশনগুলি আকৃতি চিনতে পারে না।

import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images = training_images/255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images = test_images/255.0

5. মডেল সংজ্ঞায়িত করুন

পরবর্তী, আপনার মডেল সংজ্ঞায়িত করুন. উপরের ইনপুট লেয়ারের পরিবর্তে, আপনি একটি কনভোলিউশনাল লেয়ার যোগ করতে যাচ্ছেন। পরামিতিগুলি হল:

  • আপনি উৎপন্ন করতে চান convolutions সংখ্যা. 32 এর মত একটি মান একটি ভাল সূচনা পয়েন্ট।
  • কনভোলিউশনাল ম্যাট্রিক্সের আকার, এই ক্ষেত্রে একটি 3x3 গ্রিড।
  • অ্যাক্টিভেশন ফাংশন ব্যবহার করার জন্য, এই ক্ষেত্রে relu ব্যবহার করুন।
  • প্রথম স্তরে, ইনপুট ডেটার আকার।

আপনি একটি সর্বাধিক পুলিং লেয়ারের সাথে কনভোলিউশন অনুসরণ করবেন, যা কনভোলিউশন দ্বারা হাইলাইট করা বৈশিষ্ট্যগুলির বিষয়বস্তু বজায় রেখে চিত্রটিকে সংকুচিত করার জন্য ডিজাইন করা হয়েছে। সর্বোচ্চ পুলিংয়ের জন্য (2,2) নির্দিষ্ট করে, প্রভাবটি হল 4 এর একটি গুণক দ্বারা চিত্রের আকার হ্রাস করা। এটি 2x2 পিক্সেলের অ্যারে তৈরি করে এবং সবচেয়ে বড় পিক্সেল মান বাছাই করে, 4 পিক্সেলকে 1 এ পরিণত করে। এটি পুনরাবৃত্তি হয় চিত্র জুড়ে এই গণনা, এবং এইভাবে অনুভূমিক পিক্সেলের সংখ্যা অর্ধেক করে এবং উল্লম্ব পিক্সেলের সংখ্যা অর্ধেক করে।

নেটওয়ার্কের আকার এবং আকৃতি দেখতে আপনি model.summary() কল করতে পারেন। লক্ষ্য করুন যে প্রতিটি সর্বোচ্চ পুলিং স্তরের পরে, চিত্রের আকার নিম্নলিখিত উপায়ে হ্রাস করা হয়েছে:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_2 (Conv2D)            (None, 26, 26, 64)        640       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 13, 13, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 11, 11, 64)        36928     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 1600)              0         
_________________________________________________________________
dense_4 (Dense)              (None, 128)               204928    
_________________________________________________________________
dense_5 (Dense)              (None, 10)                1290      
=================================================================

এখানে CNN এর জন্য সম্পূর্ণ কোড আছে:

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2, 2),
#Add another convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
#Now flatten the output. After this you'll just have the same DNN structure as the non convolutional version
tf.keras.layers.Flatten(),
#The same 128 dense layers, and 10 output layers as in the pre-convolution example:
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])

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

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

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_acc*100))

7. কনভোলিউশন এবং পুলিং কল্পনা করুন

এই কোডটি আপনাকে গ্রাফিকভাবে কনভল্যুশন দেখায়। print (test_labels[:100]) পরীক্ষার সেটের প্রথম 100টি লেবেল দেখায় এবং আপনি দেখতে পারেন যে সূচক 0, সূচক 23 এবং সূচী 28-এর মান একই (9)। তারা সব জুতা. প্রতিটিতে কনভোলিউশন চালানোর ফলাফলটি একবার দেখুন এবং আপনি তাদের মধ্যে সাধারণ বৈশিষ্ট্যগুলি আবির্ভূত দেখতে শুরু করবেন। এখন, যখন ডিএনএন সেই ডেটার উপর প্রশিক্ষণ নিচ্ছে, তখন এটি অনেক কম তথ্য নিয়ে কাজ করছে, এবং এটি সম্ভবত সেই কনভোল্যুশন এবং পুলিং কম্বিনেশনের উপর ভিত্তি করে জুতার মধ্যে একটি সাধারণতা খুঁজে পাচ্ছে।

print(test_labels[:100])
[9 2 1 1 6 1 4 6 5 7 4 5 7 3 4 1 2 4 8 0 2 5 7 9 1 4 6 0 9 3 8 8 3 3 8 0 7
 5 7 9 6 1 3 7 6 7 2 1 2 2 4 4 5 8 2 2 8 4 8 0 7 7 8 5 1 1 2 3 9 8 7 0 2 6
 2 3 1 2 8 4 1 8 5 9 5 0 3 2 0 6 5 3 6 7 1 8 0 1 4 2]

এখন আপনি সেই লেবেলগুলির জন্য কিছু সংশ্লিষ্ট ছবি নির্বাচন করতে পারেন এবং কনভল্যুশনের মধ্য দিয়ে যাওয়ার মতো দেখতে কেমন তা রেন্ডার করতে পারেন। সুতরাং, নিম্নলিখিত কোডে, FIRST_IMAGE , SECOND_IMAGE এবং THIRD_IMAGE হল 9 মান, একটি গোড়ালি বুটের জন্য সমস্ত সূচক।

import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=23
THIRD_IMAGE=28
CONVOLUTION_NUMBER = 6
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
  f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[0,x].grid(False)
  f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[1,x].grid(False)
  f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[2,x].grid(False)

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

6c9109bcc640a1ec.png

8. ব্যায়াম

অনুশীলনী 1

কনভল্যুশন এডিট করার চেষ্টা করুন। কনভোলিউশনের সংখ্যা 32 থেকে 16 বা 64 এ পরিবর্তন করুন। এর সঠিকতা এবং প্রশিক্ষণের সময় কী প্রভাব ফেলে?

ব্যায়াম 2

চূড়ান্ত আবর্তন সরান. সঠিকতা বা প্রশিক্ষণের সময় এর উপর কি প্রভাব ফেলে?

ব্যায়াম 3

আরো convolutions যোগ করুন. কি প্রভাব যে আছে?

ব্যায়াম 4

প্রথমটি ছাড়া সমস্ত কনভল্যুশনগুলি সরান। কি প্রভাব যে আছে? এটি নিয়ে পরীক্ষা করুন।

9. অভিনন্দন

আপনি আপনার প্রথম CNN তৈরি করেছেন! কীভাবে আপনার কম্পিউটারের দৃষ্টি মডেলগুলিকে আরও উন্নত করতে হয় তা শিখতে, জটিল চিত্রগুলির সাথে কনভোলিউশনাল নিউরাল নেটওয়ার্ক (CNNs) ব্যবহার করুন