ستستكشف في هذا البرنامج التعليمي مثالاً لتطبيق ويب يوضح نقل التعلم باستخدام TensorFlow.js Layers API. يقوم المثال بتحميل نموذج تم تدريبه مسبقًا ثم إعادة تدريب النموذج في المتصفح.
تم تدريب النموذج مسبقًا في لغة بايثون على الأرقام من 0 إلى 4 من مجموعة بيانات تصنيف الأرقام MNIST . تستخدم إعادة التدريب (أو نقل التعلم) في المتصفح الأرقام من 5 إلى 9. يوضح المثال أنه يمكن استخدام الطبقات العديدة الأولى من النموذج المُدرب مسبقًا لاستخراج الميزات من البيانات الجديدة أثناء نقل التعلم، وبالتالي تمكين التدريب بشكل أسرع على البيانات الجديدة.
التطبيق النموذجي لهذا البرنامج التعليمي متاح عبر الإنترنت ، لذلك لا تحتاج إلى تنزيل أي تعليمات برمجية أو إعداد بيئة تطوير. إذا كنت ترغب في تشغيل التعليمات البرمجية محليًا، فأكمل الخطوات الاختيارية في تشغيل المثال محليًا . إذا كنت لا ترغب في إعداد بيئة تطوير، فيمكنك التخطي إلى استكشاف المثال .
رمز المثال متاح على GitHub .
(اختياري) قم بتشغيل المثال محليًا
المتطلبات الأساسية
لتشغيل تطبيق المثال محليًا، تحتاج إلى تثبيت ما يلي في بيئة التطوير الخاصة بك:
تثبيت وتشغيل التطبيق المثال
- قم باستنساخ أو تنزيل مستودع
tfjs-examples
. قم بالتغيير إلى دليل
mnist-transfer-cnn
:cd tfjs-examples/mnist-transfer-cnn
تثبيت التبعيات:
yarn
ابدأ خادم التطوير:
yarn run watch
استكشف المثال
افتح التطبيق المثال . (أو، إذا كنت تقوم بتشغيل المثال محليًا، فانتقل إلى http://localhost:1234
في متصفحك.)
من المفترض أن تشاهد صفحة بعنوان MNIST CNN Transfer Learning . اتبع التعليمات لتجربة التطبيق.
إليك بعض الأشياء التي يمكنك تجربتها:
- قم بتجربة أوضاع التدريب المختلفة وقارن بين الخسارة والدقة.
- حدد أمثلة مختلفة للصور النقطية وافحص احتمالات التصنيف. لاحظ أن الأرقام الموجودة في كل مثال للصورة النقطية هي قيم أعداد صحيحة ذات تدرج رمادي تمثل وحدات البكسل من الصورة.
- قم بتحرير قيم الأعداد الصحيحة للصورة النقطية وشاهد كيف تؤثر التغييرات على احتمالات التصنيف.
استكشف الكود
يقوم تطبيق الويب النموذجي بتحميل نموذج تم تدريبه مسبقًا على مجموعة فرعية من مجموعة بيانات MNIST. يتم تعريف التدريب المسبق في برنامج Python: mnist_transfer_cnn.py
. يعد برنامج Python خارج نطاق هذا البرنامج التعليمي، ولكن من المفيد الاطلاع عليه إذا كنت ترغب في رؤية مثال لتحويل النموذج .
يحتوي ملف index.js
على معظم التعليمات البرمجية التدريبية للعرض التوضيحي. عند تشغيل index.js
في المتصفح، تقوم وظيفة الإعداد، setupMnistTransferCNN
، بإنشاء مثيل MnistTransferCNNPredictor
وتهيئته، والذي يتضمن إجراءات إعادة التدريب والتنبؤ.
تقوم طريقة التهيئة، MnistTransferCNNPredictor.init
، بتحميل نموذج وتحميل بيانات إعادة التدريب وإنشاء بيانات اختبار. إليك السطر الذي يقوم بتحميل النموذج:
this.model = await loader.loadHostedPretrainedModel(urls.model);
إذا نظرت إلى تعريف loader.loadHostedPretrainedModel
، فسترى أنه يُرجع نتيجة استدعاء tf.loadLayersModel
. هذه هي واجهة برمجة تطبيقات TensorFlow.js لتحميل نموذج يتكون من كائنات الطبقة.
يتم تعريف منطق إعادة التدريب في MnistTransferCNNPredictor.retrainModel
. إذا قام المستخدم بتحديد تجميد طبقات المعالم كوضع التدريب، فسيتم تجميد الطبقات السبع الأولى من النموذج الأساسي، وسيتم تدريب الطبقات الخمس الأخيرة فقط على البيانات الجديدة. إذا قام المستخدم بتحديد إعادة تهيئة الأوزان ، فسيتم إعادة تعيين جميع الأوزان، وسيقوم التطبيق بتدريب النموذج بشكل فعال من البداية.
if (trainingMode === 'freeze-feature-layers') {
console.log('Freezing feature layers of the model.');
for (let i = 0; i < 7; ++i) {
this.model.layers[i].trainable = false;
}
} else if (trainingMode === 'reinitialize-weights') {
// Make a model with the same topology as before, but with re-initialized
// weight values.
const returnString = false;
this.model = await tf.models.modelFromJSON({
modelTopology: this.model.toJSON(null, returnString)
});
}
يتم بعد ذلك تجميع النموذج، ومن ثم يتم تدريبه على بيانات الاختبار باستخدام model.fit()
:
await this.model.fit(this.gte5TrainData.x, this.gte5TrainData.y, {
batchSize: batchSize,
epochs: epochs,
validationData: [this.gte5TestData.x, this.gte5TestData.y],
callbacks: [
ui.getProgressBarCallbackConfig(epochs),
tfVis.show.fitCallbacks(surfaceInfo, ['val_loss', 'val_acc'], {
zoomToFit: true,
zoomToFitAccuracy: true,
height: 200,
callbacks: ['onEpochEnd'],
}),
]
});
لمعرفة المزيد حول معلمات model.fit()
، راجع وثائق API .
بعد التدريب على مجموعة البيانات الجديدة (الأرقام من 5 إلى 9)، يمكن استخدام النموذج لإجراء التنبؤات. يقوم التابع MnistTransferCNNPredictor.predict
بذلك باستخدام model.predict()
:
// Perform prediction on the input image using the loaded model.
predict(imageText) {
tf.tidy(() => {
try {
const image = util.textToImageArray(imageText, this.imageSize);
const predictOut = this.model.predict(image);
const winner = predictOut.argMax(1);
ui.setPredictResults(predictOut.dataSync(), winner.dataSync()[0] + 5);
} catch (e) {
ui.setPredictError(e.message);
}
});
}
لاحظ استخدام tf.tidy
، الذي يساعد على منع تسرب الذاكرة.
يتعلم أكثر
استكشف هذا البرنامج التعليمي مثالًا لتطبيق يقوم بإجراء نقل التعلم في المتصفح باستخدام TensorFlow.js. راجع الموارد أدناه لمعرفة المزيد حول النماذج المدربة مسبقًا ونقل التعلم.
TensorFlow.js
- استيراد نموذج Keras إلى TensorFlow.js
- قم باستيراد نموذج TensorFlow إلى TensorFlow.js
- نماذج معدة مسبقًا لـ TensorFlow.js
TensorFlow الأساسية
,ستستكشف في هذا البرنامج التعليمي مثالاً لتطبيق ويب يوضح نقل التعلم باستخدام TensorFlow.js Layers API. يقوم المثال بتحميل نموذج تم تدريبه مسبقًا ثم إعادة تدريب النموذج في المتصفح.
تم تدريب النموذج مسبقًا في لغة بايثون على الأرقام من 0 إلى 4 من مجموعة بيانات تصنيف الأرقام MNIST . تستخدم إعادة التدريب (أو نقل التعلم) في المتصفح الأرقام من 5 إلى 9. يوضح المثال أنه يمكن استخدام الطبقات العديدة الأولى من النموذج المُدرب مسبقًا لاستخراج الميزات من البيانات الجديدة أثناء نقل التعلم، وبالتالي تمكين التدريب بشكل أسرع على البيانات الجديدة.
التطبيق النموذجي لهذا البرنامج التعليمي متاح عبر الإنترنت ، لذلك لا تحتاج إلى تنزيل أي تعليمات برمجية أو إعداد بيئة تطوير. إذا كنت ترغب في تشغيل التعليمات البرمجية محليًا، فأكمل الخطوات الاختيارية في تشغيل المثال محليًا . إذا كنت لا ترغب في إعداد بيئة تطوير، فيمكنك التخطي إلى استكشاف المثال .
رمز المثال متاح على GitHub .
(اختياري) قم بتشغيل المثال محليًا
المتطلبات الأساسية
لتشغيل تطبيق المثال محليًا، تحتاج إلى تثبيت ما يلي في بيئة التطوير لديك:
تثبيت وتشغيل التطبيق المثال
- قم باستنساخ أو تنزيل مستودع
tfjs-examples
. قم بالتغيير إلى دليل
mnist-transfer-cnn
:cd tfjs-examples/mnist-transfer-cnn
تثبيت التبعيات:
yarn
ابدأ خادم التطوير:
yarn run watch
استكشف المثال
افتح التطبيق المثال . (أو، إذا كنت تقوم بتشغيل المثال محليًا، فانتقل إلى http://localhost:1234
في متصفحك.)
من المفترض أن تشاهد صفحة بعنوان MNIST CNN Transfer Learning . اتبع التعليمات لتجربة التطبيق.
إليك بعض الأشياء التي يمكنك تجربتها:
- قم بتجربة أوضاع التدريب المختلفة وقارن بين الخسارة والدقة.
- حدد أمثلة مختلفة للصور النقطية وافحص احتمالات التصنيف. لاحظ أن الأرقام الموجودة في كل مثال للصورة النقطية هي قيم أعداد صحيحة ذات تدرج رمادي تمثل وحدات البكسل من الصورة.
- قم بتحرير قيم الأعداد الصحيحة للصورة النقطية وشاهد كيف تؤثر التغييرات على احتمالات التصنيف.
استكشف الكود
يقوم تطبيق الويب النموذجي بتحميل نموذج تم تدريبه مسبقًا على مجموعة فرعية من مجموعة بيانات MNIST. يتم تعريف التدريب المسبق في برنامج Python: mnist_transfer_cnn.py
. يعد برنامج Python خارج نطاق هذا البرنامج التعليمي، ولكن من المفيد الاطلاع عليه إذا كنت ترغب في رؤية مثال لتحويل النموذج .
يحتوي ملف index.js
على معظم أكواد التدريب الخاصة بالعرض التوضيحي. عند تشغيل index.js
في المتصفح، تقوم وظيفة الإعداد، setupMnistTransferCNN
، بإنشاء مثيل MnistTransferCNNPredictor
وتهيئته، والذي يتضمن إجراءات إعادة التدريب والتنبؤ.
تقوم طريقة التهيئة، MnistTransferCNNPredictor.init
، بتحميل نموذج وتحميل بيانات إعادة التدريب وإنشاء بيانات اختبار. إليك السطر الذي يقوم بتحميل النموذج:
this.model = await loader.loadHostedPretrainedModel(urls.model);
إذا نظرت إلى تعريف loader.loadHostedPretrainedModel
، فسترى أنه يُرجع نتيجة استدعاء tf.loadLayersModel
. هذه هي واجهة برمجة تطبيقات TensorFlow.js لتحميل نموذج يتكون من كائنات الطبقة.
يتم تعريف منطق إعادة التدريب في MnistTransferCNNPredictor.retrainModel
. إذا قام المستخدم بتحديد تجميد طبقات المعالم كوضع التدريب، فسيتم تجميد الطبقات السبع الأولى من النموذج الأساسي، وسيتم تدريب الطبقات الخمس الأخيرة فقط على البيانات الجديدة. إذا قام المستخدم بتحديد إعادة تهيئة الأوزان ، فسيتم إعادة تعيين جميع الأوزان، وسيقوم التطبيق بتدريب النموذج بشكل فعال من البداية.
if (trainingMode === 'freeze-feature-layers') {
console.log('Freezing feature layers of the model.');
for (let i = 0; i < 7; ++i) {
this.model.layers[i].trainable = false;
}
} else if (trainingMode === 'reinitialize-weights') {
// Make a model with the same topology as before, but with re-initialized
// weight values.
const returnString = false;
this.model = await tf.models.modelFromJSON({
modelTopology: this.model.toJSON(null, returnString)
});
}
يتم بعد ذلك تجميع النموذج، ومن ثم يتم تدريبه على بيانات الاختبار باستخدام model.fit()
:
await this.model.fit(this.gte5TrainData.x, this.gte5TrainData.y, {
batchSize: batchSize,
epochs: epochs,
validationData: [this.gte5TestData.x, this.gte5TestData.y],
callbacks: [
ui.getProgressBarCallbackConfig(epochs),
tfVis.show.fitCallbacks(surfaceInfo, ['val_loss', 'val_acc'], {
zoomToFit: true,
zoomToFitAccuracy: true,
height: 200,
callbacks: ['onEpochEnd'],
}),
]
});
لمعرفة المزيد حول معلمات model.fit()
، راجع وثائق API .
بعد التدريب على مجموعة البيانات الجديدة (الأرقام من 5 إلى 9)، يمكن استخدام النموذج لإجراء التنبؤات. يقوم التابع MnistTransferCNNPredictor.predict
بذلك باستخدام model.predict()
:
// Perform prediction on the input image using the loaded model.
predict(imageText) {
tf.tidy(() => {
try {
const image = util.textToImageArray(imageText, this.imageSize);
const predictOut = this.model.predict(image);
const winner = predictOut.argMax(1);
ui.setPredictResults(predictOut.dataSync(), winner.dataSync()[0] + 5);
} catch (e) {
ui.setPredictError(e.message);
}
});
}
لاحظ استخدام tf.tidy
، الذي يساعد على منع تسرب الذاكرة.
يتعلم أكثر
استكشف هذا البرنامج التعليمي مثالًا لتطبيق يقوم بإجراء نقل التعلم في المتصفح باستخدام TensorFlow.js. راجع الموارد أدناه لمعرفة المزيد حول النماذج المدربة مسبقًا ونقل التعلم.
TensorFlow.js
- استيراد نموذج Keras إلى TensorFlow.js
- قم باستيراد نموذج TensorFlow إلى TensorFlow.js
- نماذج معدة مسبقًا لـ TensorFlow.js
TensorFlow الأساسية