الشبكة العصبية للتصنيف مع Tensorflow

عقدة المصدر: 1570297

تم نشر هذه المقالة كجزء من مدونة علوم البيانات

في هذه المقالة، سأقوم ببناء نماذج الشبكة العصبية باستخدام TensorFlow لحل مشكلة التصنيف. دعونا نستكشف معًا كيف يمكننا التعامل مع مشكلة التصنيف في Tensorflow. لكن أولاً، أود التأكد من أننا قادرون على الإجابة على هذه الأسئلة:

هي الشبكة العصبية؟

الغرض الرئيسي من الشبكة العصبية هو محاولة إيجاد العلاقة بين الميزات في مجموعة البيانات، وتتكون من مجموعة من الخوارزميات التي تحاكي عمل الدماغ البشري. "الخلايا العصبية" في الشبكة العصبية هي وظيفة رياضية تقوم بجمع المعلومات وتصنيفها وفقًا لبنية محددة.

ما هو التصنيف؟

تتضمن مشكلة التصنيف التنبؤ بما إذا كان هناك شيء ينتمي إلى فئة واحدة أم لا. بمعنى آخر، أثناء القيام بذلك، نحاول أن نرى أن الشيء شيء أو آخر.

أنواع التصنيف

  • لنفترض أنك تريد التنبؤ بما إذا كان الشخص مصابًا بمرض السكري أم لا. إذا كنت تواجه هذا النوع من المواقف، هناك احتمالان، أليس كذلك؟ هذا يسمى التصنيف الثنائي.
  • لنفترض أنك تريد تحديد ما إذا كانت الصورة للعبة أو لشخص أو قطة، أليس كذلك؟ هذا يسمي تصنيف متعدد الفئات لأن هناك أكثر من خيارين.
  • لنفترض أنك تريد تحديد الفئات التي يجب تخصيصها لمقال ما. إذا كان الأمر كذلك، فإنه يسمى تصنيف متعدد التسمية، لأنه يمكن أن تحتوي المقالة الواحدة على أكثر من فئة معينة. دعونا نأخذ شرحنا من خلال هذا المقال. قد نقوم بتعيين فئات مثل "التعلم العميق، وTensorFlow، والتصنيف" وما إلى ذلك لهذه المقالة

والآن يمكننا المضي قدمًا لأن لدينا فهمًا مشتركًا للمشكلة التي سنعمل عليها. لذا، فقد حان الوقت للترميز. أتمنى أن تقوم بتدوينها معي لأن الطريقة الوحيدة للتحسن، وارتكاب أخطاء أقل هي كتابة المزيد من التعليمات البرمجية.

نبدأ باستيراد المكتبات التي سنستخدمها:

استيراد numpy كـ np استيراد الباندا كـ pd استيراد matplotlib.pyplot كـ plt استيراد Tensorflow كـ tf print(tf.__version__)

إنشاء مجموعة بيانات

لقد حان الوقت لإنشاء مجموعة بيانات للعمل عليها:

من sklearn.datasets، قم باستيراد عينات make_circles = 1000 X، y = make_circles(samples، الضوضاء = 0.03، Random_state = 42)

لقد أنشأنا بعض البيانات، فلنحصل على مزيد من المعلومات عنها.

طباعة(X >>[[ 0.75424625 0.23148074] [-0.75615888 0.15325888] [-0.81539193 0.17328203] ... [-0.13690036 -0.81001183] [ 0.67036156 -0.76750154 0.28105665] [ 0.96382443 XNUMX]]
طباعة(ص) >> [1 1 1 1 0 1 1 1 1]

حسنًا، لقد رأينا مجموعة البيانات الخاصة بنا بمزيد من التفاصيل، لكننا ما زلنا لا نعرف شيئًا عنها، أليس كذلك؟ ولهذا السبب فإن إحدى الخطوات المهمة هنا هي أن تصبح واحدًا مع البيانات، والتصور هو أفضل طريقة للقيام بذلك.

Circle = pd.DataFrame({ 'X0' : X[:, 0], 'X1' : X[:, 1], 'label' : y}) Circle.head()
الشبكة العصبية للتصنيف مع رأس بيانات Tensorflow

وهنا يطرح سؤال واحد، ما نوع التسميات التي نتعامل معها؟

Circle.label.value_counts() >> 1 الاسم: التسمية، النوع d: int500

يبدو أننا نتعامل مع مشكلة التصنيف الثنائي، لأن لدينا علامتين (2 و 0).

plt.scatter(X[:,0], X[:,1], c = y, cmap = plt.cm.RdYlBu)
الشبكة العصبية للتصنيف باستخدام مؤامرة Tensorflow المبعثرة

كما ذكرت أعلاه، فإن أفضل طريقة للحصول على البيانات هي التصور. الآن تقول الحبكة نفسها ما هو نوع النموذج الذي نحتاج إلى بنائه. سوف نقوم ببناء نموذج قادر على التمييز بين النقاط الزرقاء والنقاط الحمراء.

قبل بناء أي نموذج للشبكة العصبية، يجب علينا التحقق من أشكال ميزات الإدخال والإخراج لدينا. يجب أن يكونوا هم أنفسهم!

طباعة(X.shape, y.shape) طباعة(len(X), len(y)) >> (1000, 2) (1000,) 1000 1000

لدينا نفس القدر من القيم لكل ميزة، ولكن شكل X مختلف؟ لماذا؟ دعونا التحقق من ذلك.

X[0]، y[0] >> (صفيف([0.75424625، 0.23148074])، 1)

حسنًا، لدينا 2 X من الميزات لمدة 1 سنة. حتى نتمكن من المضي قدما دون أي مشكلة.

خطوات نمذجة الشبكة العصبية للتصنيف باستخدام Tensorflow

يوجد في TensorFlow مراحل ثابتة لإنشاء النموذج:

  • إنشاء نموذج – تجميع طبقات الشبكة العصبية معًا باستخدام واجهة برمجة التطبيقات الوظيفية أو التسلسلية
  • تجميع نموذج - تحديد كيفية قياس أداء النموذج وكيفية تحسينه (وظيفة الخسارة والمحسن)
  • تركيب الوضعل - السماح للنموذج بالعثور على الأنماط في البيانات

سوف نستخدم واجهة برمجة التطبيقات التسلسلية. اذا هيا بنا نبدأ

tf.random.set_seed(42)
model_1 = tf.keras.Sequential([tf.keras.layers.Dense(1)])

model_1.compile(loss = tf.keras.losses.BinaryCrossentropy(),

#نستخدم Binary كدالة خسارة، لأننا نعمل مع فئتين

 المحسن = tf.keras.optimizers.SGD()، #SGD يرمز إلى مقاييس Stochastic Gradient Descent = ['الدقة']) model_1.fit(X, y, epochs = 5)
>> العصر 1/5 32/32 [================] - 1 ثانية 1 مللي ثانية/خطوة - الخسارة: 2.8544 - الدقة: 0.4600 عصر 2/5 32/32 [=================] - 0 ثانية 2 مللي ثانية/خطوة - الخسارة : 0.7131 - الدقة: 0.5430 عصر 3/5 32/32 [========================] - 0 ثانية 2 مللي ثانية/خطوة - الخسارة: 0.6973 - الدقة: 0.5090 العصر 4/5 32/32 [==============================================] - 0 ثانية 2 مللي ثانية / الخطوة - الخسارة: 0.6950 - الدقة: 0.5010 العصر 5/5 32/32 [=========================] - 0s 1ms/خطوة - الخسارة: 0.6942 - الدقة: 0.4830

تبلغ دقة النموذج 50% تقريبًا مما يعني أن النموذج مجرد تخمين، فلنحاول تدريبه لفترة أطول

model_1.fit(X, y, epochs = 200, Verbose = 0) # قمنا بتعيين مطول = 0 لإزالة إجراء التدريب) model_1.evaluate(X, y)
>> 32/32 [================] - 0 ثانية 1 مللي ثانية / خطوة - الخسارة: 0.6935 - الدقة: 0.5000 [0.6934829950332642، 0.5]

حتى بعد 200 حقبة، لا يزال أداءه كما هو متوقع. الخطوة التالية هي إضافة المزيد من الطبقات والتدريب لفترة أطول.

tf.random.set_seed(42)
model_2 = tf.keras.Sequential([ tf.keras.layers.Dense(1), tf.keras.layers.Dense(1) ]) model_2.compile(loss = tf.keras.losses.BinaryCrossentropy(), المحسن = tf.keras.optimizers.SGD(), metrics = ['الدقة']) model_2.fit(X, y, epochs = 100, مطول = 0)
 model_2.evaluate(X,y)
>> 32/32 [================] - 0 ثانية 1 مللي ثانية / خطوة - الخسارة: 0.6933 - الدقة: 0.5000 [0.6933314800262451، 0.5]

ومع ذلك، ليس هناك حتى تغيير بسيط، يبدو أن هناك خطأ ما.

تحسين نموذج الشبكة العصبية للتصنيف باستخدام Tensorflow

هناك طرق مختلفة لتحسين النموذج في مراحل مختلفة:

  • إنشاء نموذج – إضافة المزيد من الطبقات، وزيادة عدد الوحدات المخفية (الخلايا العصبية)، وتغيير وظائف التنشيط لكل طبقة
  • تجميع النموذج – جرب وظائف تحسين مختلفة، على سبيل المثال استخدم Adam() بدلاً من SGD().
  • تركيب النموذج – يمكننا زيادة عدد العصور

دعنا نحاول إضافة المزيد من الخلايا العصبية ومحاولة ادم محسن

tf.random.set_seed(42)
model_3 = tf.keras.Sequential([ tf.keras.layers.Dense(100), # إضافة 100 خلية عصبية كثيفة tf.keras.layers.Dense(10), # إضافة طبقة أخرى بها 10 خلايا عصبية tf.keras.layers.Dense (1) ]) model_3.compile(loss=tf.keras.losses.BinaryCrossentropy(), الأمثل=tf.keras.optimizers.Adam(), metrics=['accuracy']) model_3.fit(X, y, epochs) =100، مطول = 0)
model_3.evaluate(X,y) >> 32/32 [==============================] - 0s 1ms/step - الخسارة: 0.6980 - الدقة: 0.5080 [0.6980254650115967, 0.5080000162124634]

لا يزال لا يتحسن! دعونا نتصور البيانات لمعرفة ما يحدث من خطأ.

تصور نموذج الشبكة العصبية

لتصور تنبؤات نموذجنا، سنقوم بإنشاء دالةplot_decision_boundary() والتي:

  • يأخذ نموذجًا وميزات وتسميات مدربة
  • قم بإنشاء شبكة من قيم X المختلفة.
  • يجعل التنبؤات عبر الشبكة المتداخلة.
  • المؤامرات التنبؤات مع الخط.

ملحوظة:  تم تكييف هذه الوظيفة من مصدرين:

CS231n مصنوعة باستخدام أساسيات ML 

defplot_decision_boundary(model, X, y): # تحديد حدود محور المخطط وإنشاء شبكة شبكية x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1 y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np .linspace(y_min, y_max, 100)) # أنشئ قيم X (سنقوم بالتنبؤ بكل هذه القيم) x_in = np.c_[xx.ravel(), yy.ravel()] # قم بالتنبؤات باستخدام المدربين model y_pred = model.predict(x_in) # التحقق من وجود فئات متعددة
 if len(y_pred[0]) > 1: print("القيام بتصنيف متعدد الفئات...") # يتعين علينا إعادة تشكيل توقعاتنا لجعلها جاهزة للتخطيط y_pred = np.argmax(y_pred, axis=1).reshape( xx.shape) else: print("القيام بالتصنيف الثنائي...") y_pred = np.round(y_pred).reshape(xx.shape) # حدود قرار الرسم plt.contourf(xx, yy, y_pred, cmap=plt. cm.RdYlBu, alpha=0.7) plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.RdYlBu) plt.xlim(xx.min( ), xx.max()) plt.ylim(yy.min(), yy.max())plot_decision_boundary(model_3, X, y)
حدود القرار

ها هو! مرة أخرى، يوضح لنا التصور ما هو الخطأ وماذا نفعل؟ يحاول نموذجنا رسم خط مستقيم عبر البيانات، لكن بياناتنا غير قابلة للفصل بخط مستقيم. هل هناك شيء مفقود في مشكلة التصنيف لدينا؟ ما هو؟

هذا هو عدم الخطية! نحن بحاجة إلى بعض الخطوط غير الخطية. قد تشعر بالحيرة الآن، إذا كنت تعتقد أنك لم ترى هذا النوع من الوظائف من قبل، فأنت مخطئ، لأنك فعلت ذلك. دعونا نراهم بصريا. التصور يعمل دائما بشكل أفضل!

هناك بعض وظائف التنشيط في الشبكة العصبية التي يمكننا استخدامها، مثل ريلو, السيني. دعونا نخلق قليلا لعبة الموتر والتحقق من تلك الوظائف عليه.

وظائف التنشيط للشبكات العصبية

A = tf.cast(tf.range(-12,12), tf.float32) print(A) >> tf.Tensor( [-12.-11.-10.-9.-8.-7.- 6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.]، الشكل=(24،)، dtype=float32)

دعونا نرى كيف يبدو موتر لعبتنا؟

مؤامرة (أ)
وظائف التنشيط للشبكات العصبية

يبدو مثل هذا، خط مستقيم! 

الآن دعونا نعيد إنشاء وظائف التنشيط لنرى ماذا يفعلون بالموتر؟

السيني:

Def sigmoid(x): العودة 1 / (1 + tf.exp(-x)) sigmoid(A) plt.plot(sigmoid(A))
وظيفة سينية

خط غير مستقيم!

ريلو:

الآن دعونا نتحقق مما يفعله ReLu؟ يقوم Relu بتحويل جميع القيم السالبة إلى 0 وتظل القيم الإيجابية كما هي.

ديف relu(x): إرجاع tf.maximum(0,x) plt.plot(relu(A))
ريلو

خط آخر غير مستقيم!

لقد رأيت الآن وظائف التنشيط غير الخطية، وهذه هي ما سيصلح لنا، لا يمكن للنموذج تعلم أي شيء على مجموعة بيانات غير خطية ذات وظائف التنشيط الخطية! إذا كنت قد تعلمت هذا، فقد حان الوقت لتقسيم بياناتنا إلى مجموعات تدريب واختبار وبناء نماذج قوية.

X_train, y_train = X[:800], y[:800] X_test, y_test = X[800:], y[800:] X_train.shape, X_test.shape >>((800, 2), (200, 2) ))

 

رائع، الآن لدينا مجموعات التدريب والاختبار، فلنضع نموذجًا لبيانات التدريب ونقيم ما تعلمه نموذجنا في مجموعة الاختبار.

tf.random.set_seed(42)
model_4 = tf.keras.Sequential([ tf.keras.layers.Dense(4,activation = 'relu'),# يمكننا تصحيح الأمر "tf.keras.activations.relu" أيضًا tf.keras.layers.Dense(4 ، التنشيط = 'relu')، tf.keras.layers.Dense(1، التنشيط = 'sigmoid') ]) model_4.compile (الخسارة= tf.keras.losses.binary_crossentropy، المحسن = tf.keras.optimizers.Adam( lr = 0.01)، المقاييس = ['الدقة']) model_4.fit(X_train, y_train, epochs = 25, مطول = 0)

قيم النموذج

الخسارة والدقة = model_4.evaluate(X_test, y_test) print(f' خسارة النموذج في مجموعة الاختبار: {loss}') print(f' دقة النموذج في مجموعة الاختبار: {100*accuracy}')
>> 7/7 [================] - 0 ثانية 2 مللي ثانية / خطوة - الخسارة: 0.1247 - الدقة: 1.0000 خسارة النموذج في مجموعة الاختبار: 0.1246885135769844 دقة النموذج في مجموعة الاختبار: 100.0

هاهو! دقة 100%! دعونا نرى هذه النتيجة بصريا

plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.title("القطار")plot_decision_boundary(model_4, X=X_train, y=y_train) plt.subplot(1, 2, 2) plt.title("اختبار")plot_decision_boundary(model_4, X=X_test, y=y_test) plt.show()
الشبكة العصبية الثنائية للتصنيف باستخدام Tensorflow

مع القليل من التعديلات، يتنبأ نموذجنا الآن بالدوائر الزرقاء والحمراء بشكل مثالي تقريبًا.

وفي الختام

دعونا نلقي نظرة سريعة على ما نتحدث عنه في هذه المقالة. نظرنا معًا في كيفية التعامل مع مهمة التصنيف في الشبكة العصبية باستخدام TensorFlow. أنشأنا 3 نماذج بالطريقة الأولى التي تبادرت إلى ذهننا، وبمساعدة التصور أدركنا أين كنا مخطئين، واستكشفنا الخطية، واللاخطية، وأخيرا، تمكنا من بناء نموذج معمم. ما كنت أحاول إظهاره بكل هذه الرموز والخطوات التي كنت أتبعها هو أنه لا يوجد شيء دقيق أو ثابت بنسبة 100 بالمائة، فكل شيء يتغير كل يوم. لتخمين المشكلة التي من المحتمل أن تواجهها في أي نوع من البيانات ومعرفة المجموعات التي تؤدي إلى نتيجة أفضل، كل ما تحتاجه هو كتابة المزيد من التعليمات البرمجية واكتساب الخبرة.

آمل أن يكون المقال مفيدًا بعض الشيء لك ويقدم بعض المساهمات.

الوسائط الموضحة في هذه المقالة ليست مملوكة لشركة Analytics Vidhya ويتم استخدامها وفقًا لتقدير المؤلف

المصدر: https://www.analyticsvidhya.com/blog/2021/11/neural-network-for-classification-with-tensorflow/

الطابع الزمني:

اكثر من تحليلات Vidhya