23- كورس تعلم الذكاء الاصطناعي Machine Learning – مثال TensorFlow 1

مثال TensorFlow ثنائي الأبعاد

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

  • جمع البيانات
  • تجهيز البيانات
  • تدريب نموذج
  • تقييم النموذج

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

فكرة المثال

الفكرة هنا أن لدينا بيانات تصف علاقة بين متغير إدخال
ومتغير إخراج، ثم نريد من النموذج أن يتعلم هذه العلاقة
من الأمثلة السابقة، وبعد ذلك يستخدمها للتنبؤ بقيم جديدة.

في هذا المثال تُبنى العلاقة بين:

  • Horsepower بوصفها قيمة الإدخال
  • Miles_per_Gallon بوصفها القيمة المطلوب توقعها

أي أن النموذج يتعلم من بيانات السيارات كيف ترتبط قوة المحرك
بمعدل استهلاك الوقود، ثم يحاول بعد التدريب رسم هذه العلاقة
أو التنبؤ بقيم جديدة.

الرسوم التوضيحية في المثال

توضح الصفحة الأصلية أن العرض الرسومي في المثال
يتم باستخدام مكتبة tfjs-vis.
وهي مكتبة خفيفة داخل المتصفح مخصصة لتصور بيانات تعلم الآلة
وعرض نتائج التدريب.

كما تذكر الصفحة أن هذه المكتبة توفر:

  • أدوات رسومية لتصور تعلم الآلة
  • دوال لعرض كائنات TensorFlow
  • إمكانية تنظيم الرسوم داخل Visor
  • إمكانية استخدامها مع أدوات مثل d3 وChart.js وPlotly.js

جمع البيانات وتنظيفها

في صفحة البيانات المرتبطة بالمثال، يتم أولًا
استخراج القيم المطلوبة فقط من المصدر.
بدلًا من استخدام كل خصائص الكائنات،
يتم أخذ خاصيتين محددتين فقط:

مثال:
function extractData(obj) {
  return {x:obj.Horsepower, y:obj.Miles_per_Gallon};
}

بعد ذلك يتم تنظيف البيانات من الأخطاء،
خصوصًا القيم الفارغة أو غير الصالحة.

مثال:
function removeErrors(obj) {
  return obj.x != null && obj.y != null;
}

ثم يتم جمع كل هذا داخل دالة تجلب البيانات
وتحوّلها إلى الشكل المناسب:

مثال:
async function runTF() {
  const jsonData = await fetch(\"cardata.json\");
  let values = await jsonData.json();
  values = values.map(extractData).filter(removeErrors);
}

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

تجهيز البيانات قبل التدريب

بعد تنظيف البيانات، تأتي خطوة مهمة جدًا في هذا المثال:
تطبيع البيانات.
وتوضح الصفحة أن البيانات يجب أن تُطبّع قبل استخدامها
داخل شبكة عصبية، وأن المجال
من 0 إلى 1 باستخدام
Min-Max Normalization
يكون غالبًا مناسبًا للبيانات العددية.

مثال:
const inputMin = inputTensor.min();
const inputMax = inputTensor.max();
const labelMin = labelTensor.min();
const labelMax = labelTensor.max();

const nmInputs = inputTensor.sub(inputMin).div(inputMax.sub(inputMin));
const nmLabels = labelTensor.sub(labelMin).div(labelMax.sub(labelMin));

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

إنشاء النموذج

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

مثال:
const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [1], units: 1, useBias: true}));
model.add(tf.layers.dense({units: 1, useBias: true}));

وتشرح الصفحة هذا الاختيار على النحو التالي:

  • tf.sequential() ينشئ نموذجًا متسلسلًا سهل الفهم
  • model.add() يُستخدم لإضافة الطبقات إلى النموذج
  • dense طبقة عامة مناسبة في كثير من الحالات
  • inputShape: [1] لأن لدينا متغير إدخال واحد فقط
  • units: 1 لأن الطبقة تنتج قيمة واحدة
  • useBias: true لإضافة الانحياز Bias إلى الحسابات

وتوضح الصفحة أيضًا أن طبقة
dense
تعمل عبر ضرب المدخلات في مصفوفة أوزان
ثم إضافة الانحياز إلى الناتج.

تجميع النموذج Compile

بعد بناء النموذج وإضافة الطبقات، تأتي خطوة
Compile، وفيها يتم تحديد:

  • دالة الخسارة loss
  • خوارزمية التحسين optimizer
مثال:
model.compile({loss: \'meanSquaredError\', optimizer:\'sgd\'});

في هذا المثال:

  • meanSquaredError تُستخدم لمقارنة التوقعات بالقيم الحقيقية
  • sgd هي اختصار Stochastic Gradient Descent

وتوضح الصفحة أن هذا الـ optimizer بسيط وفعّال في مثل هذا النوع
من الأمثلة التعليمية.

تدريب النموذج

بعد التجميع، يتم تدريب النموذج على البيانات المجهزة.
وتعرض صفحة التدريب دالة كاملة لهذا الغرض:

مثال:
async function trainModel(model, inputs, labels, surface) {
  const batchSize = 25;
  const epochs = 100;
  const callbacks = tfvis.show.fitCallbacks(surface, [\'loss\'], {callbacks:[\'onEpochEnd\']});

  return await model.fit(inputs, labels, {
    batchSize,
    epochs,
    shuffle:true,
    callbacks:callbacks
  });
}

وتشرح الصفحة العناصر المهمة هنا:

  • batchSize = 25 يحدد عدد العينات في كل دفعة تدريب
  • epochs = 100 تعني عدد مرات المرور على البيانات
  • model.fit() هي الدالة التي تشغّل التدريب فعليًا
  • callbacks تُستخدم لتحديث الرسوم أثناء التدريب
  • shuffle: true تعني خلط البيانات أثناء التدريب

وهذه الخطوة مهمة لأنها تجعل التدريب ليس مجرد عملية حسابية صامتة،
بل عملية يمكن مراقبتها بصريًا عبر تغير قيمة الخسارة مع الزمن.

اختبار النموذج

بعد انتهاء التدريب، لا يكفي أن نفترض أن النموذج أصبح جيدًا،
بل يجب اختباره. وتوضح الصفحة أن ذلك يتم عبر فحص ما يتوقعه النموذج
لمجموعة من القيم الجديدة.

لكن قبل فحص النتائج، نحتاج أولًا إلى
فك التطبيع Un-Normalize،
لأن النتائج الحالية ما زالت في النطاق بين 0 و1.

مثال:
let unX = tf.linspace(0, 1, 100);
let unY = model.predict(unX.reshape([100, 1]));

const unNormunX = unX.mul(inputMax.sub(inputMin)).add(inputMin);
const unNormunY = unY.mul(labelMax.sub(labelMin)).add(labelMin);

unX = unNormunX.dataSync();
unY = unNormunY.dataSync();

في هذا الجزء:

  • يتم إنشاء 100 قيمة إدخال موزعة بين 0 و1
  • يتم تمريرها إلى النموذج عبر predict()
  • ثم تُعاد هذه القيم إلى مقياسها الحقيقي باستخدام حدود البيانات الأصلية

وهكذا يمكننا مقارنة الخط الناتج من النموذج بالبيانات الأصلية،
ورؤية ما إذا كان قد تعلم العلاقة بشكل صحيح أم لا.

لماذا هذا المثال مهم؟

قيمة هذا المثال لا تأتي فقط من الكود نفسه،
بل من كونه يوضح سير العمل الحقيقي
في مشروع تعلم آلة صغير:

  • الحصول على البيانات
  • استخراج الأعمدة المهمة فقط
  • تنظيف الأخطاء
  • تطبيع القيم
  • بناء النموذج
  • تجميعه
  • تدريبه
  • اختباره وتقييمه

وهذا يجعله مثالًا ممتازًا لفهم كيف يتحول TensorFlow.js
من مجرد مكتبة برمجية إلى أداة عملية لبناء نموذج حقيقي
من البداية حتى النتيجة النهائية.

الخلاصة

يوضح هذا المثال العملي في TensorFlow.js كيف يمكن بناء
مشروع تعلم آلة بسيط لكنه متكامل. يبدأ المثال بجلب بيانات السيارات،
ثم استخراج خصيصتي Horsepower وMiles_per_Gallon،
ثم تنظيف البيانات وتطبيعها. بعد ذلك يتم إنشاء نموذج
Sequential بطبقتين dense،
ثم تجميعه باستخدام meanSquaredError وsgd،
وتدريبه عبر model.fit()، وأخيرًا اختبار نتائجه
بعد فك التطبيع. وهكذا يقدّم المثال صورة واضحة جدًا
عن دورة العمل الكاملة لمشروع تعلم آلة داخل المتصفح.