Google I / O là một kết quả hoàn hảo! Cập nhật các phiên TensorFlow Xem phiên

Di chuyển dòng công việc SavedModel

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Khi bạn đã di chuyển mô hình của mình từ đồ thị và phiên của TensorFlow 1 sang các API của TensorFlow 2, chẳng hạn như tf.function . function, tf.Moduletf.keras.Model , bạn có thể di chuyển mã tải và lưu mô hình. Sổ tay này cung cấp các ví dụ về cách bạn có thể lưu và tải ở định dạng SavedModel trong TensorFlow 1 và TensorFlow 2. Dưới đây là tổng quan nhanh về các thay đổi API liên quan để chuyển từ TensorFlow 1 sang TensorFlow 2:

TensorFlow 1 Di chuyển sang TensorFlow 2
Tiết kiệm tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
Keras: tf.keras.models.save_model
Đang tải tf.compat.v1.saved_model.load tf.saved_model.load
Keras: tf.keras.models.load_model
Chữ ký : một tập hợp các đầu vào
và đầu ra căng thẳng
có thể được sử dụng để chạy
Được tạo bằng cách sử dụng utils *.signature_def
(ví dụ: tf.compat.v1.saved_model.predict_signature_def )
Viết một tf.function và xuất nó bằng cách sử dụng đối số signatures
trong tf.saved_model.save .
Phân loại
và hồi quy
:
các loại chữ ký đặc biệt
Được tạo bằng
tf.compat.v1.saved_model.classification_signature_def ,
tf.compat.v1.saved_model.regression_signature_def ,
và một số lần xuất Công cụ ước tính nhất định.
Hai loại chữ ký này đã bị xóa khỏi TensorFlow 2.
Nếu thư viện phục vụ yêu cầu các tên phương thức này,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Để có giải thích sâu hơn về ánh xạ, hãy tham khảo phần Thay đổi từ TensorFlow 1 đến TensorFlow 2 bên dưới.

Thành lập

Các ví dụ dưới đây cho thấy cách xuất và tải cùng một mô hình TensorFlow giả (được định nghĩa là add_two bên dưới) sang định dạng SavedModel bằng cách sử dụng các API TensorFlow 1 và TensorFlow 2. Bắt đầu bằng cách thiết lập các chức năng nhập và tiện ích:

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: Lưu và xuất SavedModel

Trong TensorFlow 1, bạn sử dụng các tf.compat.v1.saved_model.Builder , tf.compat.v1.saved_model.simple_savetf.estimator.Estimator.export_saved_model API để xây dựng, lưu và xuất biểu đồ và phiên TensorFlow:

1. Lưu biểu đồ dưới dạng SavedModel với 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. Xây dựng SavedModel để phân phát

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. Xuất biểu đồ suy luận của Công cụ ước tính dưới dạng SavedModel

Trong định nghĩa của Công cụ ước tính model_fn (được định nghĩa bên dưới), bạn có thể xác định chữ ký trong mô hình của mình bằng cách trả về export_outputs trong tf.estimator.EstimatorSpec . Có nhiều loại đầu ra khác nhau:

Chúng sẽ tạo ra các loại chữ ký phân loại, hồi quy và dự đoán, tương ứng.

Khi công cụ ước tính được xuất với tf.estimator.Estimator.export_saved_model , những chữ ký này sẽ được lưu cùng với mô hình.

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: Lưu và xuất SavedModel

Lưu và xuất SavedModel được xác định bằng tf.Module

Để xuất mô hình của bạn trong TensorFlow 2, bạn phải xác định tf.Module hoặc tf.keras.Model để chứa tất cả các biến và chức năng của mô hình của bạn. Sau đó, bạn có thể gọi tf.saved_model.save để tạo SavedModel. Tham khảo Lưu mô hình tùy chỉnh trong hướng dẫn Sử dụng định dạng SavedModel để tìm hiểu thêm.

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

Lưu và xuất SavedModel được xác định bằng Keras

API Keras để lưu và Mode.save hoặc tf.keras.models.save_model —có thể xuất SavedModel từ tf.keras.Model . Kiểm tra Lưu và tải các mô hình Keras để biết thêm chi tiết.

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

