عرض على TensorFlow.org | تشغيل في Google Colab | عرض المصدر على جيثب | تحميل دفتر |
يمكن حفظ تقدم النموذج أثناء وبعد التدريب. هذا يعني أنه يمكن للنموذج أن يستأنف من حيث توقف ويتجنب أوقات التدريب الطويلة. يعني الحفظ أيضًا أنه يمكنك مشاركة نموذجك ويمكن للآخرين إعادة إنشاء عملك. عند نشر نماذج وتقنيات البحث ، يشارك معظم ممارسي التعلم الآلي:
- رمز لإنشاء النموذج ، و
- الأوزان المدربة أو المعلمات للنموذج
تساعد مشاركة هذه البيانات الآخرين في فهم كيفية عمل النموذج وتجربته بأنفسهم باستخدام بيانات جديدة.
خيارات
توجد طرق مختلفة لحفظ نماذج TensorFlow بناءً على واجهة برمجة التطبيقات التي تستخدمها. يستخدم هذا الدليل tf.keras ، وهو واجهة برمجة تطبيقات عالية المستوى لبناء النماذج وتدريبها في TensorFlow. للحصول على طرق أخرى ، راجع دليل TensorFlow Save and Restore أو Saving in بشغف .
يثبت
التثبيتات والواردات
تثبيت واستيراد TensorFlow والتبعيات:
pip install pyyaml h5py # Required to save models in HDF5 format
import os
import tensorflow as tf
from tensorflow import keras
print(tf.version.VERSION)
2.8.0-rc1
احصل على مثال لمجموعة البيانات
لتوضيح كيفية حفظ وتحميل الأوزان ، ستستخدم مجموعة بيانات MNIST . لتسريع عمليات التشغيل هذه ، استخدم أول 1000 مثال:
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
تحديد نموذج
ابدأ ببناء نموذج تسلسلي بسيط:
# Define a simple sequential model
def create_model():
model = tf.keras.models.Sequential([
keras.layers.Dense(512, activation='relu', input_shape=(784,)),
keras.layers.Dropout(0.2),
keras.layers.Dense(10)
])
model.compile(optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.metrics.SparseCategoricalAccuracy()])
return model
# Create a basic model instance
model = create_model()
# Display the model's architecture
model.summary()
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 512) 401920 dropout (Dropout) (None, 512) 0 dense_1 (Dense) (None, 10) 5130 ================================================================= Total params: 407,050 Trainable params: 407,050 Non-trainable params: 0 _________________________________________________________________
حفظ نقاط التفتيش أثناء التدريب
يمكنك استخدام نموذج مدرب دون الحاجة إلى إعادة تدريبه ، أو متابعة التدريب من حيث توقفت في حالة توقف عملية التدريب. يتيح لك رد الاتصال tf.keras.callbacks.ModelCheckpoint
حفظ النموذج باستمرار أثناء التدريب وفي نهايته .
استخدام رد الاتصال Checkpoint
قم بإنشاء رد tf.keras.callbacks.ModelCheckpoint
يحفظ الأوزان أثناء التدريب فقط:
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# Create a callback that saves the model's weights
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
verbose=1)
# Train the model with the new callback
model.fit(train_images,
train_labels,
epochs=10,
validation_data=(test_images, test_labels),
callbacks=[cp_callback]) # Pass callback to training
# This may generate warnings related to saving the state of the optimizer.
# These warnings (and similar warnings throughout this notebook)
# are in place to discourage outdated usage, and can be ignored.
Epoch 1/10 23/32 [====================>.........] - ETA: 0s - loss: 1.3666 - sparse_categorical_accuracy: 0.6060 Epoch 1: saving model to training_1/cp.ckpt 32/32 [==============================] - 1s 10ms/step - loss: 1.1735 - sparse_categorical_accuracy: 0.6690 - val_loss: 0.7180 - val_sparse_categorical_accuracy: 0.7750 Epoch 2/10 24/32 [=====================>........] - ETA: 0s - loss: 0.4238 - sparse_categorical_accuracy: 0.8789 Epoch 2: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.4201 - sparse_categorical_accuracy: 0.8810 - val_loss: 0.5621 - val_sparse_categorical_accuracy: 0.8150 Epoch 3/10 24/32 [=====================>........] - ETA: 0s - loss: 0.2795 - sparse_categorical_accuracy: 0.9336 Epoch 3: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.2815 - sparse_categorical_accuracy: 0.9310 - val_loss: 0.4790 - val_sparse_categorical_accuracy: 0.8430 Epoch 4/10 24/32 [=====================>........] - ETA: 0s - loss: 0.2027 - sparse_categorical_accuracy: 0.9427 Epoch 4: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.2016 - sparse_categorical_accuracy: 0.9440 - val_loss: 0.4361 - val_sparse_categorical_accuracy: 0.8610 Epoch 5/10 24/32 [=====================>........] - ETA: 0s - loss: 0.1739 - sparse_categorical_accuracy: 0.9583 Epoch 5: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.1683 - sparse_categorical_accuracy: 0.9610 - val_loss: 0.4640 - val_sparse_categorical_accuracy: 0.8580 Epoch 6/10 23/32 [====================>.........] - ETA: 0s - loss: 0.1116 - sparse_categorical_accuracy: 0.9796 Epoch 6: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.1125 - sparse_categorical_accuracy: 0.9780 - val_loss: 0.4420 - val_sparse_categorical_accuracy: 0.8580 Epoch 7/10 24/32 [=====================>........] - ETA: 0s - loss: 0.0978 - sparse_categorical_accuracy: 0.9831 Epoch 7: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.0989 - sparse_categorical_accuracy: 0.9820 - val_loss: 0.4163 - val_sparse_categorical_accuracy: 0.8590 Epoch 8/10 21/32 [==================>...........] - ETA: 0s - loss: 0.0669 - sparse_categorical_accuracy: 0.9911 Epoch 8: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 6ms/step - loss: 0.0690 - sparse_categorical_accuracy: 0.9910 - val_loss: 0.4411 - val_sparse_categorical_accuracy: 0.8600 Epoch 9/10 22/32 [===================>..........] - ETA: 0s - loss: 0.0495 - sparse_categorical_accuracy: 0.9972 Epoch 9: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.0516 - sparse_categorical_accuracy: 0.9950 - val_loss: 0.4064 - val_sparse_categorical_accuracy: 0.8650 Epoch 10/10 24/32 [=====================>........] - ETA: 0s - loss: 0.0436 - sparse_categorical_accuracy: 0.9948 Epoch 10: saving model to training_1/cp.ckpt 32/32 [==============================] - 0s 5ms/step - loss: 0.0437 - sparse_categorical_accuracy: 0.9960 - val_loss: 0.4061 - val_sparse_categorical_accuracy: 0.8770 <keras.callbacks.History at 0x7eff8d865390>
يؤدي ذلك إلى إنشاء مجموعة واحدة من ملفات نقاط فحص TensorFlow التي يتم تحديثها في نهاية كل حقبة:
os.listdir(checkpoint_dir)
['checkpoint', 'cp.ckpt.index', 'cp.ckpt.data-00000-of-00001']
طالما أن نموذجين يشتركان في نفس البنية ، يمكنك مشاركة الأوزان بينهما. لذلك ، عند استعادة نموذج من الأوزان فقط ، قم بإنشاء نموذج بنفس بنية النموذج الأصلي ثم قم بتعيين أوزانه.
أعد الآن بناء نموذج جديد غير مدرب وقم بتقييمه على مجموعة الاختبار. سيعمل النموذج غير المدرب بمستويات فرصة (دقة 10٪ تقريبًا):
# Create a basic model instance
model = create_model()
# Evaluate the model
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Untrained model, accuracy: {:5.2f}%".format(100 * acc))
32/32 - 0s - loss: 2.4473 - sparse_categorical_accuracy: 0.0980 - 145ms/epoch - 5ms/step Untrained model, accuracy: 9.80%
ثم قم بتحميل الأوزان من الحاجز وأعد تقييم:
# Loads the weights
model.load_weights(checkpoint_path)
# Re-evaluate the model
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100 * acc))
32/32 - 0s - loss: 0.4061 - sparse_categorical_accuracy: 0.8770 - 65ms/epoch - 2ms/step Restored model, accuracy: 87.70%
خيارات رد الاتصال Checkpoint
يوفر رد الاتصال عدة خيارات لتوفير أسماء فريدة لنقاط التفتيش وضبط تردد نقاط التفتيش.
تدريب نموذج جديد وحفظ نقاط التفتيش ذات الأسماء الفريدة مرة كل خمس فترات:
# Include the epoch in the file name (uses `str.format`)
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
batch_size = 32
# Create a callback that saves the model's weights every 5 epochs
cp_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_path,
verbose=1,
save_weights_only=True,
save_freq=5*batch_size)
# Create a new model instance
model = create_model()
# Save the weights using the `checkpoint_path` format
model.save_weights(checkpoint_path.format(epoch=0))
# Train the model with the new callback
model.fit(train_images,
train_labels,
epochs=50,
batch_size=batch_size,
callbacks=[cp_callback],
validation_data=(test_images, test_labels),
verbose=0)
Epoch 5: saving model to training_2/cp-0005.ckpt Epoch 10: saving model to training_2/cp-0010.ckpt Epoch 15: saving model to training_2/cp-0015.ckpt Epoch 20: saving model to training_2/cp-0020.ckpt Epoch 25: saving model to training_2/cp-0025.ckpt Epoch 30: saving model to training_2/cp-0030.ckpt Epoch 35: saving model to training_2/cp-0035.ckpt Epoch 40: saving model to training_2/cp-0040.ckpt Epoch 45: saving model to training_2/cp-0045.ckpt Epoch 50: saving model to training_2/cp-0050.ckpt <keras.callbacks.History at 0x7eff807703d0>
الآن ، انظر إلى نقاط التفتيش الناتجة واختر الأحدث:
os.listdir(checkpoint_dir)
['cp-0005.ckpt.data-00000-of-00001', 'cp-0050.ckpt.index', 'checkpoint', 'cp-0010.ckpt.index', 'cp-0035.ckpt.data-00000-of-00001', 'cp-0000.ckpt.data-00000-of-00001', 'cp-0050.ckpt.data-00000-of-00001', 'cp-0010.ckpt.data-00000-of-00001', 'cp-0020.ckpt.data-00000-of-00001', 'cp-0035.ckpt.index', 'cp-0040.ckpt.index', 'cp-0025.ckpt.data-00000-of-00001', 'cp-0045.ckpt.index', 'cp-0020.ckpt.index', 'cp-0025.ckpt.index', 'cp-0030.ckpt.data-00000-of-00001', 'cp-0030.ckpt.index', 'cp-0000.ckpt.index', 'cp-0045.ckpt.data-00000-of-00001', 'cp-0015.ckpt.index', 'cp-0015.ckpt.data-00000-of-00001', 'cp-0005.ckpt.index', 'cp-0040.ckpt.data-00000-of-00001']
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest
'training_2/cp-0050.ckpt'
للاختبار ، قم بإعادة ضبط النموذج وتحميل أحدث نقطة فحص:
# Create a new model instance
model = create_model()
# Load the previously saved weights
model.load_weights(latest)
# Re-evaluate the model
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100 * acc))
32/32 - 0s - loss: 0.4996 - sparse_categorical_accuracy: 0.8770 - 150ms/epoch - 5ms/step Restored model, accuracy: 87.70%
ما هي هذه الملفات؟
يخزن الكود أعلاه الأوزان لمجموعة من الملفات المنسقة بنقاط التحقق التي تحتوي فقط على الأوزان المدربة بتنسيق ثنائي. تحتوي نقاط التفتيش على:
- جزء أو أكثر من القطع التي تحتوي على أوزان نموذجك.
- ملف فهرس يشير إلى الأوزان المخزنة في أي جزء.
إذا كنت تقوم بتدريب نموذج على جهاز واحد ، فسيكون لديك جزء واحد مع اللاحقة: .data-00000-of-00001
احفظ الأوزان يدويًا
حفظ الأوزان يدويًا باستخدام طريقة Model.save_weights
. بشكل افتراضي ، tf.keras
- save_weights
على وجه الخصوص - تنسيق نقاط تفتيش .ckpt
بامتداد .ckpt (تتم تغطية الحفظ في HDF5 بامتداد .h5
في دليل الطرز الحفظ والتسلسل):
# Save the weights
model.save_weights('./checkpoints/my_checkpoint')
# Create a new model instance
model = create_model()
# Restore the weights
model.load_weights('./checkpoints/my_checkpoint')
# Evaluate the model
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100 * acc))
32/32 - 0s - loss: 0.4996 - sparse_categorical_accuracy: 0.8770 - 143ms/epoch - 4ms/step Restored model, accuracy: 87.70%
احفظ النموذج بأكمله
model.save
لحفظ بنية النموذج ، والأوزان ، وتكوين التدريب في ملف / مجلد واحد. يسمح لك هذا بتصدير نموذج بحيث يمكن استخدامه دون الوصول إلى كود Python الأصلي *. منذ استعادة حالة المحسن ، يمكنك استئناف التدريب من حيث توقفت بالضبط.
يمكن حفظ نموذج كامل بتنسيقي ملفات مختلفين ( SavedModel
و HDF5
). تنسيق SavedModel
هو تنسيق الملف الافتراضي في TF2.x. ومع ذلك ، يمكن حفظ النماذج بتنسيق HDF5
. مزيد من التفاصيل حول حفظ النماذج بأكملها في تنسيقي الملف موضحة أدناه.
يعد حفظ نموذج كامل الوظائف مفيدًا للغاية - يمكنك تحميلها في TensorFlow.js ( Saved Model ، HDF5 ) ثم تدريبها وتشغيلها في متصفحات الويب ، أو تحويلها للتشغيل على الأجهزة المحمولة باستخدام TensorFlow Lite ( Saved Model ، HDF5 )
* تتطلب الكائنات المخصصة (مثل النماذج أو الطبقات المصنفة تحت التصنيف) اهتمامًا خاصًا عند الحفظ والتحميل. راجع قسم حفظ الكائنات المخصصة أدناه
شكل SavedModel
يعد تنسيق SavedModel طريقة أخرى لتسلسل النماذج. يمكن استعادة النماذج المحفوظة بهذا التنسيق باستخدام tf.keras.models.load_model
وهي متوافقة مع خدمة TensorFlow. يتطرق دليل SavedModel إلى التفاصيل حول كيفية تقديم / فحص SavedModel. يوضح القسم أدناه خطوات حفظ النموذج واستعادته.
# Create and train a new model instance.
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# Save the entire model as a SavedModel.
!mkdir -p saved_model
model.save('saved_model/my_model')
Epoch 1/5 32/32 [==============================] - 0s 2ms/step - loss: 1.1988 - sparse_categorical_accuracy: 0.6550 Epoch 2/5 32/32 [==============================] - 0s 2ms/step - loss: 0.4180 - sparse_categorical_accuracy: 0.8930 Epoch 3/5 32/32 [==============================] - 0s 2ms/step - loss: 0.2900 - sparse_categorical_accuracy: 0.9220 Epoch 4/5 32/32 [==============================] - 0s 2ms/step - loss: 0.2070 - sparse_categorical_accuracy: 0.9540 Epoch 5/5 32/32 [==============================] - 0s 2ms/step - loss: 0.1593 - sparse_categorical_accuracy: 0.9630 2022-01-26 07:30:22.888387: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. WARNING:tensorflow:Detecting that an object or model or tf.train.Checkpoint is being deleted with unrestored values. See the following logs for the specific values in question. To silence these warnings, use `status.expect_partial()`. See https://www.tensorflow.org/api_docs/python/tf/train/Checkpoint#restorefor details about the status object returned by the restore function. WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.iter WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.beta_1 WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.beta_2 WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.decay WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.learning_rate WARNING:tensorflow:Detecting that an object or model or tf.train.Checkpoint is being deleted with unrestored values. See the following logs for the specific values in question. To silence these warnings, use `status.expect_partial()`. See https://www.tensorflow.org/api_docs/python/tf/train/Checkpoint#restorefor details about the status object returned by the restore function. WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.iter WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.beta_1 WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.beta_2 WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.decay WARNING:tensorflow:Value in checkpoint could not be found in the restored object: (root).optimizer.learning_rate INFO:tensorflow:Assets written to: saved_model/my_model/assets
تنسيق SavedModel هو دليل يحتوي على ثنائي protobuf ونقطة تفتيش TensorFlow. افحص دليل النموذج المحفوظ:
# my_model directory
ls saved_model
# Contains an assets folder, saved_model.pb, and variables folder.
ls saved_model/my_model
my_model assets keras_metadata.pb saved_model.pb variables
قم بإعادة تحميل نموذج Keras الجديد من النموذج المحفوظ:
new_model = tf.keras.models.load_model('saved_model/my_model')
# Check its architecture
new_model.summary()
Model: "sequential_5" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_10 (Dense) (None, 512) 401920 dropout_5 (Dropout) (None, 512) 0 dense_11 (Dense) (None, 10) 5130 ================================================================= Total params: 407,050 Trainable params: 407,050 Non-trainable params: 0 _________________________________________________________________
يتم تجميع النموذج المستعاد بنفس الوسيطات مثل النموذج الأصلي. جرب تشغيل التقييم والتنبؤ بالنموذج المحمل:
# Evaluate the restored model
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print('Restored model, accuracy: {:5.2f}%'.format(100 * acc))
print(new_model.predict(test_images).shape)
32/32 - 0s - loss: 0.4577 - sparse_categorical_accuracy: 0.8430 - 156ms/epoch - 5ms/step Restored model, accuracy: 84.30% (1000, 10)
تنسيق HDF5
يوفر Keras تنسيق حفظ أساسي باستخدام معيار HDF5 .
# Create and train a new model instance.
model = create_model()
model.fit(train_images, train_labels, epochs=5)
# Save the entire model to a HDF5 file.
# The '.h5' extension indicates that the model should be saved to HDF5.
model.save('my_model.h5')
Epoch 1/5 32/32 [==============================] - 0s 2ms/step - loss: 1.1383 - sparse_categorical_accuracy: 0.6970 Epoch 2/5 32/32 [==============================] - 0s 2ms/step - loss: 0.4094 - sparse_categorical_accuracy: 0.8920 Epoch 3/5 32/32 [==============================] - 0s 2ms/step - loss: 0.2936 - sparse_categorical_accuracy: 0.9160 Epoch 4/5 32/32 [==============================] - 0s 2ms/step - loss: 0.2050 - sparse_categorical_accuracy: 0.9460 Epoch 5/5 32/32 [==============================] - 0s 2ms/step - loss: 0.1485 - sparse_categorical_accuracy: 0.9690
الآن ، أعد إنشاء النموذج من هذا الملف:
# Recreate the exact same model, including its weights and the optimizer
new_model = tf.keras.models.load_model('my_model.h5')
# Show the model architecture
new_model.summary()
Model: "sequential_6" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_12 (Dense) (None, 512) 401920 dropout_6 (Dropout) (None, 512) 0 dense_13 (Dense) (None, 10) 5130 ================================================================= Total params: 407,050 Trainable params: 407,050 Non-trainable params: 0 _________________________________________________________________
تحقق من دقتها:
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print('Restored model, accuracy: {:5.2f}%'.format(100 * acc))
32/32 - 0s - loss: 0.4266 - sparse_categorical_accuracy: 0.8620 - 141ms/epoch - 4ms/step Restored model, accuracy: 86.20%
يحفظ Keras النماذج عن طريق فحص بنياتها. هذه التقنية تحفظ كل شيء:
- قيم الوزن
- هندسة النموذج
- تكوين تدريب النموذج (ما تقوم بتمريره إلى طريقة
.compile()
) - المُحسِّن وحالته ، إن وجدت (يتيح لك ذلك إعادة بدء التدريب من حيث توقفت)
يتعذر على Keras حفظ محسنات v1.x
v1.x (من tf.compat.v1.train
) نظرًا لأنها غير متوافقة مع نقاط التفتيش. بالنسبة لمحسِّن الإصدار v1.x ، تحتاج إلى إعادة تجميع النموذج بعد التحميل - مما يؤدي إلى فقدان حالة المُحسِّن.
حفظ الكائنات المخصصة
إذا كنت تستخدم تنسيق SavedModel ، فيمكنك تخطي هذا القسم. يتمثل الاختلاف الرئيسي بين HDF5 و SavedModel في أن HDF5 يستخدم تكوينات الكائن لحفظ بنية النموذج ، بينما يحفظ SavedModel الرسم البياني للتنفيذ. وبالتالي ، فإن SavedModels قادرة على حفظ الكائنات المخصصة مثل النماذج ذات الفئات الفرعية والطبقات المخصصة دون الحاجة إلى الكود الأصلي.
لحفظ الكائنات المخصصة في HDF5 ، يجب عليك القيام بما يلي:
- حدد طريقة
get_config
في الكائن الخاص بك ، واختياريًا طريقةfrom_config
classmethod.-
get_config(self)
قاموسًا JSON قابلًا للتسلسل للمعلمات اللازمة لإعادة إنشاء الكائن. -
from_config(cls, config)
الذي تم إرجاعه منget_config
لإنشاء كائن جديد. بشكل افتراضي ، ستستخدم هذه الوظيفة config كوحدات تهيئة تهيئة (return cls(**config)
).
-
- قم بتمرير الكائن إلى وسيطة
custom_objects
عند تحميل النموذج. يجب أن تكون الوسيطة عبارة عن قاموس يعين اسم فئة السلسلة لفئة Python. على سبيل المثالtf.keras.models.load_model(path, custom_objects={'CustomLayer': CustomLayer})
راجع دروس الكتابة والنماذج من البداية للحصول على أمثلة للكائنات المخصصة و get_config
.
# MIT License
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.