حفظ وتحميل النماذج

عرض على 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 ، يجب عليك القيام بما يلي:

  1. حدد طريقة get_config في الكائن الخاص بك ، واختياريًا طريقة from_config classmethod.
    • get_config(self) قاموسًا JSON قابلًا للتسلسل للمعلمات اللازمة لإعادة إنشاء الكائن.
    • from_config(cls, config) الذي تم إرجاعه من get_config لإنشاء كائن جديد. بشكل افتراضي ، ستستخدم هذه الوظيفة config كوحدات تهيئة تهيئة ( return cls(**config) ).
  2. قم بتمرير الكائن إلى وسيطة 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.