Migrasikan alur kerja SavedModel

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Setelah Anda memigrasikan model Anda dari grafik dan sesi TensorFlow 1 ke API TensorFlow 2, seperti tf.function , tf.Module , dan tf.keras.Model , Anda dapat memigrasikan kode penyimpanan dan pemuatan model. Notebook ini memberikan contoh bagaimana Anda dapat menyimpan dan memuat dalam format SavedModel di TensorFlow 1 dan TensorFlow 2. Berikut ini ikhtisar singkat tentang perubahan API terkait untuk migrasi dari TensorFlow 1 ke TensorFlow 2:

TensorFlow 1 Migrasi ke TensorFlow 2
Penghematan tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
Keras: tf.keras.models.save_model
Memuat tf.compat.v1.saved_model.load tf.saved_model.load
Keras: tf.keras.models.load_model
Tanda tangan : satu set input
dan output tensor yang
dapat digunakan untuk menjalankan
Dihasilkan menggunakan *.signature_def utils
(misalnya tf.compat.v1.saved_model.predict_signature_def )
Tulis fungsi tf.function dan ekspor menggunakan argumen signatures
di tf.saved_model.save .
Klasifikasi
dan regresi
:
jenis tanda tangan khusus
Dihasilkan dengan
tf.compat.v1.saved_model.classification_signature_def ,
tf.compat.v1.saved_model.regression_signature_def ,
dan ekspor Penaksir tertentu.
Kedua jenis tanda tangan ini telah dihapus dari TensorFlow 2.
Jika pustaka penyajian memerlukan nama metode ini,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Untuk penjelasan pemetaan yang lebih mendalam, lihat bagian Perubahan dari TensorFlow 1 ke TensorFlow 2 di bawah ini.

Mempersiapkan

Contoh di bawah menunjukkan cara mengekspor dan memuat model TensorFlow dummy yang sama (didefinisikan sebagai add_two di bawah) ke format SavedModel menggunakan API TensorFlow 1 dan TensorFlow 2. Mulailah dengan mengatur fungsi impor dan utilitas:

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: Simpan dan ekspor SavedModel

Di TensorFlow 1, Anda menggunakan tf.compat.v1.saved_model.Builder , tf.compat.v1.saved_model.simple_save , dan tf.estimator.Estimator.export_saved_model API untuk membuat, menyimpan, dan mengekspor grafik dan sesi TensorFlow:

1. Simpan grafik sebagai SavedModel dengan 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. Bangun Model Tersimpan untuk disajikan

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. Ekspor grafik inferensi Penaksir sebagai Model Tersimpan

Dalam definisi Estimator model_fn (didefinisikan di bawah), Anda dapat menentukan tanda tangan dalam model Anda dengan mengembalikan export_outputs di tf.estimator.EstimatorSpec . Ada berbagai jenis output:

Ini akan menghasilkan klasifikasi, regresi, dan tipe tanda tangan prediksi, masing-masing.

Ketika estimator diekspor dengan tf.estimator.Estimator.export_saved_model , tanda tangan ini akan disimpan dengan 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: Simpan dan ekspor SavedModel

Simpan dan ekspor SavedModel yang ditentukan dengan tf.Module

Untuk mengekspor model Anda di TensorFlow 2, Anda harus menentukan tf.Module atau tf.keras.Model untuk menampung semua variabel dan fungsi model Anda. Kemudian, Anda dapat memanggil tf.saved_model.save untuk membuat SavedModel. Lihat Menyimpan model kustom di panduan Menggunakan format SavedModel untuk mempelajari lebih lanjut.

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

Simpan dan ekspor SavedModel yang ditentukan dengan Keras

Keras API untuk menyimpan dan mengekspor— Mode.save atau tf.keras.models.save_model —dapat mengekspor SavedModel dari tf.keras.Model . Lihat model Simpan dan muat Keras untuk lebih jelasnya.

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

Memuat Model Tersimpan

SavedModel yang disimpan dengan salah satu API di atas dapat dimuat menggunakan TensorFlow 1 atau TensorFlow API.

SavedModel TensorFlow 1 umumnya dapat digunakan untuk inferensi saat dimuat ke TensorFlow 2, tetapi pelatihan (menghasilkan gradien) hanya dimungkinkan jika SavedModel berisi variabel sumber daya . Anda dapat memeriksa dtype dari variabel—jika variabel dtype berisi "_ref", maka itu adalah variabel referensi.

TensorFlow 2 SavedModel dapat dimuat dan dieksekusi dari TensorFlow 1 selama SavedModel disimpan dengan tanda tangan.

Bagian di bawah ini berisi contoh kode yang menunjukkan cara memuat SavedModels yang disimpan di bagian sebelumnya, dan memanggil tanda tangan yang diekspor.

TensorFlow 1: Muat SavedModel dengan tf.saved_model.load

Di TensorFlow 1, Anda dapat mengimpor SavedModel langsung ke grafik dan sesi saat ini menggunakan tf.saved_model.load . Anda dapat memanggil Session.run dengan nama input dan output tensor:

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: Muat model yang disimpan dengan tf.saved_model

Di TensorFlow 2, objek dimuat ke objek Python yang menyimpan variabel dan fungsi. Ini kompatibel dengan model yang disimpan dari TensorFlow 1.

Lihat tf.saved_model.load API docs dan Loading and using custom model section dari Using the SavedModel format guide untuk detailnya.

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)

Model yang disimpan dengan TensorFlow 2 API juga dapat mengakses tf.function s dan variabel yang dilampirkan ke model (bukan yang diekspor sebagai tanda tangan). Sebagai contoh:

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: Muat model yang disimpan dengan Keras

API pemuatan tf.keras.models.load_model —memungkinkan Anda memuat ulang model yang disimpan kembali ke objek Model Keras. Perhatikan bahwa ini hanya memungkinkan Anda untuk memuat SavedModels yang disimpan dengan Keras ( Model.save atau tf.keras.models.save_model ).

Model yang disimpan dengan tf.saved_model.save harus dimuat dengan tf.saved_model.load . Anda dapat memuat model Keras yang disimpan dengan Model.save menggunakan tf.saved_model.load tetapi Anda hanya akan mendapatkan grafik TensorFlow. Lihat dokumen API tf.keras.models.load_model dan Simpan dan muat panduan model Keras untuk detailnya.

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 dan MetaGraphDef

Tidak ada cara langsung untuk memuat GraphDef MetaGraphDef ke TF2. Namun, Anda dapat mengonversi kode TF1 yang mengimpor grafik menjadi TF2 concrete_function menggunakan v1.wrap_function .

Pertama, simpan 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

Menggunakan TF1 API, Anda dapat menggunakan tf1.train.import_meta_graph untuk mengimpor grafik dan memulihkan nilainya:

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

Tidak ada API TF2 untuk memuat grafik, tetapi Anda masih dapat mengimpornya ke dalam fungsi konkret yang dapat dijalankan dalam mode bersemangat:

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>

Perubahan dari TensorFlow 1 ke TensorFlow 2

Bagian ini mencantumkan istilah penyimpanan dan pemuatan utama dari TensorFlow 1, yang setara dengan TensorFlow 2, dan apa yang telah berubah.

Model Tersimpan

SavedModel adalah format yang menyimpan program TensorFlow lengkap dengan parameter dan komputasi. Ini berisi tanda tangan yang digunakan oleh platform yang melayani untuk menjalankan model.

Format file itu sendiri tidak berubah secara signifikan, sehingga SavedModels dapat dimuat dan disajikan menggunakan API TensorFlow 1 atau TensorFlow 2.

Perbedaan antara TensorFlow 1 dan TensorFlow 2

