جارٍ تحميل الدرس...
في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
الشبكات العصبية - الدرس 3
بناء وتدريب نموذج انحدار خطي باستخدام واجهات TensorFlow الأساسية (Core APIs)
gradient descent)، باتباع سير عمل تعلم الآلة المعياريتحميل مجموعة البيانات
بناء نموذج انحدار خطي متعدد
تقييم أداء النموذج
import tensorflow as tf
import pandas as pd
from matplotlib import pyplot as plt
tf.random.set_seed(22)X_1 وX_2 موزعان بانتظام على النطاق [0, 10]b = 1.5، w_1 = 2، w_2 = 5، والهدف استعادة هذه القيم عبر التدريبnum_obs = 150
x1 = tf.random.uniform([num_obs], minval=0, maxval=10, dtype=tf.float32)
x2 = tf.random.uniform([num_obs], minval=0, maxval=10, dtype=tf.float32)
b, w_1, w_2 = 1.5, 2.0, 5.0
y = b + w_1 * x1 + w_2 * x2
dataset = tf.stack([y, x1, x2], axis=1)
# shape (150, 3)y على x1 وx2 معاyfig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x1.numpy(), x2.numpy(), y.numpy(), c='red', marker='o')
ax.set_xlabel('x1'); ax.set_ylabel('x2'); ax.set_zlabel('y')
plt.title("3D Scatter: (x1, x2, y)")125 عينة تدريب، و25 عينة اختبار (تقسيم بنسبة 83/17 تقريبا)dataset_shuffled = tf.random.shuffle(dataset, seed=22)
train_data, test_data = dataset_shuffled[:125], dataset_shuffled[125:]
x_train, y_train = train_data[:, 1:], train_data[:, 0]
x_test, y_test = test_data[:, 1:], test_data[:, 0]
# x_train shape: (125, 2)tf.Module؛ وتهيأ الأوزان بشكل كسول (lazily) عند أول استدعاء@tf.function الاستدعاء في رسم بياني من أجل الأداء والحفظ والتحميلclass LinearRegression(tf.Module):
def __init__(self):
self.built = False
@tf.function
def __call__(self, x):
if not self.built:
rand_w = tf.random.uniform(shape=[x.shape[-1], 1])
rand_b = tf.random.uniform(shape=[])
self.w = tf.Variable(rand_w)
self.b = tf.Variable(rand_b)
self.built = True
y = tf.add(tf.matmul(x, self.w), self.b)
return tf.squeeze(y, axis=1)MSE) لقياس خطأ التنبؤw وb اللذين يدنيان MSEdef mse_loss(y_pred, y):
return tf.reduce_mean(tf.square(y_pred - y))tf.data.Datasettf.data.Dataset مسارات الخلط والتجميع في دفعات للمدخلاتbatch_size = 32
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=x_train.shape[0]).batch(batch_size)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_dataset = test_dataset.shuffle(buffer_size=x_test.shape[0]).batch(batch_size)
# Batches: (32,2), (32,2), (32,2), (29,2)| حجم الدفعة | متى تستخدم |
|---|---|
1 | التعلم المعزز، التعلم الفوري (online learning) |
8-16 | مجموعات بيانات صغيرة، وحدات GPU محدودة الذاكرة |
32 (افتراضي) | توازن جيد بين السرعة والتعميم |
64-128 | مجموعات بيانات كبيرة، وحدات GPU قوية |
256+ | مجموعات بيانات ضخمة جدا، عناقيد TPU/GPU |
| نوع النموذج | معدل التعلم المقترح |
|---|---|
| انحدار خطي بسيط | 0.01 - 0.1 |
| شبكات عصبية عميقة | 0.001 - 0.01 |
CNNs | 0.0001 - 0.01 |
Transformers (مثل BERT) | 0.00001 - 0.0001 |
v.assign_sub(learning_rate * g) يحرك كل متغير خطوة واحدة أسفل سطح الخسارةepochs, learning_rate = 100, 0.01
train_losses, test_losses = [], []
for epoch in range(epochs):
batch_losses_train = []
for x_batch, y_batch in train_dataset:
with tf.GradientTape() as tape:
y_pred_batch = lin_reg(x_batch)
batch_loss = mse_loss(y_pred_batch, y_batch)
grads = tape.gradient(batch_loss, lin_reg.variables)
for g, v in zip(grads, lin_reg.variables):
v.assign_sub(learning_rate * g)
batch_losses_train.append(batch_loss)100 حقبة (epoch): خسارة تدريب 0.014، أوزان مستعادة w ≈ [2.03, 5.02]، b ≈ 1.18 (الحقيقية: w=[2,5]، b=1.5)plt.plot(range(epochs), train_losses, label="Training loss")
plt.plot(range(epochs), test_losses, label="Testing loss")
plt.xlabel("Epoch")
plt.ylabel("Mean squared error loss")
plt.legend()
plt.title("MSE loss vs training iterations")TensorFlow الأساسية (tf.Module، tf.matmul)MSE هي الخسارة المعيارية للانحدار؛ ويدنيها الانحدار التدريجي خطوة بخطوةtf.GradientTape() التدرجات؛ ويطبق v.assign_sub(lr * grad) التحديثMahmoud Abas|مراجعة تعلّم الآلة ومثال على الانحدار التدريجي