یک شبکه عصبی ایجاد کنید، آن را بر روی داده های نمونه آموزش دهید، و با تشخیص ارقام دست نویس، آن را در عمل ببینید.
شبکه های عصبی یک مفهوم مهم در زمینه هوش مصنوعی و یادگیری ماشین هستند. آنها از گره های به هم پیوسته تشکیل شده اند که در لایه ها سازماندهی شده اند و نحوه عملکرد مغز انسان را تقلید می کنند. گره ها نورون های مغز انسان را نشان می دهند.
شما میتوانید شبکه عصبی طبقهبندی چند کلاسه و پیشخور ساده خود را ایجاد کنید. آن را آموزش دهید تا ارقام دست نویس را با استفاده از مجموعه داده MNIST طبقه بندی کند. سپس می توانید از بینایی کامپیوتری برای طبقه بندی ارقام دست نویس خود استفاده کنید.
طبقه بندی چند کلاسه چیست؟
طبقه بندی چند کلاسه نوعی یادگیری ماشینی است که می تواند داده ها را به بیش از دو دسته طبقه بندی کند. شبکه های عصبی از طبقه بندی کننده سافت مکس برای توزیع احتمال بر روی کلاس های ممکن استفاده می کنند.
میتوانید از طبقهبندی چند طبقهای برای طبقهبندی تصاویر دستنویس از مجموعه دادههای MNIST به ۱۰ دسته استفاده کنید. این دسته ها با ارقام 0 تا 9 مطابقت دارند.
آشنایی با مجموعه داده های MNIST
مجموعه داده MNIST یک مجموعه داده معیار محبوب برای الگوریتم های یادگیری ماشین و بینایی کامپیوتر است. این شامل 70000 تصویر دست نویس در مقیاس خاکستری است که اندازه آنها 28 در 28 پیکسل است. ارقام دست نویس در محدوده 0 تا 9 قرار دارند.
قبل از ساخت هر مدل یادگیری ماشینی، مهم است که بدانید مجموعه داده شما شامل چه چیزی است. درک مجموعه داده به شما امکان می دهد پیش پردازش داده ها را بهتر انجام دهید.
آماده کردن محیط
برای دنبال کردن این آموزش، باید با اصول اولیه پایتون آشنا باشید. شما همچنین باید دانش اولیه ای از یادگیری ماشین داشته باشید. در نهایت، شما باید با استفاده از Jupyter Notebook یا Google Colab راحت باشید.
کد منبع کامل در a موجود است
مخزن GitHub
.
یک نوت بوک Jupyter جدید ایجاد کنید یا به Google Colab وارد شوید. این دستور را برای نصب بسته های مورد نیاز اجرا کنید:
!pip install numpy matplotlib tensorflow opencv-python
استفاده خواهید کرد:
- Matplotlib برای تجسم داده ها.
- NumPy برای دستکاری آرایه ها.
- TensorFlow برای ایجاد و آموزش مدل شما.
- OpenCV برای تغذیه مدل با ارقام دست نویس خودتان.
واردات ماژول های لازم
بسته هایی را که در محیط خود نصب کرده اید وارد کنید. این به شما امکان می دهد بعداً تماس بگیرید و از توابع و ماژول های آنها در کد خود استفاده کنید.
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import cv2
خط دوم کد ماژول Keras را از کتابخانه Google TensorFlow وارد می کند. شما از Keras برای آموزش شبکه عصبی عمیق خود با TensorFlow به عنوان باطن استفاده خواهید کرد.
بارگیری و مشاهده مجموعه داده
مجموعه داده MNIST در Keras تعبیه شده است. مجموعه داده MNIST را بارگیری کنید و آن را به مجموعه های آموزشی و آزمایشی تقسیم کنید. شما از مجموعه آموزشی برای آموزش مدل خود و از مجموعه تست برای ارزیابی دقت مدل خود در طبقه بندی تصاویر دیده نشده جدید استفاده خواهید کرد.
(X_train, y_train) , (X_test, y_test) = keras.datasets.mnist.load_data()
مدت زمان ست های آموزشی و تست را بررسی کنید. مجموعه داده MNIST دارای 60000 تصویر برای آموزش و 10000 تصویر برای آزمایش است.
len(X_train)
len(X_test)
شکل اولین تصویر در مجموعه داده MNIST را بررسی کنید که باید 28 در 28 پیکسل باشد. سپس مقادیر پیکسل آن را چاپ کرده و با استفاده از Matplotlib آن را تجسم کنید.
X_train[0].shape
X_train[0]
plt.matshow(X_train[0])
y_train[0]
خروجی تجسم به شرح زیر است:
تصویر بصری نشان می دهد که اولین تصویر در مجموعه داده حاوی عدد پنج است.
پیش پردازش داده ها
قبل از استفاده از داده ها در مجموعه داده برای آموزش و آزمایش مدل خود، باید آن را از قبل پردازش کنید. پیش پردازش دقت مدل را با استانداردسازی داده ها افزایش می دهد.
عادی کردن مقادیر پیکسل
با تقسیم هر مقدار بر 255، مقادیر پیکسل تصاویر موجود در مجموعه داده را عادی کنید. مقادیر پیکسل مجموعه داده غیرعادی شده از 0 تا 255 متغیر است که صفر سیاه و 255 سفید است. تقسیم هر پیکسل بر 255 تضمین می کند که هر پیکسل در محدوده 0 تا 1 قرار دارد. این امر یادگیری ویژگی ها و الگوهای مربوطه در داده ها را برای مدل آسان تر می کند.
X_train = X_train / 255
X_test = X_test / 255
سپس مقادیر پیکسل تصویر اول را چاپ کنید.
X_train[0]
توجه کنید که آنها اکنون در محدوده بین 0 و 1 هستند.
تبدیل ماتریس های تصویر به آرایه 1 بعدی
لایه ورودی شبکه عصبی معمولاً ورودی های 1 بعدی را انتظار دارد، بنابراین یک آرایه 1 بعدی از مقادیر پیکسل تصویر ایجاد کنید. برای انجام این کار، از تابع reshape() با تعداد rawهایی که روی تعداد تصاویر مجموعه داده تنظیم شده است استفاده کنید.
X_train_flattened = X_train.reshape(len(X_train), 28 * 28)
X_test_flattened = X_test.reshape(len(X_test), 28 * 28)
X_train_flattened.shape
X_train_flattened[0]
اکنون تصاویر شما برای آموزش و آزمایش مدل آماده است.
ایجاد مدل شبکه عصبی عمیق
با استفاده از یک لایه ورودی، دو لایه پنهان و یک لایه خروجی، یک مدل متوالی با ماژول Keras Tensorflow ایجاد کنید. شکل ورودی را روی ۲۸ در ۲۸ تنظیم کنید زیرا این شکل تصاویر اصلی در مجموعه داده است. از 128 گره برای لایه های مخفی استفاده کنید. لایه خروجی باید فقط 10 نورون داشته باشد زیرا فقط ارقام 0 تا 9 را طبقه بندی می کنید.
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
مدل را با استفاده از بهینه ساز adam، sparse_categorical_crossentropy به عنوان تابع ضرر و متریک برای ارزیابی عملکرد مدل به عنوان دقت، کامپایل کنید. سپس داده های آموزشی را در مدل قرار داده و تعداد دوره ها را روی پنج قرار دهید.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5)
آموزش مدل چند دقیقه طول می کشد. پس از پایان آموزش مدل، عملکرد آن را در مجموعه تست ارزیابی کنید.
model.evaluate(X_test, y_test)
تابع ارزیابی افت و دقت مدل را برمی گرداند. دقت این مدل 98 درصد است.
استفاده از مدل برای طبقه بندی ارقام دست نویس خود
برای طبقه بندی ارقام دست نویس خود، باید تصاویر خود را برای مطابقت با مجموعه داده های MNIST آماده کنید. عدم انجام این کار منجر به عملکرد ضعیف مدل شما می شود.
برای پیش پردازش تصاویر:
- تصویر حاوی رقم را با استفاده از OpenCV بارگیری کنید.
- آن را به مقیاس خاکستری تبدیل کنید و اندازه آن را به 28 در 28 پیکسل تغییر دهید.
- مقادیر پیکسل را برگردانید و عادی کنید.
- در نهایت، تصویر را در یک آرایه 1 بعدی صاف کنید.
تصویر از پیش پردازش شده را برای پیش بینی به مدل منتقل کنید و مقدار پیش بینی شده را روی صفحه چاپ کنید.
img = cv2.imread('digits/digit1.png', cv2.IMREAD_GRAYSCALE)
img_resize = cv2.resize(img, (28, 28))
img_flip = cv2.bitwise_not(img_resize)
img_normalized = img_flip.astype('float32') / 255.0
# Flatten the image into a 1D array
input_data = img_normalized.flatten().reshape( 1,28,28)
# Make a prediction using the model
prediction = model.predict(input_data)
print (f'Prediction: {np.argmax(prediction)}')
ارسال یک تصویر از پیش پردازش شده حاوی یک عدد به مدل.
خروجی مدل به صورت زیر است:
این مدل توانست رقم هفت را به درستی طبقه بندی کند.
شبکه های عصبی در چت بات ها
استفاده از شبکه های عصبی در چند سال گذشته افزایش یافته است. آنها عمدتاً در پردازش زبان طبیعی برای ترجمه زبان و هوش مصنوعی مولد استفاده شده اند.
اخیراً تعداد رباتهای چت افزایش یافته است که میتوانند به شیوهای شبیه به انسان ارتباط برقرار کنند. آنها از نوعی شبکه عصبی به نام شبکه عصبی ترانسفورماتور استفاده می کنند. با برخی از آنها تعامل داشته باشید و قدرت شبکه های عصبی را تجربه کنید.