সংরক্ষণ করুন এবং মডেল লোড

প্রশিক্ষণের সময় এবং পরে মডেলের অগ্রগতি সংরক্ষণ করা যেতে পারে। এর অর্থ হল একটি মডেল যেখানে ছেড়েছিল সেখানে পুনরায় শুরু করতে পারে এবং দীর্ঘ প্রশিক্ষণের সময় এড়াতে পারে। সংরক্ষণ করার অর্থ হল আপনি আপনার মডেল শেয়ার করতে পারেন এবং অন্যরা আপনার কাজ পুনরায় তৈরি করতে পারে। গবেষণার মডেল এবং কৌশল প্রকাশ করার সময়, বেশিরভাগ মেশিন লার্নিং অনুশীলনকারীরা শেয়ার করেন:

  • মডেল তৈরি করতে কোড, এবং
  • মডেলের জন্য প্রশিক্ষিত ওজন বা পরামিতি

এই ডেটা শেয়ার করা অন্যদের বুঝতে সাহায্য করে কিভাবে মডেল কাজ করে এবং নতুন ডেটা দিয়ে নিজে চেষ্টা করে দেখুন।

অপশন

আপনি যে API ব্যবহার করছেন তার উপর নির্ভর করে TensorFlow মডেলগুলি সংরক্ষণ করার বিভিন্ন উপায় রয়েছে। এই গাইড Tf.keras ব্যবহার করে, একটি উচ্চ-স্তরের API 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 কলব্যাক আপনাকে প্রশিক্ষণের সময় এবং শেষে উভয় মডেলটিকে ক্রমাগত সংরক্ষণ করতে দেয়।

চেকপয়েন্ট কলব্যাক ব্যবহার

একটি 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%

চেকপয়েন্ট কলব্যাক বিকল্প

কলব্যাক চেকপয়েন্টগুলির জন্য অনন্য নাম প্রদান এবং চেকপয়েন্টিং ফ্রিকোয়েন্সি সামঞ্জস্য করার জন্য বিভিন্ন বিকল্প সরবরাহ করে।

একটি নতুন মডেল প্রশিক্ষিত করুন, এবং প্রতি পাঁচটি যুগে একবার অনন্যভাবে নামযুক্ত চেকপয়েন্টগুলি সংরক্ষণ করুন:

# 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 এক্সটেনশন সহ TensorFlow চেকপয়েন্ট ফর্ম্যাট ব্যবহার করে ( .h5 এক্সটেনশনের সাথে HDF5-সংরক্ষণ করা মডেল সংরক্ষণ এবং সিরিয়ালাইজ গাইডে কভার করা হয়েছে):

# 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 কল করুন। এটি আপনাকে একটি মডেল রপ্তানি করতে দেয় যাতে এটি আসল পাইথন কোড * অ্যাক্সেস ছাড়াই ব্যবহার করা যেতে পারে। যেহেতু অপ্টিমাইজার-স্টেট পুনরুদ্ধার করা হয়েছে, আপনি ঠিক যেখান থেকে ছেড়েছিলেন সেখান থেকে প্রশিক্ষণ পুনরায় শুরু করতে পারেন।

একটি সম্পূর্ণ মডেল দুটি ভিন্ন ফাইল ফরম্যাটে ( SavedModel এবং HDF5 ) সংরক্ষণ করা যেতে পারে। SavedModel ফরম্যাট হল TF2.x-এ ডিফল্ট ফাইল ফরম্যাট। যাইহোক, মডেল HDF5 বিন্যাসে সংরক্ষণ করা যেতে পারে. দুটি ফাইল ফরম্যাটে সম্পূর্ণ মডেল সংরক্ষণ করার বিষয়ে আরও বিশদ নীচে বর্ণনা করা হয়েছে।

একটি সম্পূর্ণ-কার্যকর মডেল সংরক্ষণ করা খুবই উপযোগী—আপনি সেগুলিকে TensorFlow.js ( সংরক্ষিত মডেল , HDF5 ) এ লোড করতে পারেন এবং তারপরে সেগুলিকে প্রশিক্ষণ দিয়ে ওয়েব ব্রাউজারে চালাতে পারেন, অথবা TensorFlow Lite ( সংরক্ষিত মডেল , HDF5 ) ব্যবহার করে মোবাইল ডিভাইসে চালানোর জন্য রূপান্তর করতে পারেন )

*কাস্টম অবজেক্ট (যেমন সাবক্লাসড মডেল বা স্তর) সংরক্ষণ এবং লোড করার সময় বিশেষ মনোযোগ প্রয়োজন। নীচের কাস্টম অবজেক্ট সংরক্ষণ করা বিভাগটি দেখুন

সংরক্ষিত মডেল বিন্যাস

SavedModel বিন্যাস হল মডেলগুলিকে সিরিয়ালাইজ করার আরেকটি উপায়। এই ফর্ম্যাটে সংরক্ষিত মডেলগুলি tf.keras.models.load_model ব্যবহার করে পুনরুদ্ধার করা যেতে পারে এবং tf.keras.models.load_model সাথে সামঞ্জস্যপূর্ণ। সেভডমডেল গাইড কীভাবে সেভডমডেল পরিবেশন/পরিদর্শন করতে হয় সে সম্পর্কে বিস্তারিতভাবে উল্লেখ করে। নীচের বিভাগটি মডেলটি সংরক্ষণ এবং পুনরুদ্ধার করার পদক্ষেপগুলি চিত্রিত করে৷

# 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 বিন্যাস হল একটি ডিরেক্টরি যাতে একটি প্রোটোবাফ বাইনারি এবং একটি টেনসরফ্লো চেকপয়েন্ট থাকে। সংরক্ষিত মডেল ডিরেক্টরি পরিদর্শন করুন:

# 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

সংরক্ষিত মডেল থেকে একটি নতুন কেরাস মডেল পুনরায় লোড করুন:

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 বিন্যাস

কেরাস 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%

কেরাস তাদের আর্কিটেকচার পরিদর্শন করে মডেল সংরক্ষণ করে। এই কৌশলটি সবকিছু সংরক্ষণ করে:

  • ওজন মান
  • মডেলের স্থাপত্য
  • মডেলের প্রশিক্ষণ কনফিগারেশন (আপনি .compile() পদ্ধতিতে যা পাস করেন)
  • অপ্টিমাইজার এবং তার অবস্থা, যদি থাকে (এটি আপনাকে প্রশিক্ষণ পুনরায় শুরু করতে সক্ষম করে যেখানে আপনি ছেড়েছিলেন)

কেরাস v1.x অপ্টিমাইজারগুলি ( tf.compat.v1.train থেকে) সংরক্ষণ করতে সক্ষম নয় কারণ তারা চেকপয়েন্টগুলির সাথে সামঞ্জস্যপূর্ণ নয়৷ v1.x অপ্টিমাইজারগুলির জন্য, আপনাকে লোড করার পরে মডেলটি পুনরায় কম্পাইল করতে হবে - অপ্টিমাইজারের অবস্থা হারাতে হবে৷

কাস্টম অবজেক্ট সংরক্ষণ করা হচ্ছে

আপনি যদি SavedModel বিন্যাসটি ব্যবহার করেন তবে আপনি এই বিভাগটি এড়িয়ে যেতে পারেন। HDF5 এবং SavedModel এর মধ্যে মূল পার্থক্য হল HDF5 মডেল আর্কিটেকচার সংরক্ষণ করতে অবজেক্ট কনফিগারেশন ব্যবহার করে, যখন SavedModel এক্সিকিউশন গ্রাফ সংরক্ষণ করে। এইভাবে, SavedModels মূল কোডের প্রয়োজন ছাড়াই সাবক্লাসড মডেল এবং কাস্টম লেয়ারের মতো কাস্টম অবজেক্ট সংরক্ষণ করতে সক্ষম।

HDF5 এ কাস্টম অবজেক্ট সংরক্ষণ করতে, আপনাকে অবশ্যই নিম্নলিখিতগুলি করতে হবে:

  1. আপনার অবজেক্টে একটি get_config পদ্ধতি সংজ্ঞায়িত করুন, এবং ঐচ্ছিকভাবে একটি from_config ক্লাসমেথড।
    • get_config(self) অবজেক্ট পুনরায় তৈরি করার জন্য প্রয়োজনীয় প্যারামিটারগুলির একটি JSON-ক্রমিক অভিধান প্রদান করে।
    • from_config(cls, config) একটি নতুন অবজেক্ট তৈরি করতে get_config থেকে ফেরত কনফিগার ব্যবহার করে। ডিফল্টরূপে, এই ফাংশনটি কনফিগারেশনটিকে ইনিশিয়ালাইজেশন kwargs হিসাবে ব্যবহার করবে ( return cls(**config) )।
  2. মডেল লোড করার সময় বস্তুটিকে custom_objects আর্গুমেন্টে পাস করুন। আর্গুমেন্টটি অবশ্যই একটি অভিধান হতে হবে যা পাইথন ক্লাসে স্ট্রিং ক্লাসের নাম ম্যাপ করে। যেমন 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.