تمهيد سريع للمبتدئين حول Tensorflow-2

إفتح المحتوى على موقع TensorFlow.org تفاعل مع المحتوى على Google Colab اعرض المصدر على Github نزّل الدّفتر

يستخدم هذا التمهيد القصير Keras من أجل:

  1. بناء شبكة عصبية تصنّف الصور.
  2. تدريب هذه الشبكة العصبية.
  3. وأخيرًا ، تقييم دقة النموذج.

هذا الملفّ هو دفتر Google Colaboratory. بواسطته ، يمكنك تشغيل برامج Python مباشرة في المتصفّح - و هي طريقة رائعة لتعلّم و إستخدام Tensorflow.

لمتابعة هذا البرنامج التعليمي ، قم بتشغيل الدفتر التّفاعلي في Google Colab بالنقر فوق الزر، ذي نفس التسمية ، الموجود في أعلى هذه الصفحة.

  1. في Colab ، اتصل بمحرّك تشغيل Python بالطريقة التّالية: إذهب إلى قائمة الإختيارات في أعلى يسار الدفتر ، ثمّ إضغط على CONNECT.
  2. شغّل كافة خلايا الدفتر التّفاعلي بإختيار Runtime ثمّ الضغط على Run all.

قم بتنزيل وتثبيت TensorFlow 2. ثمّ قم بإستيراد حزمة TensorFlow في برنامجك:

import tensorflow as tf

قم بتحميل و إعداد قاعدة بيانات MNIST و تحويل العيّنات من أعداد صحيحة إلى أعداد الفاصلة العائمة (floating-point numbers):

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

قم ببناء نموذج tf.keras.Sequential عن طريق تكديس الطبقات. لتدريب النموذج قم بإختيار خوارزميّة تحسين (optimizer) و دالّة خسارة
(loss function).

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
])

لكلّ مثال في قاعدة التّدريب، يعرض النّموذج متجّها (vector) متكوّنا من نتائج تمثّل "logits" أو "log-odds" كلُّ قيمة في هذا المتّجه تمثّل واحدة من الأقسام التّي نريد تصنيف الصّور حسبها.

predictions = model(x_train[:1]).numpy()
predictions
array([[-0.0300121 , -0.08478397, -0.69617105,  0.28583196,  0.18850115,
         0.21849096,  0.13994883, -0.03760381, -0.01059459,  0.11807616]],
      dtype=float32)

تحول الدّالة tf.nn.softmax هذه النتائج ، المتمثلة في أعداد حقيقية ، إلى "احتمالات" لكل فئة ، حيث تكون قيمة كُلّ واحدة من هذه الإحتمالات بين 0 و 1 و يساوي مجموع كُلّ القيم 1:

tf.nn.softmax(predictions).numpy()
array([[0.09332673, 0.08835252, 0.04793988, 0.12798981, 0.1161195 ,
        0.11965465, 0.11061631, 0.09262091, 0.09515661, 0.1082231 ]],
      dtype=float32)

ملاحظة: يمكن جعل الدّالة tf.nn.softmax جزءًا من الشبكة العصبيّة التي بنيناها سابقا، حيث يمكن إعتبارها دالّة تنشيط (activation function) للطبقة الأخيرة من الشبكة العصبيّة. بهذه الطريقة ستصير نتيجة النموذج أكثر قابليّة للتفسير بشكل مباشر من دون معالجات إضافيّة. إلاّ أنّ هذه الطريقة غير منصوح بها ، لأنّه من المستحيل توفير حساب خسارة دقيق و مستقرّ رقميًّا لجميع النماذج عند إستخدام نتائج softmax.

تأخذ دالّة الخسار losses.SparseCategoricalCrossentropy متجّها متكوّنا من logits و مؤشرًا عن الفئة الصحيحة لكلّ مثال ، ثمّ تقوم بإنتاج عدد حقيقي يمثلّ قيمة الخسارة لكلّ مثال.

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

تساوي قيمة هذه الخسارة القيمة السلبية اللوغاريتمية للإحتمال (negative log probability) الذّي أعطاه النموذج للفئة الصحيحة للمثال: تكون هذه القيمة قريبة من الصفر إذا كان النموذج متأكّدا من تصنيفه للمثال حسب الفئة الصحيحة.

يعطي النموذج الحالي ، غير المدرّب ، إحتمالات عشوائيّة تقارب 1/10 لكلّ فئة، لذا فإنّ قيمة الخسارة الأوليّة لهذا النموذج ستكون تقريبا : tf.log(1/10) ~= 2.3

loss_fn(y_train[:1], predictions).numpy()
2.1231456
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

تقوم الدّالة Model.fit بضبط معلما (parameters) النموذج لتقليل الخسارة:

model.fit(x_train, y_train, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2967 - accuracy: 0.9146
Epoch 2/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.1413 - accuracy: 0.9588
Epoch 3/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.1046 - accuracy: 0.9681
Epoch 4/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0889 - accuracy: 0.9718
Epoch 5/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0751 - accuracy: 0.9765

<tensorflow.python.keras.callbacks.History at 0x7f72131b8630>

تقوم الدّالة Model.evaluate بالتحقّق من أداء النّموذج على مجموعة بيانات معزولة عن تلك المستخدمة في التّدريب و تسمّى مجموعة التحقّق (Validation-set).

model.evaluate(x_test,  y_test, verbose=2)
313/313 - 0s - loss: 0.0737 - accuracy: 0.9771

[0.07373987138271332, 0.9771000146865845]

الآن ، و بعد إستخدام الدّالة Model.fit ، تمّ تدريب مصنّف الصور إلى دقة 98% تقريبًا على مجموعة البيانات هذه.

لتعلّم المزيد ، اقرأ الدروس التعليمية الأخرى على موقع TensorFlow.

إذا أردت أن تكون نتائج النموذج المدرّب في شكل إحتمالات ، فيمكنك لفّه باستعمال الدّالة tf.keras.Sequential و إرفاقه بدالّة softmax:

probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])
probability_model(x_test[:5])
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[1.1687794e-06, 2.1870170e-09, 2.1947733e-05, 6.5477513e-04,
        6.2502061e-12, 2.6508300e-07, 8.5005961e-12, 9.9931550e-01,
        3.2547700e-07, 6.0882867e-06],
       [2.5622713e-08, 2.0349780e-05, 9.9996114e-01, 9.4812594e-06,
        2.1491801e-15, 2.7746711e-07, 1.9758048e-08, 3.6332879e-14,
        8.7063036e-06, 2.8252220e-11],
       [3.3147537e-06, 9.9695981e-01, 2.9351635e-04, 9.9514240e-05,
        1.5022994e-04, 2.4983510e-05, 7.0100427e-06, 1.6778375e-03,
        7.7624823e-04, 7.5496746e-06],
       [9.9974149e-01, 1.3391054e-09, 1.2761050e-04, 4.6660145e-07,
        2.1359933e-06, 1.8436275e-06, 7.5415439e-05, 4.7196976e-05,
        1.4630515e-08, 3.8194325e-06],
       [8.3072970e-05, 5.5704290e-09, 6.0616821e-06, 8.1349306e-08,
        9.9677116e-01, 9.7140196e-07, 3.8892745e-06, 1.0541423e-03,
        5.5140736e-06, 2.0751327e-03]], dtype=float32)>