In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

يستخدم هذا التمهيد القصير [Keras](https://www.tensorflow.org/guide/keras/overview) من أجل: 1. بناء شبكة عصبية تصنّف الصور. 2. تدريب هذه الشبكة العصبية. 3. وأخيرًا ، تقييم دقة النموذج.
هذا الملفّ هو دفتر [Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb). بواسطته ، يمكنك تشغيل برامج Python مباشرة في المتصفّح - و هي طريقة رائعة لتعلّم و إستخدام Tensorflow. لمتابعة هذا البرنامج التعليمي ، قم بتشغيل الدفتر التّفاعلي في Google Colab بالنقر فوق الزر، ذي نفس التسمية ، الموجود في أعلى هذه الصفحة. 1. في Colab ، اتصل بمحرّك تشغيل Python بالطريقة التّالية: إذهب إلى قائمة الإختيارات في أعلى يسار الدفتر ، ثمّ إضغط على *CONNECT*. 2. شغّل كافة خلايا الدفتر التّفاعلي بإختيار *Runtime* ثمّ الضغط على *Run all*.
قم بتنزيل وتثبيت TensorFlow 2. ثمّ قم بإستيراد حزمة TensorFlow في برنامجك: Note: قم بتحديث pip لتتمكّن من تثبيت حزمة Tensorflow 2. أنظر في [دليل التثبيت](https://www.tensorflow.org/install) للحصول على المزيد من التفاصيل.

In [ ]:
import tensorflow as tf
قم بتحميل و إعداد [قاعدة بيانات MNIST](http://yann.lecun.com/exdb/mnist/) و تحويل العيّنات من أعداد صحيحة إلى أعداد الفاصلة العائمة (floating-point numbers):

In [ ]:
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).

In [ ]:
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"](https://developers.google.com/machine-learning/glossary#logits) أو ["log-odds"](https://developers.google.com/machine-learning/glossary#log-odds) كلُّ قيمة في هذا المتّجه تمثّل واحدة من الأقسام التّي نريد تصنيف الصّور حسبها.

In [ ]:
predictions = model(x_train[:1]).numpy()
predictions
تحول الدّالة `tf.nn.softmax` هذه النتائج ، المتمثلة في أعداد حقيقية ، إلى "احتمالات" لكل فئة ، حيث تكون قيمة كُلّ واحدة من هذه الإحتمالات بين 0 و 1 و يساوي مجموع كُلّ القيم 1:

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

In [ ]:
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
تساوي قيمة هذه الخسارة القيمة السلبية اللوغاريتمية للإحتمال (negative log probability) الذّي أعطاه النموذج للفئة الصحيحة للمثال: تكون هذه القيمة قريبة من الصفر إذا كان النموذج متأكّدا من تصنيفه للمثال حسب الفئة الصحيحة. يعطي النموذج الحالي ، غير المدرّب ، إحتمالات عشوائيّة تقارب 1/10 لكلّ فئة، لذا فإنّ قيمة الخسارة الأوليّة لهذا النموذج ستكون تقريبا : `tf.log(1/10) ~= 2.3`

In [ ]:
loss_fn(y_train[:1], predictions).numpy()

In [ ]:
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])
تقوم الدّالة `Model.fit` بضبط معلما (parameters) النموذج لتقليل الخسارة:

In [ ]:
model.fit(x_train, y_train, epochs=5)
تقوم الدّالة `Model.evaluate` بالتحقّق من أداء النّموذج على مجموعة بيانات معزولة عن تلك المستخدمة في التّدريب و تسمّى مجموعة التحقّق ([Validation-set](https://developers.google.com/machine-learning/glossary#validation-set)).

In [ ]:
model.evaluate(x_test,  y_test, verbose=2)
الآن ، و بعد إستخدام الدّالة `Model.fit` ، تمّ تدريب مصنّف الصور إلى دقة 98% تقريبًا على مجموعة البيانات هذه. لتعلّم المزيد ، اقرأ [الدروس التعليمية](https://www.tensorflow.org/tutorials/) الأخرى على موقع TensorFlow.
إذا أردت أن تكون نتائج النموذج المدرّب في شكل إحتمالات ، فيمكنك لفّه باستعمال الدّالة `tf.keras.Sequential` و إرفاقه بدالّة softmax:

In [ ]:
probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])

In [ ]:
probability_model(x_test[:5])