কনভোল্যুশনাল নিউরাল নেটওয়ার্ক (সিএনএন)

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

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

টেনসরফ্লো আমদানি করুন

import tensorflow as tf

from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

ডাউনলোড করুন এবং CIFAR10 ডেটাসেট প্রস্তুত করুন

CIFAR10 ডেটাসেটে 10টি ক্লাসে 60,000টি রঙিন ছবি রয়েছে, প্রতিটি ক্লাসে 6,000টি ছবি রয়েছে। ডেটাসেটটি 50,000টি প্রশিক্ষণের চিত্র এবং 10,000টি পরীক্ষার চিত্রে বিভক্ত। ক্লাসগুলি পারস্পরিকভাবে একচেটিয়া এবং তাদের মধ্যে কোন ওভারল্যাপ নেই।

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 11s 0us/step
170508288/170498071 [==============================] - 11s 0us/step

ডেটা যাচাই করুন

ডেটাসেটটি সঠিক দেখাচ্ছে কিনা তা যাচাই করতে, আসুন প্রশিক্ষণ সেট থেকে প্রথম 25টি ছবি প্লট করি এবং প্রতিটি ছবির নীচে ক্লাসের নাম প্রদর্শন করি:

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
               'dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i])
    # The CIFAR labels happen to be arrays, 
    # which is why you need the extra index
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()

png

কনভোল্যুশনাল বেস তৈরি করুন

নীচের কোডের 6টি লাইন একটি সাধারণ প্যাটার্ন ব্যবহার করে কনভোলিউশনাল বেসকে সংজ্ঞায়িত করে: Conv2D এবং MaxPooling2D স্তরগুলির একটি স্ট্যাক।

ইনপুট হিসাবে, একটি CNN ব্যাচের আকার উপেক্ষা করে আকারের টেনসর (ছবির_উচ্চতা, চিত্র_প্রস্থ, রঙ_চ্যানেল) নেয়। আপনি যদি এই মাত্রাগুলিতে নতুন হন, রঙ_চ্যানেলগুলিকে বোঝায় (R,G,B)। এই উদাহরণে, আপনি আকৃতির ইনপুটগুলি প্রক্রিয়া করার জন্য আপনার CNN কনফিগার করবেন (32, 32, 3), যা CIFAR চিত্রগুলির বিন্যাস। আপনি আপনার প্রথম স্তরে যুক্তি input_shape পাস করে এটি করতে পারেন।

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

এখন পর্যন্ত আপনার মডেলের আর্কিটেকচার প্রদর্শন করা যাক:

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 30, 30, 32)        896       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 15, 15, 32)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 13, 13, 64)        18496     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 6, 6, 64)         0         
 2D)                                                             
                                                                 
 conv2d_2 (Conv2D)           (None, 4, 4, 64)          36928     
                                                                 
=================================================================
Total params: 56,320
Trainable params: 56,320
Non-trainable params: 0
_________________________________________________________________

উপরে, আপনি দেখতে পাচ্ছেন যে প্রতিটি Conv2D এবং MaxPooling2D স্তরের আউটপুট আকৃতির একটি 3D টেনসর (উচ্চতা, প্রস্থ, চ্যানেল)। আপনি নেটওয়ার্কের গভীরে যাওয়ার সাথে সাথে প্রস্থ এবং উচ্চতার মাত্রাগুলি সঙ্কুচিত হতে থাকে। প্রতিটি Conv2D স্তরের জন্য আউটপুট চ্যানেলের সংখ্যা প্রথম আর্গুমেন্ট দ্বারা নিয়ন্ত্রিত হয় (যেমন, 32 বা 64)। সাধারণত, প্রস্থ এবং উচ্চতা সঙ্কুচিত হওয়ার সাথে সাথে, আপনি প্রতিটি Conv2D স্তরে আরও আউটপুট চ্যানেল যুক্ত করতে (গণনাগতভাবে) সামর্থ্য রাখতে পারেন।

উপরে ঘন স্তর যোগ করুন

মডেলটি সম্পূর্ণ করার জন্য, আপনি শ্রেণীবিন্যাস সম্পাদন করতে কনভোল্যুশনাল বেস (আকৃতির (4, 4, 64)) থেকে শেষ আউটপুট টেনসরকে এক বা একাধিক ঘন স্তরে ফিড করবেন। ঘন স্তরগুলি ভেক্টরকে ইনপুট হিসাবে গ্রহণ করে (যা 1D), যখন বর্তমান আউটপুট একটি 3D টেনসর। প্রথমে, আপনি 3D আউটপুটকে 1D তে সমতল (বা আনরোল) করবেন, তারপরে উপরে এক বা একাধিক ঘন স্তর যুক্ত করবেন। CIFAR-এর 10টি আউটপুট ক্লাস রয়েছে, তাই আপনি 10টি আউটপুট সহ একটি চূড়ান্ত ঘন স্তর ব্যবহার করুন৷

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

এখানে আপনার মডেলের সম্পূর্ণ আর্কিটেকচার রয়েছে:

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 30, 30, 32)        896       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 15, 15, 32)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 13, 13, 64)        18496     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 6, 6, 64)         0         
 2D)                                                             
                                                                 
 conv2d_2 (Conv2D)           (None, 4, 4, 64)          36928     
                                                                 
 flatten (Flatten)           (None, 1024)              0         
                                                                 
 dense (Dense)               (None, 64)                65600     
                                                                 
 dense_1 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 122,570
Trainable params: 122,570
Non-trainable params: 0
_________________________________________________________________

নেটওয়ার্ক সারাংশ দেখায় যে (4, 4, 64) আউটপুট দুটি ঘন স্তরের মধ্য দিয়ে যাওয়ার আগে আকৃতির ভেক্টরে (1024) সমতল করা হয়েছিল।

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

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))
Epoch 1/10
1563/1563 [==============================] - 8s 4ms/step - loss: 1.4971 - accuracy: 0.4553 - val_loss: 1.2659 - val_accuracy: 0.5492
Epoch 2/10
1563/1563 [==============================] - 6s 4ms/step - loss: 1.1424 - accuracy: 0.5966 - val_loss: 1.1025 - val_accuracy: 0.6098
Epoch 3/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.9885 - accuracy: 0.6539 - val_loss: 0.9557 - val_accuracy: 0.6629
Epoch 4/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.8932 - accuracy: 0.6878 - val_loss: 0.8924 - val_accuracy: 0.6935
Epoch 5/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.8222 - accuracy: 0.7130 - val_loss: 0.8679 - val_accuracy: 0.7025
Epoch 6/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.7663 - accuracy: 0.7323 - val_loss: 0.9336 - val_accuracy: 0.6819
Epoch 7/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.7224 - accuracy: 0.7466 - val_loss: 0.8546 - val_accuracy: 0.7086
Epoch 8/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.6726 - accuracy: 0.7611 - val_loss: 0.8777 - val_accuracy: 0.7068
Epoch 9/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.6372 - accuracy: 0.7760 - val_loss: 0.8410 - val_accuracy: 0.7179
Epoch 10/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.6024 - accuracy: 0.7875 - val_loss: 0.8475 - val_accuracy: 0.7192

মডেল মূল্যায়ন

plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)
313/313 - 1s - loss: 0.8475 - accuracy: 0.7192 - 634ms/epoch - 2ms/step

png

print(test_acc)
0.7192000150680542

আপনার সাধারণ CNN 70% এর বেশি পরীক্ষা নির্ভুলতা অর্জন করেছে। কোড কয়েক লাইন জন্য খারাপ না! অন্য CNN স্টাইলের জন্য, কেরাস সাবক্লাসিং API এবং tf.GradientTape ব্যবহার করে বিশেষজ্ঞদের উদাহরণের জন্য TensorFlow 2 Quickstart দেখুন।