بهترین رویکرد برای فهم عمیق شبکه عصبی «Neural Network» و درک عملکرد درونی آن، پیادهسازی عملی آن است. این مقاله به آموزش روش ساخت یک شبکه عصبی در پایتون میپردازد.
مقدمه
شبکه عصبی در پایتون یکی از قدرتمندترین ابزارهای یادگیری ماشین و هوش مصنوعی است که به کمک آن میتوان مدلهایی ساخت که قادر به شناسایی الگوها و تصمیمگیریهای هوشمندانه باشند. پایتون با داشتن کتابخانهها و فریمورکهای متنوع و ساده، فرایند طراحی، آموزش و پیادهسازی شبکههای عصبی را برای مبتدیان و حرفهایها بسیار آسان کرده است. در این مقاله، قصد داریم به صورت گامبهگام نحوه ساخت یک شبکه عصبی در پایتون را آموزش دهیم و با استفاده از مجموعه داده مشهور MNIST، توانایی شبکه عصبی را در تشخیص ارقام دستنویس به نمایش بگذاریم. اگر شما هم به دنبال یادگیری شبکه عصبی در پایتون هستید، این راهنما برای شروع یک مسیر موفق و کاربردی مناسب خواهد بود.
شبکه عصبی چیست؟
شبکههای عصبی مصنوعی «Artificial Neural Networks – ANNs» نوعی الگوریتم یادگیری ماشین و روشی در هوش مصنوعی (AI) هستند که از ساختار و عملکرد نورونهای زیستی الهام گرفتهاند. ANNs قادر به یادگیری و سازگاری با دادههای پیچیده هستند و همین امر آنها را در کاربردهای مختلفی مانند طبقهبندی تصاویر، پردازش زبان طبیعی، تشخیص گفتار و موارد دیگر مفید میسازد.
شبکههای عصبی مانند موتور محرک یادگیری عمیق هستند. با داشتن داده کافی وتوان پردازشی مناسب، میتوان از آنها برای حل اکثر مسائل در یادگیری عمیق استفاده کرد. استفاده از کتابخانههای پایتون برای ایجاد یک شبکه عصبی و آموزش آن روی هر مجموعه داده و دستیابی به دقت بالا بسیار آسان است.
ANNها از لایههای متعدد گرههای بههمپیوسته تشکیل شدهاند که اطلاعات را پردازش کرده و بر اساس الگوهای موجود در دادهها پیشبینی انجام میدهند. از این شبکهها در حوزههایی مانند امور مالی، بهداشت و درمان و بازاریابی برای بهبود تصمیمگیری و خودکارسازی وظایف استفاده شده است. یکی از مزایای ANNs توانایی آنها در یادگیری از مجموعه دادههای بزرگ و تعمیمپذیری به دادههای جدید است.
با این حال، عملکرد آنها میتواند تحت تأثیر عواملی مانند کیفیت و کمیت دادههای آموزشی، پیچیدگی معماری شبکه و انتخاب ابرپارامترها قرار گیرد.
چرا شبکه عصبی در پایتون اهمیت دارد؟
پایتون با کتابخانههای قدرتمندی مثل NumPy، TensorFlow، Keras، PyTorch و scikit-learn، امکانات گستردهای برای توسعه سریع و آسان شبکههای عصبی فراهم میکند. همچنین به دلیل زبان ساده و خوانا بودن، یادگیری شبکه عصبی در پایتون برای تازهکاران بسیار مناسب است. این مقاله به شما کمک میکند که از پایه شبکه عصبی را در پایتون بسازید و مفاهیم پایه را به صورت عملی درک کنید.
دوستان عزیز قبل از پیادهسازی شبکه عصبی در پایتون اگر دوست دارید در مورد نحوه عملکرد شبکه عصبی بیشتر بدانید مقاله ما با عنوان «شبکه عصبی مصنوعی چگونه کار میکند؟ — آموزش کامل و ساده» را مطالعه کنید.
ساخت شبکه عصبی در پایتون
در این بخش از مقاله ما شبکه عصبی خودمان را از صفر در پایتون ایجاد خواهیم کرد. یک شبکه عصبی ساده پیشخور «Feedforward» با الگوریتم پسانتشار خطا «Backpropagation» خواهیم ساخت و از آن برای طبقهبندی ارقام دستنویس مجموعه داده MNIST استفاده خواهیم کرد.
مرحله ۱: نصب کتابخانههای موردنیاز
ما از کتابخانههای پایتون زیر استفاده خواهیم کرد:
- NumPy: برای محاسبات عددی
- Matplotlib: برای نمایش دادهها بهصورت تصویری
- scikit-learn: برای بارگذاری و پیشپردازش مجموعه داده MNIST
برای نصب این کتابخانهها، ترمینال را باز کرده و دستورات زیر را وارد کنید:
pip install numpy pip install matplotlib pip install scikit-learn
مرحله ۲: بارگذاری و پیشپردازش دادهها
مجموعه داده MNIST شامل تصاویر 28×28 پیکسلی از ارقام دستنویس (۰ تا ۹) است. این مجموعه شامل 60,000 تصویر آموزشی و 10,000 تصویر تست میباشد. ابتدا دادهها را بارگذاری و سپس مقیاسبندی میکنیم تا شبکه عصبی بهتر یاد بگیرد.
برای بارگذاری و پیشپردازش دادهها، از تابع داخلی کتابخانه scikit-learn استفاده خواهیم کرد.
مرحله ۳: تعریف معماری شبکه عصبی
معماری شامل یک لایه ورودی، یک یا چند لایه پنهان و یک لایه خروجی خواهد بود. هر لایه دارای تعداد مشخصی نورون است و از طریق اتصالات وزنی به لایه بعد متصل میشود.
به طور دقیق، معماری شبکه عصبی ما به شکل زیر خواهد بود:
- لایه ورودی: شامل ۷۸۴ نورون (۲۸×۲۸ پیکسل).
- لایه پنهان: شامل ۶۴ نورون با تابع فعالسازی ReLU.
- لایه خروجی: شامل ۱۰ نورون با تابع فعالسازی Softmax.
مرحله 4: پیادهسازی توابع فعالسازی
توابع فعالسازی، نقشی حیاتی در فرآیند یادگیری شبکه عصبی در پایتون ایفا میکنند. در این مرحله، توابع ReLU و Softmax به صورت دستی پیادهسازی میشوند تا درک عمیقتری از عملکرد آنها حاصل شود.
def relu(z):
return np.maximum(0, z)
def relu_derivative(z):
return (z > 0).astype(float)
def softmax(z):
exp_z = np.exp(z - np.max(z, axis=1, keepdims=True))
return exp_z / np.sum(exp_z, axis=1, keepdims=True)
مرحله 5: مقداردهی اولیه وزنها و بایاسها
وزنها و بایاسها، پارامترهای اصلی شبکه عصبی در پایتون هستند که در طول آموزش تنظیم میشوند. مقداردهی اولیه مناسب این پارامترها، تأثیر بهسزایی در سرعت همگرایی و کیفیت نهایی مدل خواهد داشت.
input_size = 784 hidden_size = 64 output_size = 10 np.random.seed(42) W1 = np.random.randn(input_size, hidden_size) * 0.01 b1 = np.zeros((1, hidden_size)) W2 = np.random.randn(hidden_size, output_size) * 0.01 b2 = np.zeros((1, output_size))
مرحله 6: پیادهسازی فوروارد پروپاگیشن «Forward Propagation»
در این گام، ورودیها از لایه ورودی آغاز شده و به صورت مرحلهای از طریق لایههای پنهان عبور کرده تا به لایه خروجی برسند. خروجی نهایی این فرآیند، پیشبینی مدل توسط شبکه عصبی در پایتون است.
def forward_propagation(X):
Z1 = np.dot(X, W1) + b1
A1 = relu(Z1)
Z2 = np.dot(A1, W2) + b2
A2 = softmax(Z2)
return Z1, A1, Z2, A2
مرحله 7: محاسبه خطا (Loss Function)
برای اندازهگیری میزان تفاوت بین پیشبینی مدل و مقادیر واقعی، از تابع خطا «Loss Function» استفاده میشود. در مسائل طبقهبندی چندکلاسه، تابع Cross-Entropy به عنوان یک تابع خطای مناسب برای شبکه عصبی در پایتون کاربرد دارد.
def compute_loss(Y_true, Y_pred):
m = Y_true.shape[0]
loss = -np.sum(Y_true * np.log(Y_pred + 1e-9)) / m
return loss
مرحله 8: پیادهسازی بکپراپگیشن (Backpropagation)
بکپراپگیشن، الگوریتم اصلی آموزش شبکه عصبی در پایتون است. در این فرآیند، خطا از لایه خروجی به سمت لایههای ورودی بازگشت داده شده و گرادیانهای مربوط به وزنها و بایاسها محاسبه میشوند. این گرادیانها نشاندهندهی جهت و شدت تغییر لازم برای کاهش خطا هستند.
برای کسانی که با مفهوم گرادیان آشنا نیستند، گرادیان اندازهگیری میکند که هر وزن شبکه چه مقدار نسبت به تغییر خطا تغییر کرده است. میتوانید گرادیان را مانند شیب یک تابع در نظر بگیرید.
الگوریتم گرادیان کاهشی (Gradient Descent) از این شیب استفاده میکند تا وزنها را بهصورت تکراری تنظیم کند و خطا را به حداقل برساند و دقت مدل را بهبود دهد. این فرایند تا زمانی تکرار میشود که الگوریتم به مجموعهای از وزنها برسد که کمترین خطای ممکن را ایجاد میکند.
فقط به یاد داشته باشید که گرادیان هرگز نباید صفر مطلق باشد، زیرا صفر شدن گرادیان به معنای توقف کامل یادگیری مدل است.
def backward_propagation(X, Y_true, Z1, A1, A2):
m = X.shape[0]
dZ2 = A2 - Y_true
dW2 = np.dot(A1.T, dZ2) / m
db2 = np.sum(dZ2, axis=0, keepdims=True) / m
dA1 = np.dot(dZ2, W2.T)
dZ1 = dA1 * relu_derivative(Z1)
dW1 = np.dot(X.T, dZ1) / m
db1 = np.sum(dZ1, axis=0, keepdims=True) / m
return dW1, db1, dW2, db2
مرحله 9: بهروزرسانی وزنها و بایاسها
با استفاده از گرادیانهای محاسبهشده در مرحله بکپراپگیشن و با ضرب آنها در نرخ یادگیری (Learning Rate)، وزنها و بایاسهای شبکه عصبی در پایتون بهروزرسانی میشوند. این فرآیند به مدل کمک میکند تا به تدریج دقت خود را افزایش دهد.
def update_parameters(W1, b1, W2, b2, dW1, db1, dW2, db2, learning_rate):
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
return W1, b1, W2, b2
مرحله 10: آموزش شبکه عصبی
در این گام، با ترکیب تمامی مراحل قبلی، شبکه عصبی در پایتون برای تعدادی مشخص از “ایپاک” (Epoch) آموزش داده میشود. هر ایپاک شامل یک دور کامل از فوروارد پروپاگیشن و بکپراپگیشن برای کل مجموعه داده آموزشی است.
learning_rate = 0.1
num_epochs = 10
for epoch in range(num_epochs):
Z1, A1, Z2, A2 = forward_propagation(X_train)
loss = compute_loss(y_train_encoded, A2)
dW1, db1, dW2, db2 = backward_propagation(X_train, y_train_encoded, Z1, A1, A2)
W1, b1, W2, b2 = update_parameters(W1, b1, W2, b2, dW1, db1, dW2, db2, learning_rate)
if (epoch + 1) % 1 == 0:
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss:.4f}")
مرحله 11: ارزیابی مدل
پس از اتمام فرآیند آموزش، عملکرد شبکه عصبی در پایتون بر روی دادههای آموزشی و تست ارزیابی میشود. این ارزیابی شامل محاسبهی معیارهایی نظیر دقت «Accuracy» است تا کارایی مدل سنجیده شود.
def predict(X):
_, _, _, A2 = forward_propagation(X)
return np.argmax(A2, axis=1)
train_predictions = predict(X_train)
test_predictions = predict(X_test)
train_accuracy = np.mean(train_predictions == y_train)
test_accuracy = np.mean(test_predictions == y_test)
print(f"Train accuracy: {train_accuracy:.4f}")
print(f"Test accuracy: {test_accuracy:.4f}")
خروجی:
Train accuracy: 0.9752083333333333 Test accuracy: 0.9655
یعنی شبکه عصبی ما حدود ۹۷.۵٪ دقت روی دادههای آموزش و حدود ۹۶.۵٪ دقت روی دادههای تست به دست میآورد. میتوان مشاهده کرد که شبکه عصبی ما قادر است خروجیها را با دقت بسیار بالا برای دادههای جدید به درستی پیشبینی کند، هم در مرحله آموزش و هم در مرحله تست.
نکات مهم برای بهبود عملکرد شبکه عصبی در پایتون
اگرچه شبکه عصبی سادهای که ساختیم توانست دقت خوبی کسب کند، اما برای استفاده در پروژههای واقعی و رسیدن به بهترین نتیجه، باید به چند نکته مهم توجه کنیم:
- افزایش تعداد لایهها و نورونها: شبکهای که در این مقاله ساختیم تنها یک لایه پنهان داشت. افزودن لایههای پنهان بیشتر (شبکه عمیقتر) و افزایش تعداد نورونها در هر لایه میتواند توانایی مدل برای یادگیری ویژگیهای پیچیدهتر را افزایش دهد.
- استفاده از تکنیکهای بهینهسازی پیشرفته: به جای استفاده از گرادیان کاهشی ساده، میتوان از الگوریتمهای پیشرفتهتر مانند Adam، RMSProp یا Momentum استفاده کرد تا هم سرعت یادگیری و هم پایداری آن بهبود یابد.
- استفاده از Dropout برای جلوگیری از Overfitting: روشی است که در آن در حین آموزش، برخی نورونها به صورت تصادفی غیرفعال میشوند. این کار باعث میشود شبکه عصبی وابستگی بیش از حد به برخی نورونها نداشته باشد و در نتیجه عملکرد بهتری روی دادههای جدید داشته باشد.
- تنظیم نرخ یادگیری «Learning Rate Scheduling»: به جای ثابت نگه داشتن نرخ یادگیری، میتوان آن را در طول آموزش کاهش داد. این کار باعث میشود مدل در ابتدا سریع یاد بگیرد و سپس با نرخ کمتر، بهینهتر به سمت کمینه خطا حرکت کند.
- استفاده از دادههای بیشتر و متنوعتر: هرچه دادههای آموزشی بیشتر و متنوعتر باشند، مدل بهتر میتواند تعمیم پیدا کند. برای پروژههای واقعی، جمعآوری و آمادهسازی دادههای باکیفیت بسیار حیاتی است.
کاربردهای شبکه عصبی در پایتون
شبکه عصبی در پایتون تنها به طبقهبندی ارقام محدود نمیشود. چند نمونه از کاربردهای مهم آن عبارتند از:
- تشخیص تصویر و پردازش بینایی ماشین (Image Recognition, Computer Vision)
- پردازش زبان طبیعی (NLP) برای ترجمه ماشینی یا تحلیل احساسات
- پیشبینی سریهای زمانی مانند پیشبینی بازار بورس
- تشخیص گفتار و ساخت سیستمهای تبدیل گفتار به متن
- تولید محتوا با استفاده از مدلهای مولد (Generative Models)
برای آشنایی بیشتر در مورد کاربرد شبکه عصبی مصنوعی مقاله زیر را مطالعه کنید.
نتیجهگیری
در این راهنما، ما یک شبکه عصبی ساده را از صفر در پایتون ساختیم. از مجموعه داده MNIST برای آموزش و ارزیابی شبکه عصبی استفاده کردیم. شبکه عصبی ما دقت ۹۶.۵۵٪ را روی مجموعه داده تست به دست آورد. با بهینهسازیها و تغییرات بیشتر، میتوان عملکرد شبکه عصبی را بهبود بخشید.
مهم است بدانید که شبکههای عصبی ابزاری قدرتمند در یادگیری ماشین هستند و میتوان آنها را در وظایف مختلف فراتر از طبقهبندی تصاویر بهکار برد. با ادامه کاوش و یادگیری درباره شبکههای عصبی، میتوانید با معماریهای مختلف، توابع فعالسازی و الگوریتمهای بهینهسازی مختلف آزمایش کنید تا عملکرد آنها را روی دادهها و مسائل مختلف بهتر کنید.










