گردش کار SavedModel را منتقل کنید

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

هنگامی که مدل خود را از نمودارها و جلسات TensorFlow 1 به APIهای TensorFlow 2، مانند tf.function ، tf.Module و tf.keras.Model ، می توانید کد ذخیره و بارگذاری مدل را منتقل کنید. این نوت بوک نمونه هایی از نحوه ذخیره و بارگذاری در قالب SavedModel در TensorFlow 1 و TensorFlow 2 را ارائه می دهد.

TensorFlow 1 مهاجرت به TensorFlow 2
صرفه جویی در tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
Keras: tf.keras.models.save_model
بارگذاری tf.compat.v1.saved_model.load tf.saved_model.load
Keras: tf.keras.models.load_model
امضاها : مجموعه ای از ورودی ها
و تانسورهای خروجی که
می توان برای اجرای آن استفاده کرد
با استفاده از *.signature_def utils ایجاد شده است
(به عنوان مثال 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 ،
و برخی صادرات Estimator.
این دو نوع امضا از TensorFlow 2 حذف شده اند.
اگر کتابخانه ارائه دهنده به این نام های متد نیاز دارد،
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

برای توضیح بیشتر در مورد نقشه برداری، به بخش تغییرات از TensorFlow 1 به TensorFlow 2 در زیر مراجعه کنید.

برپایی

مثال‌های زیر نشان می‌دهند که چگونه می‌توان همان مدل ساختگی TensorFlow (که در زیر به عنوان add_two تعریف شده است) را با استفاده از API‌های TensorFlow 1 و TensorFlow 2 به قالب SavedModel صادر و بارگذاری کرد. با تنظیم توابع واردات و ابزار شروع کنید:

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

TensorFlow 1: ذخیره و صادر کردن SavedModel

در TensorFlow 1، از tf.compat.v1.saved_model.Builder ، tf.compat.v1.saved_model.simple_save ، و tf.estimator.Estimator.export_saved_model برای ساخت، ذخیره و صادر کردن نمودار و جلسه TensorFlow استفاده می‌کنید:

1. نمودار را به عنوان SavedModel با SavedModelBuilder ذخیره کنید

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. یک SavedModel برای خدمت بسازید

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. نمودار استنتاج Estimator را به عنوان SavedModel صادر کنید

در تعریف Estimator model_fn (تعریف شده در زیر)، می توانید با برگرداندن export_outputs در tf.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.]

TensorFlow 2: ذخیره و صادر کردن SavedModel

SavedModel تعریف شده با tf.Module را ذخیره و صادر کنید

برای صادر کردن مدل خود در TensorFlow 2، باید یک tf.Module یا یک tf.keras.Model کنید تا همه متغیرها و توابع مدل شما را در خود جای دهد. سپس، می توانید tf.saved_model.save را برای ایجاد SavedModel فراخوانی کنید. برای اطلاعات بیشتر به ذخیره یک مدل سفارشی در راهنمای فرمت استفاده از SavedModel مراجعه کنید.

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

SavedModel تعریف شده با Keras را ذخیره و صادر کنید

APIهای Keras برای ذخیره و صادر Mode.save یا tf.keras.models.save_model می توانند SavedModel را از یک tf.keras.Model کنند. برای جزئیات بیشتر، مدل‌های Keras را ذخیره و بارگیری کنید.

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

بارگیری یک مدل ذخیره شده

SavedModel ذخیره شده با هر یک از APIهای بالا را می توان با استفاده از TensorFlow 1 یا TensorFlow API بارگیری کرد.

یک SavedModel TensorFlow 1 به طور کلی می تواند برای استنتاج زمانی که در TensorFlow 2 بارگذاری می شود استفاده شود، اما آموزش (تولید گرادیان) تنها در صورتی امکان پذیر است که SavedModel دارای متغیرهای منبع باشد . می‌توانید dtype متغیرها را بررسی کنید—اگر متغیر dtype حاوی "_ref" باشد، آنگاه یک متغیر مرجع است.

یک TensorFlow 2 SavedModel را می توان از TensorFlow 1 بارگیری و اجرا کرد تا زمانی که SavedModel با امضا ذخیره شود.

بخش‌های زیر حاوی نمونه‌های کدی است که نحوه بارگیری SavedModels ذخیره‌شده در بخش‌های قبلی و فراخوانی امضای صادر شده را نشان می‌دهد.

TensorFlow 1: یک SavedModel را با tf.saved_model.load بارگذاری کنید

در TensorFlow 1، می‌توانید SavedModel را مستقیماً با استفاده از tf.saved_model.load به نمودار و جلسه فعلی وارد کنید. می توانید 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 و بارگیری و استفاده از بخش مدل سفارشی را از راهنمای قالب استفاده از SavedModel بررسی کنید.

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)

مدل‌های ذخیره‌شده با API TensorFlow 2 همچنین می‌توانند به tf.function و متغیرهایی که به مدل متصل شده‌اند (به‌جای مواردی که به‌عنوان امضا صادر می‌شوند) دسترسی داشته باشند. مثلا:

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)

TensorFlow 2: یک مدل ذخیره شده با Keras را بارگیری کنید

Keras loading API tf.keras.models.load_model به شما امکان می دهد یک مدل ذخیره شده را دوباره در یک شی Keras Model بارگیری کنید. توجه داشته باشید که این فقط به شما امکان می دهد SavedModels ذخیره شده با Keras را بارگیری کنید ( Model.save یا tf.keras.models.save_model ).

مدل های ذخیره شده با tf.saved_model.save باید با tf.saved_model.load بارگذاری شوند. شما می توانید یک مدل Keras را که با Model.save ذخیره شده است با استفاده از tf.saved_model.load کنید اما فقط نمودار TensorFlow را دریافت خواهید کرد. برای جزئیات، به اسناد API tf.keras.models.load_model و راهنمای مدل‌های Keras ذخیره و بارگیری کنید.

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 وجود ندارد. با این حال، می‌توانید کد TF1 را که گراف را وارد می‌کند، با استفاده از v1.wrap_function 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

با استفاده از API های TF1، می توانید از 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

هیچ API TF2 برای بارگیری نمودار وجود ندارد، اما همچنان می‌توانید آن را به یک تابع مشخص که می‌تواند در حالت مشتاق اجرا شود، وارد کنید:

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

SavedModel فرمتی است که یک برنامه کامل TensorFlow را با پارامترها و محاسبات ذخیره می کند. این شامل امضاهایی است که توسط پلتفرم های سرویس دهی برای اجرای مدل استفاده می شود.

فرمت فایل به طور قابل توجهی تغییر نکرده است، بنابراین SavedModels را می توان با استفاده از API های TensorFlow 1 یا TensorFlow 2 بارگیری و ارائه کرد.

تفاوت بین تنسورفلو 1 و تنسورفلو 2

موارد استفاده از سرویس و استنتاج در TensorFlow 2 به‌روزرسانی نشده‌اند، به غیر از تغییرات API - این بهبود در توانایی استفاده مجدد و نوشتن مدل‌های بارگذاری‌شده از SavedModel ارائه شد.

در TensorFlow 2، برنامه با اشیایی مانند tf.Variable ، tf.Module ، یا مدل‌های Keras سطح بالاتر ( tf.keras.Model ) و لایه‌ها ( tf.keras.layers ) نمایش داده می‌شود. هیچ متغیر جهانی دیگری وجود ندارد که دارای مقادیر ذخیره شده در یک جلسه باشد، و نمودار اکنون در tf.function های مختلف وجود دارد. در نتیجه، در طول صادرات مدل، SavedModel هر یک از اجزا و نمودارهای تابع را به طور جداگانه ذخیره می کند.

هنگامی که یک برنامه TensorFlow را با APIهای TensorFlow پایتون می نویسید، باید یک شی برای مدیریت متغیرها، توابع و منابع دیگر بسازید. به طور کلی، این کار با استفاده از APIهای Keras انجام می شود، اما شما همچنین می توانید با ایجاد یا زیر کلاس بندی tf.Module ، شی را بسازید.

مدل‌های Keras ( tf.keras.Model ) و tf.Module به طور خودکار متغیرها و توابع متصل به آنها را ردیابی می‌کنند. SavedModel این اتصالات را بین ماژول ها، متغیرها و توابع ذخیره می کند تا بتوان آنها را هنگام بارگذاری بازیابی کرد.

امضاها

امضاها نقاط پایانی SavedModel هستند—آنها به کاربر می گویند که چگونه مدل را اجرا کند و چه ورودی هایی لازم است.

در TensorFlow 1، امضاها با فهرست کردن تانسورهای ورودی و خروجی ایجاد می‌شوند. در TensorFlow 2، امضاها با عبور دادن توابع بتن تولید می شوند. (در مورد توابع TensorFlow در مقدمه نمودارها و راهنمای tf.function بیشتر بخوانید.) به طور خلاصه، یک تابع مشخص از یک 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 s متصل به شی مدل را فراخوانی کنید: برای مثال، loaded.__call__ .

برخلاف TF1، هیچ راهی برای استخراج بخشی از یک تابع و دسترسی به مقادیر میانی وجود ندارد. شما باید تمام عملکردهای مورد نیاز را در شی ذخیره شده صادر کنید.

یادداشت‌های انتقال خدمت TensorFlow

SavedModel در ابتدا برای کار با TensorFlow Serving ایجاد شد. این پلتفرم انواع مختلفی از درخواست های پیش بینی را ارائه می دهد: طبقه بندی، پسرفت و پیش بینی.

API TensorFlow 1 به شما امکان می دهد این نوع امضاها را با ابزارهای زیر ایجاد کنید:

طبقه‌بندی ( classification_signature_def ) و رگرسیون ( regression_signature_def ) ورودی‌ها و خروجی‌ها را محدود می‌کنند، بنابراین ورودی‌ها باید tf.Example و خروجی‌ها باید classes ، scores یا prediction باشند. در ضمن امضای پیش بینی ( predict_signature_def ) هیچ محدودیتی ندارد.

SavedModel های صادر شده با API TensorFlow 2 با سرویس TensorFlow سازگار هستند، اما فقط حاوی امضاهای پیش بینی هستند. امضاهای طبقه بندی و رگرسیون حذف شده اند.

اگر به استفاده از امضاهای طبقه بندی و رگرسیون نیاز دارید، می توانید SavedModel صادر شده را با استفاده از tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater تغییر دهید.

مراحل بعدی

برای کسب اطلاعات بیشتر در مورد SavedModels در TensorFlow 2، راهنماهای زیر را بررسی کنید:

اگر از TensorFlow Hub استفاده می کنید، ممکن است این راهنماها برای شما مفید باشد: