الهدف: تتبّع حساب الشبكة والتمييز بين التدريب والاستدلال.
يُطبّق الانتشار الأمامي (Forward pass) كل طبقة بترتيبها. يُنتج الـ Logits ثم الخسارة إن توفّرت الأهداف. لا يُعدّل أي وزن.
logits = model(x) # الانتشار الأمامي
loss = criterion(logits, y)من أجل دُفعة x بشكل (32, 20)، تُنتج الطبقة Linear(20, 64) شكل (32, 64). طبقة ثانية
Linear(64, 4) تُنتج (32, 4). يبقى محور الدُّفعة كما هو؛ ويتغيّر المحور الأخير بحسب
الطبقة.
في وضع التدريب، تحتفظ الشبكة بالمعلومات اللازمة لحساب التدرجات. أما في وضع الاستدلال، فنُعطّل هذه المتابعة ونضع النموذج في وضع التقييم:
model.eval()
with torch.inference_mode():
logits = model(x)
predictions = logits.argmax(dim=1)يضبط model.eval() سلوك Dropout وBatchNorm. ويُجنِّب inference_mode() بناء رسم بياني
للتدرج. العمليتان متكاملتان.
الشبكة رسم بياني من العمليات. يُخزّن PyTorch العمليات التي أنتجت كل موتّر عند
requires_grad=True. تُقرأ هذه الآثار في الاتجاه المعاكس أثناء الانتشار العكسي.
argmax قبل دالة الخسارة: تلك العملية تُتلف المعلومة اللازمة للتدرج.model.eval() أثناء التحقّق.هل يتعلّم الانتشار الأمامي؟ لماذا نستدعي كلاًّ من eval() وinference_mode()؟
لا، يقوم بالحساب فقط. eval() يُغيّر بعض الطبقات؛ وinference_mode() يُعطّل رسم التدرج.
اكتب اختباراً افتراضياً يستدعي النموذج نفسه المتضمّن Dropout مرتين، أولاً في وضع التدريب
ثم في وضع التقييم. توقّع أيّ النتائج ينبغي أن تكون متطابقة، واشرح الدور المتمايز بين
eval() وinference_mode(). المخرَج النهائي: الاختبار والتشخيص.
القراءة: يحسب الانتشار الأمامي المخارج في كلتا الحالتين، لكن مسار التدريب وحده يحتفظ
بما يلزم لحساب التدرجات. في وضع الاستدلال، اجمع model.eval() مع torch.inference_mode().
المزلق هو الاعتقاد بأن أحدهما يُغني عن الآخر: إنهما يتحكّمان بآليتَين مختلفتين.