עזרה להגן על שונית המחסום הגדולה עם TensorFlow על Kaggle הצטרפו אתגר

העבר את זרימת העבודה SavedModel

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-GitHub הורד מחברת

ברגע שיש לך היגרו המודל שלך גרפים הפעלות של TensorFlow 1 ל TensorFlow 2 APIs, כגון tf.function , tf.Module , ו tf.keras.Model , אתה יכול להעביר את החיסכון מודל וקוד הטעינה. מחברת זו מספקת דוגמאות כיצד ניתן לשמור ולטעון בפורמט SavedModel ב-TensorFlow 1 וב-TensorFlow 2. הנה סקירה מהירה של השינויים הקשורים ב-API עבור ההעברה מ-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
חתימות: סט של קלט
ופלט טנסורים כי
ניתן להשתמש כדי להפעיל את
Generated באמצעות *.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 ,
ויצוא מסוימים של הערכה.
שני סוגי החתימות הללו הוסרו מ-TensorFlow 2.
אם ספריית השירות דורשת את שמות השיטה האלה,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

לקבלת הסבר מעמיק יותר של מיפוי, עיין שינויים מ TensorFlow 1 ל TensorFlow 2 להלן.

להכין

הדוגמאות הבאות מראות כיצד לייצא ולטעון אותו מודל דמה TensorFlow (המוגדר add_two להלן) לפורמט SavedModel באמצעות ממשקי API TensorFlow 1 ו TensorFlow 2. התחל על ידי הגדרת פונקציות הייבוא ​​ושירותי השירות:

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 APIs לבנות, לשמור, ולייצא את הגרף ואת מושב 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. ייצא את גרף ההסקת האומד כ-SaveModel

בהגדרת הערכת 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

Keras APIs לחיסכון exporting- 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

ניתן לטעון SavedModel שנשמר עם כל אחד מממשקי ה-API שלעיל באמצעות TensorFlow 1 או TensorFlow APIs.

TensorFlow 1 SavedModel יכול לשמש בדרך כלל היסק כאשר נטענו לתוך 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, אובייקטים נטענים לתוך אובייקט Python המאחסן את המשתנים והפונקציות. זה תואם לדגמים שנשמרו מ- TensorFlow 1.

בדוק את tf.saved_model.load Docs 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

API- טעינת Keras tf.keras.models.load_model , מאפשר לטעון גב דגם הציל לתוך אובייקט דגם Keras. הערה כי זה רק מאפשר לך 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. עיין tf.keras.models.load_model Docs API ו- שמור ומודלי 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 כי יבוא הגרף לתוך TF2 concrete_function באמצעות v1.wrap_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

באמצעות APIs 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.

הבדלים בין TensorFlow 1 ל- TensorFlow 2

מקרי שימוש הגשת היסק לא עודכנו ב TensorFlow 2, מלבד השינויים ב- API השיפור הוצג היכולת לעשות שימוש חוזר ומודלים להלחין נטענת מ SavedModel.

בשנת TensorFlow 2, תוכנית מיוצגת על ידי אובייקטים כמו tf.Variable , tf.Module , או מודלים Keras ברמה גבוהה ( tf.keras.Model ) ושכבות ( tf.keras.layers ). אין משתנים גלובליים יותר כי יש ערכים מאוחסנים בפגישה, ואת הגרף עכשיו קיים שונות tf.function ים. כתוצאה מכך, במהלך ייצוא מודל, SavedModel שומר כל רכיב וגרפים של פונקציות בנפרד.

כאשר אתה כותב תוכנית TensorFlow עם TensorFlow Python APIs, עליך לבנות אובייקט לניהול המשתנים, הפונקציות ומשאבים אחרים. באופן כללי, זו מושגת על ידי שימוש Keras APIs, אבל אתה גם יכול לבנות את האובייקט על ידי יצירה או subclassing 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 ים מחובר אובייקט המודל: למשל, loaded.__call__ .

שלא כמו TF1, אין דרך לחלץ חלקים של פונקציה ולגשת לערכי ביניים. עליך לייצא את כל הפונקציונליות הדרושה באובייקט הציל.

הערות הגירה של TensorFlow Serving

SavedModel נוצרה במקור כדי עבודה עם TensorFlow הגשה . פלטפורמה זו מציעה סוגים שונים של בקשות חיזוי: סיווג, נסיגה וחיזוי.

ה- API של 1 TensorFlow מאפשר לך ליצור סוגים אלה של חתימות עם utils:

סיווג ( classification_signature_def ) ו רגרסיה ( regression_signature_def ) להגביל את התשומות ותפוקות, כך התשומות חייבות להיות tf.Example , ואת התפוקות חייבות להיות classes , scores או prediction . בינתיים, לחזות החתימה ( predict_signature_def ) אין הגבלות.

SavedModels מיוצא עם ה- API 2 TensorFlow תואמים TensorFlow הגשה, אך יכיל חתימות חיזוי בלבד. חתימות הסיווג והרגרסיה הוסרו.

אם דורש שימוש חתימות סיווג רגרסיה, אתה יכול לשנות את SavedModel ליצוא באמצעות tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

הצעדים הבאים

למידע נוסף על SavedModels ב-TensorFlow 2, עיין במדריכים הבאים:

אם אתה משתמש ב- TensorFlow Hub, ייתכן שתמצא את המדריכים הבאים שימושיים: