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()
কনভোল্যুশনাল বেস তৈরি করুন
নীচের কোডের 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
print(test_acc)
0.7192000150680542
আপনার সাধারণ CNN 70% এর বেশি পরীক্ষা নির্ভুলতা অর্জন করেছে। কোড কয়েক লাইন জন্য খারাপ না! অন্য CNN স্টাইলের জন্য, কেরাস সাবক্লাসিং API এবং tf.GradientTape
ব্যবহার করে বিশেষজ্ঞদের উদাহরণের জন্য TensorFlow 2 Quickstart দেখুন।