Đang tải SavedModel

Có thể tải SavedModel bằng bất kỳ API nào ở trên bằng cách sử dụng API TensorFlow 1 hoặc TensorFlow.

TensorFlow 1 SavedModel thường có thể được sử dụng để suy luận khi được tải vào TensorFlow 2, nhưng việc đào tạo (tạo gradient) chỉ có thể thực hiện được nếu SavedModel chứa các biến tài nguyên . Bạn có thể kiểm tra kiểu của các biến — nếu kiểu của biến chứa "_ref" thì đó là một biến tham chiếu.

Một TensorFlow 2 SavedModel có thể được tải và thực thi từ TensorFlow 1 miễn là SavedModel được lưu với chữ ký.

Các phần bên dưới chứa các mẫu mã hiển thị cách tải các SavedModels đã lưu trong các phần trước và gọi chữ ký đã xuất.

TensorFlow 1: Tải SavedModel với tf.saved_model.load

Trong TensorFlow 1, bạn có thể nhập SavedModel trực tiếp vào biểu đồ và phiên hiện tại bằng cách sử dụng tf.saved_model.load . Bạn có thể gọi Session.run trên tên đầu vào và đầu ra của 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: Tải một mô hình được lưu bằng tf.saved_model

Trong TensorFlow 2, các đối tượng được tải vào một đối tượng Python để lưu trữ các biến và hàm. Điều này tương thích với các mô hình được lưu từ TensorFlow 1.

Xem tài liệu API tf.saved_model.loadTải và sử dụng phần mô hình tùy chỉnh từ hướng dẫn Sử dụng định dạng SavedModel để biết chi tiết.

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)

Các mô hình được lưu bằng API TensorFlow 2 cũng có thể truy cập các tf.function . functions và các biến được đính kèm với mô hình (thay vì các biến được xuất dưới dạng chữ ký). Ví dụ:

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: Tải mô hình được lưu bằng Keras

API tải tf.keras.models.load_model —cho phép bạn tải lại mô hình đã lưu vào đối tượng Mô hình Keras. Lưu ý rằng điều này chỉ cho phép bạn tải SavedModels được lưu bằng Keras ( Model.save hoặc tf.keras.models.save_model ).

Các mô hình được lưu bằng tf.saved_model.save phải được tải bằng tf.saved_model.load . Bạn có thể tải mô hình Keras được lưu bằng Model.save bằng cách sử dụng tf.saved_model.load nhưng bạn sẽ chỉ nhận được đồ thị TensorFlow. Tham khảo tài liệu API tf.keras.models.load_model và hướng dẫn Lưu và tải mô hình Keras để biết chi tiết.

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 và MetaGraphDef

Không có cách nào đơn giản để tải một GraphDef thô hoặc MetaGraphDef sang TF2. Tuy nhiên, bạn có thể chuyển đổi mã TF1 nhập biểu đồ thành chức năng concrete_function TF2 bằng cách sử dụng v1.wrap_function .

Đầu tiên, lưu 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

Sử dụng các API TF1, bạn có thể sử dụng tf1.train.import_meta_graph để nhập biểu đồ và khôi phục các giá trị:

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

Không có API TF2 để tải biểu đồ, nhưng bạn vẫn có thể nhập nó vào một hàm cụ thể có thể được thực thi ở chế độ háo hức:

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>

Thay đổi từ TensorFlow 1 sang TensorFlow 2

Phần này liệt kê các thuật ngữ lưu và tải khóa từ TensorFlow 1, các điều khoản tương đương với TensorFlow 2 và những gì đã thay đổi.

SavedModel

SavedModel là một định dạng lưu trữ một chương trình TensorFlow hoàn chỉnh với các tham số và tính toán. Nó chứa các chữ ký được sử dụng bởi các nền tảng phục vụ để chạy mô hình.

Bản thân định dạng tệp không thay đổi đáng kể, vì vậy, SavedModels có thể được tải và phân phát bằng cách sử dụng API TensorFlow 1 hoặc TensorFlow 2.

Sự khác biệt giữa TensorFlow 1 và TensorFlow 2

Các trường hợp sử dụng cung cấpsuy luận chưa được cập nhật trong TensorFlow 2, ngoài các thay đổi về API — cải tiến đã được giới thiệu trong khả năng tái sử dụngsoạn các mô hình được tải từ SavedModel.

Trong TensorFlow 2, chương trình được biểu diễn bằng các đối tượng như tf.Variable , tf.Module hoặc các mô hình Keras cấp cao hơn ( tf.keras.Model ) và các lớp ( tf.keras.layers ). Không còn biến toàn cục nào có các giá trị được lưu trữ trong một phiên và biểu đồ hiện tồn tại ở các tf.function . hàm khác nhau. Do đó, trong quá trình xuất mô hình, SavedModel lưu từng thành phần và đồ thị hàm riêng biệt.

Khi bạn viết một chương trình TensorFlow với các API TensorFlow Python, bạn phải xây dựng một đối tượng để quản lý các biến, hàm và các tài nguyên khác. Nói chung, điều này được thực hiện bằng cách sử dụng các API Keras, nhưng bạn cũng có thể xây dựng đối tượng bằng cách tạo hoặc phân lớp tf.Module .

Các mô hình Keras ( tf.keras.Model ) và tf.Module tự động theo dõi các biến và hàm gắn liền với chúng. SavedModel lưu các kết nối này giữa các mô-đun, biến và hàm để chúng có thể được khôi phục khi tải.

Chữ ký

Chữ ký là điểm cuối của SavedModel — chúng cho người dùng biết cách chạy mô hình và đầu vào nào là cần thiết.

Trong TensorFlow 1, các chữ ký được tạo bằng cách liệt kê các tensor đầu vào và đầu ra. Trong TensorFlow 2, các chữ ký được tạo ra bằng cách chuyển các hàm cụ thể . (Đọc thêm về các hàm TensorFlow trong phần Giới thiệu về đồ thị và hướng dẫn về hàm tf .) Tóm lại, một hàm cụ thể được tạo ra từ một 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

Trong TensorFlow 1, bạn có thể gọi Session.run bằng biểu đồ đã nhập miễn là bạn đã biết tên tensor. Điều này cho phép bạn truy xuất các giá trị biến được khôi phục hoặc chạy các phần của mô hình chưa được xuất trong các chữ ký.

Trong TensorFlow 2, bạn có thể truy cập trực tiếp vào một biến, chẳng hạn như ma trận trọng số ( 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

hoặc gọi tf.function . functions s được gắn với đối tượng mô hình: ví dụ, loaded.__call__ .

Không giống như TF1, không có cách nào để trích xuất các phần của một hàm và truy cập các giá trị trung gian. Bạn phải xuất tất cả các chức năng cần thiết trong đối tượng đã lưu.

Ghi chú di chuyển TensorFlow Serving

SavedModel ban đầu được tạo để hoạt động với TensorFlow Serving . Nền tảng này cung cấp các loại yêu cầu dự đoán khác nhau: phân loại, hồi quy và dự đoán.

API TensorFlow 1 cho phép bạn tạo các loại chữ ký này bằng utils:

Phân loại ( classification_signature_def loại_signature_def) và hồi quy ( regression_signature_def ) hạn chế đầu vào và đầu ra, vì vậy đầu vào phải là tf.Example . Ví dụ, và đầu ra phải là classes , scores hoặc prediction . Trong khi đó, chữ ký dự đoán (dự predict_signature_def ) không có hạn chế.

SavedModels được xuất với API TensorFlow 2 tương thích với Cung cấp TensorFlow, nhưng sẽ chỉ chứa các chữ ký dự đoán. Các chữ ký phân loại và hồi quy đã bị loại bỏ.

Nếu bạn yêu cầu sử dụng chữ ký phân loại và hồi quy, bạn có thể sửa đổi SavedModel đã xuất bằng cách sử dụng tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Bước tiếp theo

Để tìm hiểu thêm về SavedModels trong TensorFlow 2, hãy xem các hướng dẫn sau:

Nếu bạn đang sử dụng TensorFlow Hub, bạn có thể thấy các hướng dẫn sau hữu ích: