সেভডমডেল ওয়ার্কফ্লো স্থানান্তর করুন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

একবার আপনি TensorFlow 1-এর গ্রাফ এবং সেশন থেকে আপনার মডেলটি Tf.function , tf.Module , এবং tf.keras.Model এর মতো tf.function 2 API-তে স্থানান্তরিত করলে, আপনি মডেল সংরক্ষণ এবং লোডিং কোড স্থানান্তর করতে পারেন। TensorFlow 1 এবং TensorFlow 2-এ কীভাবে আপনি SavedModel ফরম্যাটে সংরক্ষণ এবং লোড করতে পারেন তার উদাহরণ এই নোটবুকটি প্রদান করে। এখানে TensorFlow 1 থেকে TensorFlow 2-তে স্থানান্তরের জন্য সম্পর্কিত API পরিবর্তনগুলির একটি দ্রুত ওভারভিউ রয়েছে:

টেনসরফ্লো ঘ টেনসরফ্লো 2-এ স্থানান্তর
সংরক্ষণ tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
কেরাস: tf.keras.models.save_model
লোড হচ্ছে tf.compat.v1.saved_model.load tf.saved_model.load
কেরাস: tf.keras.models.load_model
স্বাক্ষর : ইনপুট একটি সেট
এবং আউটপুট tensors যে
চালানোর জন্য ব্যবহার করা যেতে পারে
*.signature_def ব্যবহার করে তৈরি করা হয়েছে
(যেমন tf.compat.v1.saved_model.predict_signature_def )
একটি tf.function লিখুন এবং signatures যুক্তি ব্যবহার করে এটি রপ্তানি করুন
tf.saved_model.save এ।
শ্রেণীবিভাগ
এবং রিগ্রেশন
:
বিশেষ ধরনের স্বাক্ষর
দিয়ে তৈরি
tf.compat.v1.saved_model.classification_signature_def ,
tf.compat.v1.saved_model.regression_signature_def ,
এবং নির্দিষ্ট আনুমানিক রপ্তানি।
TensorFlow 2 থেকে এই দুটি স্বাক্ষরের ধরন মুছে ফেলা হয়েছে।
সার্ভিং লাইব্রেরিতে এই পদ্ধতির নাম প্রয়োজন হলে,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater

ম্যাপিংয়ের আরও গভীর ব্যাখ্যার জন্য, নীচের TensorFlow 1 থেকে TensorFlow 2 বিভাগে পরিবর্তনগুলি পড়ুন৷

সেটআপ

নীচের উদাহরণগুলি দেখায় কিভাবে TensorFlow 1 এবং TensorFlow 2 API ব্যবহার করে একটি SavedModel ফর্ম্যাটে একই ডামি TensorFlow মডেল (নীচে add_two হিসাবে সংজ্ঞায়িত) রপ্তানি এবং লোড করতে হয়। আমদানি এবং ইউটিলিটি ফাংশন সেট আপ করে শুরু করুন:

import tensorflow as tf
import tensorflow.compat.v1 as tf1
import shutil

def remove_dir(path):
  try:
    shutil.rmtree(path)
  except:
    pass

def add_two(input):
  return input + 2

টেনসরফ্লো 1: একটি সংরক্ষিত মডেল সংরক্ষণ করুন এবং রপ্তানি করুন

টেনসরফ্লো 1-এ, আপনি টেনসরফ্লো গ্রাফ এবং সেশন তৈরি, সংরক্ষণ এবং রপ্তানি করতে tf.compat.v1.saved_model.Builder , tf.compat.v1.saved_model.simple_save , এবং tf.estimator.Estimator.export_saved_model API ব্যবহার করেন:

1. SavedModelBuilder এর সাথে একটি SavedModel হিসাবে গ্রাফটিকে সংরক্ষণ করুন৷

remove_dir("saved-model-builder")

with tf.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=[])
    output = add_two(input)
    print("add two output: ", sess.run(output, {input: 3.}))

    # Save with SavedModelBuilder
    builder = tf1.saved_model.Builder('saved-model-builder')
    sig_def = tf1.saved_model.predict_signature_def(
        inputs={'input': input},
        outputs={'output': output})
    builder.add_meta_graph_and_variables(
        sess, tags=["serve"], signature_def_map={
            tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig_def
    })
    builder.save()
add two output:  5.0
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:208: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: saved-model-builder/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
Traceback (most recent call last):
  File "/tmpfs/src/tf_docs_env/bin/saved_model_cli", line 8, in <module>
    sys.exit(main())
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 1211, in main
    args.func(args)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 769, in run
    init_tpu=args.init_tpu, tf_debug=args.tf_debug)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 417, in run_saved_model_with_feed_dict
    tag_set)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 117, in get_meta_graph_def
    saved_model = read_saved_model(saved_model_dir)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 55, in read_saved_model
    raise IOError("SavedModel file does not exist at: %s" % saved_model_dir)
OSError: SavedModel file does not exist at: simple-save

2. পরিবেশনের জন্য একটি সংরক্ষিত মডেল তৈরি করুন

remove_dir("simple-save")

with tf.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=[])
    output = add_two(input)
    print("add_two output: ", sess.run(output, {input: 3.}))

    tf1.saved_model.simple_save(
        sess, 'simple-save',
        inputs={'input': input},
        outputs={'output': output})
add_two output:  5.0
WARNING:tensorflow:From /tmp/ipykernel_26511/250978412.py:12: simple_save (from tensorflow.python.saved_model.simple_save) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.simple_save.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: simple-save/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
Result for output key output:
12.0

3. একটি সংরক্ষিত মডেল হিসাবে অনুমানকারী অনুমান গ্রাফ রপ্তানি করুন৷

model_fn (নীচে সংজ্ঞায়িত) এর সংজ্ঞায়, আপনি export_outputstf.estimator.EstimatorSpec ফেরত দিয়ে আপনার মডেলে স্বাক্ষর সংজ্ঞায়িত করতে পারেন। আউটপুট বিভিন্ন ধরনের আছে:

এগুলি যথাক্রমে শ্রেণীবিভাগ, রিগ্রেশন এবং ভবিষ্যদ্বাণী স্বাক্ষর প্রকারগুলি তৈরি করবে।

যখন অনুমানকারী tf.estimator.Estimator.export_saved_model দিয়ে রপ্তানি করা হয়, তখন এই স্বাক্ষরগুলি মডেলের সাথে সংরক্ষিত হবে৷

def model_fn(features, labels, mode):
  output = add_two(features['input'])
  step = tf1.train.get_global_step()
  return tf.estimator.EstimatorSpec(
      mode,
      predictions=output,
      train_op=step.assign_add(1),
      loss=tf.constant(0.),
      export_outputs={
          tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: \
          tf.estimator.export.PredictOutput({'output': output})})
est = tf.estimator.Estimator(model_fn, 'estimator-checkpoints')

# Train for one step to create a checkpoint.
def train_fn():
  return tf.data.Dataset.from_tensors({'input': 3.})
est.train(train_fn, steps=1)

# This utility function `build_raw_serving_input_receiver_fn` takes in raw
# tensor features and builds an "input serving receiver function", which
# creates placeholder inputs to the model.
serving_input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(
    {'input': tf.constant(3.)})  # Pass in a dummy input batch.
estimator_path = est.export_saved_model('exported-estimator', serving_input_fn)

# Estimator's export_saved_model creates a time stamped directory. Move this
# to a set path so it can be inspected with `saved_model_cli` in the cell below.
!rm -rf estimator-model
import shutil
shutil.move(estimator_path, 'estimator-model')
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'estimator-checkpoints', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:401: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into estimator-checkpoints/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 0.0, step = 1
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1...
INFO:tensorflow:Saving checkpoints for 1 into estimator-checkpoints/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1...
INFO:tensorflow:Loss for final step: 0.0.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:Restoring parameters from estimator-checkpoints/model.ckpt-1
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: exported-estimator/temp-1636162129/saved_model.pb
'estimator-model'
!saved_model_cli run --dir estimator-model --tag_set serve \
 --signature_def serving_default --input_exprs input=[10]
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from estimator-model/variables/variables
Result for output key output:
[12.]

টেনসরফ্লো 2: একটি সংরক্ষিত মডেল সংরক্ষণ করুন এবং রপ্তানি করুন

tf.Module দিয়ে সংজ্ঞায়িত একটি SavedModel সংরক্ষণ করুন এবং রপ্তানি করুন

TensorFlow 2-এ আপনার মডেল রপ্তানি করতে, আপনাকে অবশ্যই একটি tf.Module বা একটি tf.keras.Model সংজ্ঞায়িত করতে হবে আপনার মডেলের সমস্ত ভেরিয়েবল এবং ফাংশন ধরে রাখতে। তারপর, আপনি একটি SavedModel তৈরি করতে tf.saved_model.save কল করতে পারেন। আরও জানতে সেভডমডেল ফর্ম্যাট ব্যবহার করে একটি কাস্টম মডেল সংরক্ষণ করুন দেখুন।

class MyModel(tf.Module):
  @tf.function
  def __call__(self, input):
    return add_two(input)

model = MyModel()

@tf.function
def serving_default(input):
  return {'output': model(input)}

signature_function = serving_default.get_concrete_function(
    tf.TensorSpec(shape=[], dtype=tf.float32))
tf.saved_model.save(
    model, 'tf2-save', signatures={
        tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_function})
INFO:tensorflow:Assets written to: tf2-save/assets
2021-11-06 01:28:53.105391: 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.
!saved_model_cli run --dir tf2-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from tf2-save/variables/variables
Result for output key output:
12.0

কেরাসের সাথে সংজ্ঞায়িত একটি সংরক্ষিত মডেল সংরক্ষণ করুন এবং রপ্তানি করুন

সংরক্ষণ এবং রপ্তানি করার জন্য Keras API- Mode.save বা tf.keras.models.save_model — একটি tf.keras.Model থেকে একটি tf.keras.Model রপ্তানি করতে পারে। আরও বিশদ বিবরণের জন্য কেরাস মডেলগুলি সংরক্ষণ করুন এবং লোড করুন।

inp = tf.keras.Input(3)
out = add_two(inp)
model = tf.keras.Model(inputs=inp, outputs=out)

@tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
def serving_default(input):
  return {'output': model(input)}

model.save('keras-model', save_format='tf', signatures={
        tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: serving_default})
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape ().
INFO:tensorflow:Assets written to: keras-model/assets
!saved_model_cli run --dir keras-model --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from keras-model/variables/variables
Result for output key output:
12.0

একটি সংরক্ষিত মডেল লোড হচ্ছে

উপরের যেকোনও API এর সাথে সংরক্ষিত একটি SavedModel TensorFlow 1 বা TensorFlow API ব্যবহার করে লোড করা যেতে পারে।

একটি TensorFlow 1 SavedModel সাধারণত TensorFlow 2 এ লোড করার সময় অনুমানের জন্য ব্যবহার করা যেতে পারে, কিন্তু প্রশিক্ষণ (গ্রেডিয়েন্ট তৈরি করা) শুধুমাত্র তখনই সম্ভব যদি SavedModel-এ রিসোর্স ভেরিয়েবল থাকে। আপনি ভেরিয়েবলের dtype চেক করতে পারেন—যদি ভেরিয়েবল dtype-এ "_ref" থাকে, তাহলে এটি একটি রেফারেন্স ভেরিয়েবল।

একটি TensorFlow 2 SavedModel লোড করা যাবে এবং TensorFlow 1 থেকে কার্যকর করা যাবে যতক্ষণ পর্যন্ত SavedModel স্বাক্ষর সহ সংরক্ষিত থাকে।

নীচের বিভাগগুলিতে কোড নমুনা রয়েছে যা দেখায় যে কীভাবে পূর্ববর্তী বিভাগে সংরক্ষিত সংরক্ষিত মডেলগুলি লোড করতে হয় এবং রপ্তানিকৃত স্বাক্ষরকে কল করতে হয়৷

TensorFlow 1: tf.saved_model.load সহ একটি সংরক্ষিত মডেল লোড করুন

TensorFlow 1-এ, আপনি tf.saved_model.load ব্যবহার করে বর্তমান গ্রাফ এবং সেশনে সরাসরি একটি SavedModel আমদানি করতে পারেন। আপনি টেনসর ইনপুট এবং আউটপুট নামগুলিতে Session.run কল করতে পারেন:

def load_tf1(path, input):
  print('Loading from', path)
  with tf.Graph().as_default() as g:
    with tf1.Session() as sess:
      meta_graph = tf1.saved_model.load(sess, ["serve"], path)
      sig_def = meta_graph.signature_def[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
      input_name = sig_def.inputs['input'].name
      output_name = sig_def.outputs['output'].name
      print('  Output with input', input, ': ', 
            sess.run(output_name, feed_dict={input_name: input}))

load_tf1('saved-model-builder', 5.)
load_tf1('simple-save', 5.)
load_tf1('estimator-model', [5.])  # Estimator's input must be batched.
load_tf1('tf2-save', 5.)
load_tf1('keras-model', 5.)
Loading from saved-model-builder
WARNING:tensorflow:From /tmp/ipykernel_26511/1548963983.py:5: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
  Output with input 5.0 :  7.0
Loading from simple-save
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
  Output with input 5.0 :  7.0
Loading from estimator-model
INFO:tensorflow:Restoring parameters from estimator-model/variables/variables
  Output with input [5.0] :  [7.]
Loading from tf2-save
INFO:tensorflow:Restoring parameters from tf2-save/variables/variables
  Output with input 5.0 :  7.0
Loading from keras-model
INFO:tensorflow:Restoring parameters from keras-model/variables/variables
  Output with input 5.0 :  7.0

TensorFlow 2: tf.saved_model দিয়ে সংরক্ষিত একটি মডেল লোড করুন

TensorFlow 2-এ, বস্তুগুলিকে একটি পাইথন অবজেক্টে লোড করা হয় যা ভেরিয়েবল এবং ফাংশন সংরক্ষণ করে। এটি TensorFlow 1 থেকে সংরক্ষিত মডেলগুলির সাথে সামঞ্জস্যপূর্ণ।

বিস্তারিত জানার জন্য সংরক্ষিত মডেল ফরম্যাট ব্যবহার করার নির্দেশিকা থেকে tf.saved_model.load API ডক্স এবং লোডিং এবং ব্যবহার করে একটি কাস্টম মডেল বিভাগ দেখুন।

def load_tf2(path, input):
  print('Loading from', path)
  loaded = tf.saved_model.load(path)
  out = loaded.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY](
      tf.constant(input))['output']
  print('  Output with input', input, ': ', out)

load_tf2('saved-model-builder', 5.)
load_tf2('simple-save', 5.)
load_tf2('estimator-model', [5.])  # Estimator's input must be batched.
load_tf2('tf2-save', 5.)
load_tf2('keras-model', 5.)
Loading from saved-model-builder
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from simple-save
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from estimator-model
  Output with input [5.0] :  tf.Tensor([7.], shape=(1,), dtype=float32)
Loading from tf2-save
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from keras-model
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)

TensorFlow 2 API এর সাথে সংরক্ষিত মডেলগুলি মডেলের সাথে সংযুক্ত tf.function s এবং ভেরিয়েবলগুলিকেও অ্যাক্সেস করতে পারে (যার পরিবর্তে স্বাক্ষর হিসাবে রপ্তানি করা হয়)। উদাহরণ স্বরূপ:

loaded = tf.saved_model.load('tf2-save')
print('restored __call__:', loaded.__call__)
print('output with input 5.', loaded(5))
restored __call__: <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x7f30cc940990>
output with input 5. tf.Tensor(7.0, shape=(), dtype=float32)

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

tf.keras.models.load_model — আপনাকে একটি কেরাস মডেল অবজেক্টে একটি সংরক্ষিত মডেল পুনরায় লোড করার অনুমতি দেয়। মনে রাখবেন যে এটি আপনাকে শুধুমাত্র Keras ( Model.save বা tf.keras.models.save_model ) এর সাথে সংরক্ষিত সংরক্ষিত মডেলগুলি লোড করতে দেয়।

tf.saved_model.load দিয়ে সংরক্ষিত মডেলগুলি tf.saved_model.save দিয়ে লোড করা উচিত। আপনি Model.save ব্যবহার করে tf.saved_model.load এর সাথে সংরক্ষিত Keras মডেল লোড করতে পারেন কিন্তু আপনি শুধুমাত্র TensorFlow গ্রাফটি পাবেন। বিস্তারিত জানার জন্য tf.keras.models.load_model API ডক্স এবং কেরাস মডেলগুলি সংরক্ষণ এবং লোড করুন।

loaded_model = tf.keras.models.load_model('keras-model')
loaded_model.predict_on_batch(tf.constant([1, 3, 4]))
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (3,).
array([3., 5., 6.], dtype=float32)

GraphDef এবং MetaGraphDef

একটি কাঁচা GraphDef বা MetaGraphDef TF2 এ লোড করার কোন সহজ উপায় নেই। যাইহোক, আপনি v1.wrap_function ব্যবহার করে TF1 কোডটি রূপান্তর করতে পারেন যা গ্রাফটিকে একটি TF2 concrete_function এ আমদানি করে।

প্রথমে, একটি MetaGraphDef সংরক্ষণ করুন:

# Save a simple multiplication computation:
with tf.Graph().as_default() as g:
  x = tf1.placeholder(tf.float32, shape=[], name='x')
  v = tf.Variable(3.0, name='v')
  y = tf.multiply(x, v, name='y')
  with tf1.Session() as sess:
    sess.run(v.initializer)
    print(sess.run(y, feed_dict={x: 5}))
    s = tf1.train.Saver()
    s.export_meta_graph('multiply.pb', as_text=True)
    s.save(sess, 'multiply_values.ckpt')
15.0

TF1 API ব্যবহার করে, আপনি tf1.train.import_meta_graph গ্রাফ আমদানি করতে এবং মান পুনরুদ্ধার করতে পারেন:

with tf.Graph().as_default() as g:
  meta = tf1.train.import_meta_graph('multiply.pb')
  x = g.get_tensor_by_name('x:0')
  y = g.get_tensor_by_name('y:0')
  with tf1.Session() as sess:
    meta.restore(sess, 'multiply_values.ckpt')
    print(sess.run(y, feed_dict={x: 5}))
INFO:tensorflow:Restoring parameters from multiply_values.ckpt
15.0

গ্রাফটি লোড করার জন্য কোন TF2 API নেই, তবে আপনি এখনও এটি একটি কংক্রিট ফাংশনে আমদানি করতে পারেন যা আগ্রহী মোডে কার্যকর করা যেতে পারে:

def import_multiply():
  # Any graph-building code is allowed here.
  tf1.train.import_meta_graph('multiply.pb')

# Creates a tf.function with all the imported elements in the function graph.
wrapped_import = tf1.wrap_function(import_multiply, [])
import_graph = wrapped_import.graph
x = import_graph.get_tensor_by_name('x:0')
y = import_graph.get_tensor_by_name('y:0')

# Restore the variable values.
tf1.train.Saver(wrapped_import.variables).restore(
    sess=None, save_path='multiply_values.ckpt')

# Create a concrete function by pruning the wrap_function (similar to sess.run).
multiply_fn = wrapped_import.prune(feeds=x, fetches=y)

# Run this function
multiply_fn(tf.constant(5.))  # inputs to concrete functions must be Tensors.
WARNING:tensorflow:Saver is deprecated, please switch to tf.train.Checkpoint or tf.keras.Model.save_weights for training checkpoints. When executing eagerly variables do not necessarily have unique names, and so the variable.name-based lookups Saver performs are error-prone.
INFO:tensorflow:Restoring parameters from multiply_values.ckpt
<tf.Tensor: shape=(), dtype=float32, numpy=15.0>

TensorFlow 1 থেকে TensorFlow 2 এ পরিবর্তন

এই বিভাগে TensorFlow 1, তাদের TensorFlow 2 সমতুল্য এবং কি পরিবর্তন হয়েছে থেকে কী সংরক্ষণ এবং লোডিং শর্তাবলী তালিকাভুক্ত করা হয়েছে।

সংরক্ষিত মডেল

SavedModel হল একটি বিন্যাস যা প্যারামিটার এবং গণনা সহ একটি সম্পূর্ণ TensorFlow প্রোগ্রাম সঞ্চয় করে। এতে মডেল চালানোর জন্য প্ল্যাটফর্ম পরিবেশন করে ব্যবহৃত স্বাক্ষর রয়েছে।

ফাইল ফর্ম্যাট নিজেই উল্লেখযোগ্যভাবে পরিবর্তিত হয়নি, তাই সংরক্ষিত মডেলগুলি টেনসরফ্লো 1 বা টেনসরফ্লো 2 এপিআই ব্যবহার করে লোড এবং পরিবেশন করা যেতে পারে।

TensorFlow 1 এবং TensorFlow 2 এর মধ্যে পার্থক্য

পরিবেশন এবং অনুমান ব্যবহারের কেসগুলি TensorFlow 2-এ আপডেট করা হয়নি, API পরিবর্তনগুলিকে বাদ দিয়ে—সেভডমডেল থেকে লোড করা মডেলগুলিকে পুনঃব্যবহার এবং রচনা করার ক্ষমতায় উন্নতি চালু করা হয়েছিল।

TensorFlow 2-এ, প্রোগ্রামটিকে tf.Variable , tf.Module , বা উচ্চ-স্তরের কেরাস মডেল ( tf.keras.Model ) এবং স্তরগুলি ( tf.keras.layers ) এর মতো বস্তু দ্বারা উপস্থাপন করা হয়। একটি সেশনে মান সংরক্ষিত আছে এমন আর কোনো গ্লোবাল ভেরিয়েবল নেই, এবং গ্রাফটি এখন বিভিন্ন tf.function s-এ বিদ্যমান। ফলস্বরূপ, একটি মডেল রপ্তানির সময়, SavedModel প্রতিটি উপাদান এবং ফাংশন গ্রাফ আলাদাভাবে সংরক্ষণ করে।

আপনি যখন TensorFlow Python API-এর সাথে একটি TensorFlow প্রোগ্রাম লেখেন, তখন আপনাকে অবশ্যই ভেরিয়েবল, ফাংশন এবং অন্যান্য সংস্থানগুলি পরিচালনা করার জন্য একটি বস্তু তৈরি করতে হবে। সাধারণত, কেরাস API ব্যবহার করে এটি সম্পন্ন করা হয়, তবে আপনি tf.Module তৈরি বা সাবক্লাস করে অবজেক্ট তৈরি করতে পারেন।

কেরাস মডেল ( tf.keras.Model ) এবং tf.Module স্বয়ংক্রিয়ভাবে তাদের সাথে সংযুক্ত ভেরিয়েবল এবং ফাংশন ট্র্যাক করে। SavedModel এই সংযোগগুলিকে মডিউল, ভেরিয়েবল এবং ফাংশনের মধ্যে সংরক্ষণ করে, যাতে লোড করার সময় সেগুলি পুনরুদ্ধার করা যায়।

স্বাক্ষর

স্বাক্ষরগুলি একটি সংরক্ষিত মডেলের শেষ বিন্দু - তারা ব্যবহারকারীকে বলে যে মডেলটি কীভাবে চালাতে হবে এবং কী কী ইনপুট দরকার৷

টেনসরফ্লো 1-এ, ইনপুট এবং আউটপুট টেনসর তালিকাভুক্ত করে স্বাক্ষর তৈরি করা হয়। TensorFlow 2-এ, কংক্রিট ফাংশন পাস করে স্বাক্ষর তৈরি করা হয়। ( গ্রাফ এবং tf.function গাইডের ভূমিকায় TensorFlow ফাংশন সম্পর্কে আরও পড়ুন।) সংক্ষেপে, tf.function থেকে একটি কংক্রিট ফাংশন তৈরি করা হয়:

# Option 1: Specify an input signature.
@tf.function(input_signature=[...])
def fn(...):
  ...
  return outputs

tf.saved_model.save(model, path, signatures={
    'name': fn
})
# Option 2: Call `get_concrete_function`
@tf.function
def fn(...):
  ...
  return outputs

tf.saved_model.save(model, path, signatures={
    'name': fn.get_concrete_function(...)
})

Session.run

TensorFlow 1-এ, আপনি আমদানি করা গ্রাফ সহ Session.run কল করতে পারেন যতক্ষণ না আপনি ইতিমধ্যে টেনসরের নাম জানেন। এটি আপনাকে পুনরুদ্ধার করা পরিবর্তনশীল মানগুলি পুনরুদ্ধার করতে বা স্বাক্ষরগুলিতে রপ্তানি করা হয়নি এমন মডেলের অংশগুলি চালানোর অনুমতি দেয়৷

TensorFlow 2-এ, আপনি সরাসরি একটি ভেরিয়েবল অ্যাক্সেস করতে পারেন, যেমন একটি ওজন ম্যাট্রিক্স ( kernel ):

model = tf.Module()
model.dense_layer = tf.keras.layers.Dense(...)
tf.saved_model.save('my_saved_model')
loaded = tf.saved_model.load('my_saved_model')
loaded.dense_layer.kernel

অথবা মডেল অবজেক্টের সাথে সংযুক্ত tf.function কে কল করুন: উদাহরণস্বরূপ, loaded.__call__

TF1 এর বিপরীতে, একটি ফাংশনের অংশগুলি বের করার এবং মধ্যবর্তী মানগুলি অ্যাক্সেস করার কোন উপায় নেই। আপনাকে সংরক্ষিত বস্তুতে প্রয়োজনীয় সমস্ত কার্যকারিতা রপ্তানি করতে হবে

টেনসরফ্লো মাইগ্রেশন নোট পরিবেশন করছে

SavedModel মূলত TensorFlow Serving- এর সাথে কাজ করার জন্য তৈরি করা হয়েছিল। এই প্ল্যাটফর্মটি বিভিন্ন ধরণের ভবিষ্যদ্বাণীর অনুরোধগুলি অফার করে: শ্রেণীবদ্ধ, প্রত্যাবর্তন এবং পূর্বাভাস।

TensorFlow 1 API আপনাকে ইউটিলগুলির সাথে এই ধরনের স্বাক্ষর তৈরি করতে দেয়:

শ্রেণীবিভাগ ( classification_signature_def ) এবং regression ( regression_signature_def ) ইনপুট এবং আউটপুটগুলিকে সীমাবদ্ধ করে, তাই ইনপুটগুলি অবশ্যই একটি tf.Example . উদাহরণ হতে হবে এবং আউটপুটগুলি অবশ্যই classes , scores বা prediction হতে হবে। ইতিমধ্যে, ভবিষ্যদ্বাণী স্বাক্ষর ( predict_signature_def ) এর কোন সীমাবদ্ধতা নেই।

TensorFlow 2 API এর সাথে রপ্তানি করা সংরক্ষিত মডেলগুলি TensorFlow সার্ভিংয়ের সাথে সামঞ্জস্যপূর্ণ, তবে শুধুমাত্র ভবিষ্যদ্বাণী স্বাক্ষর থাকবে৷ শ্রেণীবিভাগ এবং রিগ্রেশন স্বাক্ষর মুছে ফেলা হয়েছে.

যদি আপনার শ্রেণীবিভাগ এবং রিগ্রেশন স্বাক্ষর ব্যবহারের প্রয়োজন হয়, আপনি tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater ব্যবহার করে রপ্তানি করা tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater পরিবর্তন করতে পারেন।

পরবর্তী পদক্ষেপ

TensorFlow 2-এ SavedModels সম্পর্কে আরও জানতে, নিম্নলিখিত নির্দেশিকাগুলি দেখুন:

আপনি যদি TensorFlow Hub ব্যবহার করেন, তাহলে আপনি এই নির্দেশিকাগুলিকে দরকারী বলে মনে করতে পারেন: