تمهيد سريع للمبتدئين حول 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
WARNING:tensorflow:Layer flatten is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because it's dtype defaults to floatx.

If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.

To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.


array([[ 0.4615246 ,  0.54955095,  0.32411528,  0.3181127 , -0.08773983,
         0.30986243,  0.63600147,  0.3477524 ,  0.06664541, -0.5454    ]],
      dtype=float32)

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

tf.nn.softmax(predictions).numpy()
array([[0.1192056 , 0.13017455, 0.10390119, 0.1032794 , 0.06882626,
        0.10243082, 0.14192896, 0.10638639, 0.08031613, 0.04355067]],
      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.2785676
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

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

model.fit(x_train, y_train, epochs=5)
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 57us/sample - loss: 0.2998 - accuracy: 0.9129
Epoch 2/5
60000/60000 [==============================] - 3s 53us/sample - loss: 0.1439 - accuracy: 0.9576
Epoch 3/5
60000/60000 [==============================] - 3s 53us/sample - loss: 0.1107 - accuracy: 0.9665
Epoch 4/5
60000/60000 [==============================] - 3s 53us/sample - loss: 0.0886 - accuracy: 0.9720
Epoch 5/5
60000/60000 [==============================] - 3s 53us/sample - loss: 0.0770 - accuracy: 0.9760

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

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

model.evaluate(x_test,  y_test, verbose=2)
10000/10000 - 1s - loss: 0.0730 - accuracy: 0.9781

[0.07303616905433591, 0.9781]

الآن ، و بعد إستخدام الدّالة 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([[2.02145273e-07, 6.36254216e-10, 7.38837662e-06, 1.89316488e-04,
        1.12776496e-10, 8.39473699e-08, 2.24560409e-12, 9.99793828e-01,
        1.18477601e-07, 9.08778838e-06],
       [4.73689028e-07, 6.94068149e-05, 9.99898672e-01, 2.74600243e-05,
        1.22669046e-13, 5.81646418e-07, 2.78752221e-09, 4.97413092e-13,
        3.43995021e-06, 8.78027338e-12],
       [2.09130590e-07, 9.98164237e-01, 1.44363716e-04, 4.83776239e-06,
        4.59843213e-05, 2.83559057e-05, 1.40873148e-04, 1.05223537e-03,
        4.18061245e-04, 7.35196750e-07],
       [9.99465168e-01, 2.74906196e-08, 1.06251253e-04, 3.88170065e-06,
        6.87667807e-06, 3.41647166e-07, 1.49105021e-04, 1.62294804e-04,
        7.79676679e-09, 1.06117986e-04],
       [2.82224232e-06, 1.17173133e-08, 4.19708749e-06, 7.56974032e-07,
        9.93377864e-01, 2.39230462e-06, 8.47362935e-06, 8.10265701e-05,
        5.90301568e-07, 6.52182940e-03]], dtype=float32)>