Kasus penggunaan penyajian dan inferensi belum diperbarui di TensorFlow 2, selain dari perubahan API—peningkatan diperkenalkan pada kemampuan untuk menggunakan kembali dan membuat model yang dimuat dari SavedModel.

Di TensorFlow 2, program diwakili oleh objek seperti tf.Variable , tf.Module , atau model Keras tingkat tinggi ( tf.keras.Model ) dan lapisan ( tf.keras.layers ). Tidak ada lagi variabel global yang memiliki nilai yang disimpan dalam sebuah sesi, dan grafiknya sekarang ada di tf.function s yang berbeda. Akibatnya, selama ekspor model, SavedModel menyimpan setiap komponen dan grafik fungsi secara terpisah.

Saat Anda menulis program TensorFlow dengan TensorFlow Python API, Anda harus membuat objek untuk mengelola variabel, fungsi, dan sumber daya lainnya. Umumnya, ini dilakukan dengan menggunakan API Keras, tetapi Anda juga dapat membangun objek dengan membuat atau tf.Module .

Model keras ( tf.keras.Model ) dan tf.Module secara otomatis melacak variabel dan fungsi yang menyertainya. SavedModel menyimpan koneksi ini antara modul, variabel, dan fungsi, sehingga mereka dapat dipulihkan saat memuat.

Tanda tangan

Tanda tangan adalah titik akhir dari SavedModel—tanda tangan memberi tahu pengguna cara menjalankan model dan input apa yang diperlukan.

Di TensorFlow 1, tanda tangan dibuat dengan mencantumkan tensor input dan output. Di TensorFlow 2, tanda tangan dihasilkan dengan meneruskan fungsi konkret . (Baca selengkapnya tentang fungsi TensorFlow di Pengantar grafik dan panduan fungsi tf.) Singkatnya, fungsi konkret dihasilkan dari 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

Di TensorFlow 1, Anda dapat memanggil Session.run dengan grafik yang diimpor selama Anda sudah mengetahui nama tensornya. Ini memungkinkan Anda untuk mengambil nilai variabel yang dipulihkan, atau menjalankan bagian dari model yang tidak diekspor dalam tanda tangan.

Di TensorFlow 2, Anda dapat langsung mengakses variabel, seperti matriks bobot ( 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

atau panggil tf.function s yang dilampirkan ke objek model: misalnya, loaded.__call__ .

Tidak seperti TF1, tidak ada cara untuk mengekstrak bagian dari suatu fungsi dan mengakses nilai antara. Anda harus mengekspor semua fungsionalitas yang diperlukan dalam objek yang disimpan.

Catatan migrasi TensorFlow Melayani

SavedModel awalnya dibuat untuk bekerja dengan TensorFlow Serving . Platform ini menawarkan berbagai jenis permintaan prediksi: mengklasifikasikan, mundur, dan memprediksi.

TensorFlow 1 API memungkinkan Anda membuat jenis tanda tangan ini dengan utilitas:

Klasifikasi ( classification_signature_def ) dan regresi ( regression_signature_def ) membatasi input dan output, jadi input harus berupa tf.Example , dan output harus berupa classes , scores , atau prediction . Sementara itu, tanda tangan prediksi ( predict_signature_def ) tidak memiliki batasan.

SavedModels yang diekspor dengan TensorFlow 2 API kompatibel dengan TensorFlow Serving, tetapi hanya akan berisi tanda tangan prediksi. Tanda tangan klasifikasi dan regresi telah dihapus.

Jika Anda memerlukan penggunaan tanda tangan klasifikasi dan regresi, Anda dapat memodifikasi SavedModel yang diekspor menggunakan tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Langkah selanjutnya

Untuk mempelajari lebih lanjut tentang SavedModels di TensorFlow 2, lihat panduan berikut:

Jika Anda menggunakan TensorFlow Hub, Anda mungkin menemukan panduan ini berguna: