SavedModel iş akışını taşıma

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Modelinizi TensorFlow 1'in grafiklerinden ve oturumlarından tf.function , tf.Module ve tf.keras.Model gibi TensorFlow 2 API'lerine taşıdıktan sonra, model kaydetme ve yükleme kodunu taşıyabilirsiniz. Bu not defteri, TensorFlow 1 ve TensorFlow 2'de SavedModel biçiminde nasıl kaydedip yükleyebileceğinize ilişkin örnekler sağlar. Burada TensorFlow 1'den TensorFlow 2'ye geçiş için ilgili API değişikliklerine hızlı bir genel bakış sunulmaktadır:

TensorFlow 1 TensorFlow 2'ye Geçiş
kaydetme tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
Keras: tf.keras.models.save_model
Yükleniyor tf.compat.v1.saved_model.load tf.saved_model.load
Keras: tf.keras.models.load_model
İmzalar : bir dizi girdi
ve çıkış tensörleri
çalıştırmak için kullanılabilir
*.signature_def araçları kullanılarak oluşturuldu
(ör tf.compat.v1.saved_model.predict_signature_def )
Bir tf.function yazın ve bunu signatures argümanını kullanarak dışa aktarın
tf.saved_model.save içinde.
sınıflandırma
ve gerileme
:
özel imza türleri
ile oluşturuldu
tf.compat.v1.saved_model.classification_signature_def ,
tf.compat.v1.saved_model.regression_signature_def ,
ve belirli Tahminci ihracatları.
Bu iki imza türü TensorFlow 2'den kaldırılmıştır.
Sunum kitaplığı bu yöntem adlarını gerektiriyorsa,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Eşlemenin daha ayrıntılı açıklaması için aşağıdaki TensorFlow 1'den TensorFlow 2'ye Değişiklikler bölümüne bakın.

Kurmak

Aşağıdaki örnekler, aynı kukla TensorFlow modelinin (aşağıda add_two olarak tanımlanmıştır) TensorFlow 1 ve TensorFlow 2 API'lerini kullanarak SavedModel formatına nasıl aktarılacağını ve yükleneceğini göstermektedir. İçe aktarma ve yardımcı program işlevlerini ayarlayarak başlayın:

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'i kaydedin ve dışa aktarın

TensorFlow 1'de, TensorFlow grafiğini ve oturumunu oluşturmak, kaydetmek ve dışa aktarmak için tf.compat.v1.saved_model.Builder , tf.compat.v1.saved_model.simple_save ve tf.estimator.Estimator.export_saved_model API'lerini kullanırsınız:

1. Grafiği SavedModelBuilder ile SavedModel olarak kaydedin

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
yer tutucu3 l10n-yer
!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. Sunmak için bir SavedModel oluşturun

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
yer tutucu7 l10n-yer
!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. Tahminci çıkarım grafiğini SavedModel olarak dışa aktarın

Tahminci model_fn (aşağıda tanımlanmıştır), export_outputs içindeki tf.estimator.EstimatorSpec değerini döndürerek modelinizdeki imzaları tanımlayabilirsiniz. Farklı çıktı türleri vardır:

Bunlar sırasıyla sınıflandırma, regresyon ve tahmin imza türleri üretecektir.

Tahmin edici tf.estimator.Estimator.export_saved_model ile dışa aktarıldığında, bu imzalar modelle birlikte kaydedilecektir.

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'
yer tutucu11 l10n-yer
!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'i kaydedin ve dışa aktarın

tf.Module ile tanımlanmış bir SavedModel'i kaydedin ve dışa aktarın

Modelinizi TensorFlow 2'de dışa aktarmak için, modelinizin tüm değişkenlerini ve işlevlerini tutmak için bir tf.Module veya bir tf.keras.Model tanımlamanız gerekir. Ardından, tf.saved_model.save oluşturmak için tf.saved_model.save'i çağırabilirsiniz. Daha fazla bilgi için SavedModel biçimini kullanma kılavuzundaki Özel bir modeli kaydetme konusuna bakın.

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.
yer tutucu15 l10n-yer
!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 ile tanımlanmış bir SavedModel'i kaydedin ve dışa aktarın

Kaydetme ve dışa aktarma için Keras API'leri— Mode.save veya tf.keras.models.save_model bir SavedModel'i bir tf.keras.Model öğesinden dışa aktarabilir. Daha fazla ayrıntı için Keras modellerini kaydet ve yükle bölümüne bakın.

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
yer tutucu19 l10n-yer
!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 Yükleme

Yukarıdaki API'lerden herhangi biriyle kaydedilen bir SavedModel, TensorFlow 1 veya TensorFlow API'leri kullanılarak yüklenebilir.

Bir TensorFlow 1 SavedModel, TensorFlow 2'ye yüklendiğinde genellikle çıkarım için kullanılabilir, ancak eğitim (gradyanlar oluşturma) yalnızca SavedModel kaynak değişkenleri içeriyorsa mümkündür. Değişkenlerin türünü kontrol edebilirsiniz—dtype değişkeni "_ref" içeriyorsa, bu bir referans değişkendir.

Bir TensorFlow 2 SavedModel, SavedModel imzalarla kaydedildiği sürece TensorFlow 1'den yüklenebilir ve yürütülebilir.

Aşağıdaki bölümler, önceki bölümlerde kaydedilen SavedModel'lerin nasıl yükleneceğini ve dışa aktarılan imzanın nasıl çağırılacağını gösteren kod örneklerini içerir.

TensorFlow 1: SavedModel'i tf.saved_model.load ile yükleyin

TensorFlow 1'de, SavedModel'i tf.saved_model.load kullanarak doğrudan geçerli grafiğe ve oturuma tf.saved_model.load . Tensör giriş ve çıkış adlarında Session.run arayabilirsiniz:

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.)
tutucu22 l10n-yer
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 ile kaydedilmiş bir modeli yükleyin

TensorFlow 2'de nesneler, değişkenleri ve işlevleri depolayan bir Python nesnesine yüklenir. Bu, TensorFlow 1'den kaydedilen modellerle uyumludur.

Ayrıntılar için tf.saved_model.load API belgelerine ve SavedModel biçimini kullanma kılavuzundaki Özel bir model yükleme ve kullanma bölümüne bakın.

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.)
tutucu24 l10n-yer
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 ile kaydedilen modeller, tf.function s ve modele eklenen değişkenlere de erişebilir (imza olarak dışa aktarılanlar yerine). Örneğin:

loaded = tf.saved_model.load('tf2-save')
print('restored __call__:', loaded.__call__)
print('output with input 5.', loaded(5))
tutucu26 l10n-yer
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 ile kaydedilmiş bir modeli yükleyin

Keras yükleme tf.keras.models.load_model —tf.keras.models.load_model—kaydedilmiş bir modeli bir Keras Model nesnesine yeniden yüklemenize olanak tanır. Bunun yalnızca Keras ( Model.save veya tf.keras.models.save_model ) ile kaydedilen SavedModel'leri yüklemenize izin verdiğini unutmayın.

tf.saved_model.save ile kaydedilen modeller tf.saved_model.save ile tf.saved_model.load . Model.save ile kaydedilmiş bir Keras modelini Model.save kullanarak tf.saved_model.load , ancak yalnızca TensorFlow grafiğini alırsınız. Ayrıntılar için tf.keras.models.load_model API belgelerine ve Keras modellerini kaydet ve yükle kılavuzuna bakın.

loaded_model = tf.keras.models.load_model('keras-model')
loaded_model.predict_on_batch(tf.constant([1, 3, 4]))
tutucu28 l10n-yer
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 ve MetaGraphDef

Ham GraphDef veya MetaGraphDef TF2'ye yüklemenin kolay bir yolu yoktur. Ancak grafiği içe aktaran TF1 kodunu v1.wrap_function concrete_function

İlk önce bir MetaGraphDef kaydedin:

# 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')
tutucu30 l10n-yer
15.0

TF1 API'lerini kullanarak grafiği içe aktarmak ve değerleri geri yüklemek için tf1.train.import_meta_graph kullanabilirsiniz:

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}))
tutucu32 l10n-yer
INFO:tensorflow:Restoring parameters from multiply_values.ckpt
15.0

Grafiği yüklemek için TF2 API'leri yoktur, ancak yine de onu istekli modda yürütülebilecek somut bir işleve aktarabilirsiniz:

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.
tutucu34 l10n-yer
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'den TensorFlow 2'ye Değişiklikler

Bu bölüm, TensorFlow 1'deki önemli kaydetme ve yükleme terimlerini, bunların TensorFlow 2 eşdeğerlerini ve nelerin değiştiğini listeler.

Kayıtlı Model

SavedModel , parametreler ve hesaplama ile eksiksiz bir TensorFlow programını saklayan bir formattır. Modeli çalıştırmak için hizmet veren platformlar tarafından kullanılan imzaları içerir.

Dosya biçiminin kendisi önemli ölçüde değişmedi, bu nedenle SavedModels, TensorFlow 1 veya TensorFlow 2 API'leri kullanılarak yüklenebilir ve sunulabilir.

TensorFlow 1 ve TensorFlow 2 arasındaki farklar

API değişikliklerinin yanı sıra TensorFlow 2'de sunum ve çıkarım kullanım durumları güncellenmedi - SavedModel'den yüklenen modelleri yeniden kullanma ve oluşturma yeteneğinde iyileştirme yapıldı.

TensorFlow 2'de program, tf.Variable , tf.Module veya daha yüksek seviyeli Keras modelleri ( tf.keras.Model ) ve katmanlar ( tf.keras.layers ) gibi nesnelerle temsil edilir. Bir oturumda saklanan değerlere sahip global değişkenler artık yoktur ve grafik artık farklı tf.function s'de bulunmaktadır. Sonuç olarak, bir model dışa aktarma sırasında SavedModel, her bir bileşen ve fonksiyon grafiklerini ayrı ayrı kaydeder.

TensorFlow Python API'leri ile bir TensorFlow programı yazdığınızda, değişkenleri, işlevleri ve diğer kaynakları yönetmek için bir nesne oluşturmalısınız. Genellikle bu, Keras API'leri kullanılarak gerçekleştirilir, ancak nesneyi tf.Module oluşturarak veya alt sınıflandırarak da oluşturabilirsiniz.

Keras modelleri ( tf.keras.Model ) ve tf.Module , değişkenleri ve bunlara bağlı işlevleri otomatik olarak izler. SavedModel, modüller, değişkenler ve işlevler arasındaki bu bağlantıları yüklerken geri yüklenebilmeleri için kaydeder.

imzalar

İmzalar, SavedModel'in uç noktalarıdır; kullanıcıya modeli nasıl çalıştıracağını ve hangi girdilerin gerekli olduğunu söylerler.

TensorFlow 1'de, giriş ve çıkış tensörleri listelenerek imzalar oluşturulur. TensorFlow 2'de, somut işlevler geçirilerek imzalar oluşturulur. ( Grafiklere Giriş ve tf.function kılavuzunda TensorFlow işlevleri hakkında daha fazla bilgi edinin.) Kısacası, bir tf.function somut bir işlev oluşturulur :

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

tf.saved_model.save(model, path, signatures={
    'name': fn
})
tutucu36 l10n-yer
# 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'de, tensör adlarını zaten bildiğiniz sürece, içe aktarılan grafikle Session.run arayabilirsiniz. Bu, geri yüklenen değişken değerlerini almanıza veya modelin imzalarda dışa aktarılmayan kısımlarını çalıştırmanıza olanak tanır.

TensorFlow 2'de, ağırlık matrisi ( kernel ) gibi bir değişkene doğrudan erişebilirsiniz:

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

veya model nesnesine eklenmiş tf.function s çağrısı: örneğin, loaded.__call__ .

TF1'den farklı olarak, bir fonksiyonun parçalarını çıkarmanın ve ara değerlere erişmenin bir yolu yoktur. Kaydedilen nesnede gerekli tüm işlevleri dışa aktarmalısınız.

TensorFlow Sunma geçiş notları

SavedModel, başlangıçta TensorFlow Serving ile çalışmak üzere oluşturuldu. Bu platform farklı türde tahmin istekleri sunar: sınıflandırma, gerileme ve tahmin etme.

TensorFlow 1 API, araçlarla şu tür imzalar oluşturmanıza olanak tanır:

Sınıflandırma ( classification_signature_def ) ve regresyon ( regression_signature_def ) girdileri ve çıktıları kısıtlar, bu nedenle girdiler bir tf.Example olmalı ve çıktılar classes , scores veya prediction olmalıdır. Bu arada, tahmin imzasının ( predict_signature_def ) herhangi bir kısıtlaması yoktur.

TensorFlow 2 API ile dışa aktarılan SavedModel'ler, TensorFlow Sunumu ile uyumludur, ancak yalnızca tahmin imzalarını içerecektir. Sınıflandırma ve regresyon imzaları kaldırıldı.

Sınıflandırma ve regresyon imzalarının kullanılması tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater , dışa aktarılan SavedModel'i tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater kullanarak değiştirebilirsiniz.

Sonraki adımlar

TensorFlow 2'deki SavedModel'ler hakkında daha fazla bilgi edinmek için aşağıdaki kılavuzlara göz atın:

TensorFlow Hub kullanıyorsanız, bu kılavuzları faydalı bulabilirsiniz: