ヘルプKaggleにTensorFlowグレートバリアリーフを保護チャレンジに参加

SavedModelワークフローを移行します

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示 ノートブックをダウンロード

次のようなTensorFlow 2のAPIにTensorFlow 1のグラフやセッションからモデルを移行した後はtf.functiontf.Module 、およびtf.keras.Model 、あなたは、モデルのセーブとロードコードを移行することができます。このノートブックでは、TensorFlow1およびTensorFlow2でSavedModel形式で保存およびロードする方法の例を示します。TensorFlow1からTensorFlow2への移行に関連するAPIの変更の概要を以下に示します。

TensorFlow 1 TensorFlow2への移行
保存tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
Keras: tf.keras.models.save_model
読み込み中tf.compat.v1.saved_model.load tf.saved_model.load
Keras: tf.keras.models.load_model
署名:入力のセット
と出力テンソル
を実行するために使用することができます
使用して生成された*.signature_def utilsの
(例えばtf.compat.v1.saved_model.predict_signature_def
書くtf.functionして使用してエクスポートsignatures引数を
tf.saved_model.save
分類
回帰

特別な種類の署名
で生成
tf.compat.v1.saved_model.classification_signature_def
tf.compat.v1.saved_model.regression_signature_def
および特定のEstimatorエクスポート。
これらの2つのシグニチャタイプはTensorFlow2から削除されました。
サービングライブラリでこれらのメソッド名が必要な場合は、
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater

マッピングのより詳細な説明については、を参照TensorFlow 2 TensorFlow 1からの変更点以下のセクション。

設定

(として定義同じダミーTensorFlowモデルエクスポートおよびロードする方法を示し、以下の実施例add_two TensorFlow 1及びTensorFlow 2つのAPIを使用してSavedModel形式に以下を)。インポートおよびユーティリティ関数を設定することから始めます。

import tensorflow as tf
import tensorflow.compat.v1 as tf1
import shutil

def remove_dir(path):
  try:
    shutil.rmtree(path)
  except:
    pass

def add_two(input):
  return input + 2

TensorFlow 1:SavedModelを保存してエクスポートします

TensorFlow 1で、使用tf.compat.v1.saved_model.Buildertf.compat.v1.saved_model.simple_save 、およびtf.estimator.Estimator.export_saved_modelビルドにAPIを、保存、およびTensorFlowグラフとセッションをエクスポートします。

1.SavedModelBuilderを使用してグラフをSavedModelとして保存します

remove_dir("saved-model-builder")

with tf.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=[])
    output = add_two(input)
    print("add two output: ", sess.run(output, {input: 3.}))

    # Save with SavedModelBuilder
    builder = tf1.saved_model.Builder('saved-model-builder')
    sig_def = tf1.saved_model.predict_signature_def(
        inputs={'input': input},
        outputs={'output': output})
    builder.add_meta_graph_and_variables(
        sess, tags=["serve"], signature_def_map={
            tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig_def
    })
    builder.save()
add two output:  5.0
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:208: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: saved-model-builder/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
Traceback (most recent call last):
  File "/tmpfs/src/tf_docs_env/bin/saved_model_cli", line 8, in <module>
    sys.exit(main())
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 1211, in main
    args.func(args)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 769, in run
    init_tpu=args.init_tpu, tf_debug=args.tf_debug)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 417, in run_saved_model_with_feed_dict
    tag_set)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 117, in get_meta_graph_def
    saved_model = read_saved_model(saved_model_dir)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 55, in read_saved_model
    raise IOError("SavedModel file does not exist at: %s" % saved_model_dir)
OSError: SavedModel file does not exist at: simple-save

2.提供するためのSavedModelを作成します

remove_dir("simple-save")

with tf.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=[])
    output = add_two(input)
    print("add_two output: ", sess.run(output, {input: 3.}))

    tf1.saved_model.simple_save(
        sess, 'simple-save',
        inputs={'input': input},
        outputs={'output': output})
add_two output:  5.0
WARNING:tensorflow:From /tmp/ipykernel_26511/250978412.py:12: simple_save (from tensorflow.python.saved_model.simple_save) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.simple_save.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: simple-save/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
Result for output key output:
12.0

3.Estimator推論グラフをSavedModelとしてエクスポートします

推定器の定義でmodel_fn (以下に定義)、あなたは返すことによって、モデル内のシグネチャを定義することができexport_outputstf.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を保存してエクスポートします

tf.Moduleで定義されたSavedModelを保存してエクスポートします

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

Kerasで定義されたSavedModelを保存してエクスポートします

Keras APIの保存とexporting-ためMode.saveまたはtf.keras.models.save_model -CAN輸出からSavedModel tf.keras.Model 。チェックアウト保存してKerasモデルを読み込む詳細については。

inp = tf.keras.Input(3)
out = add_two(inp)
model = tf.keras.Model(inputs=inp, outputs=out)

@tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
def serving_default(input):
  return {'output': model(input)}

model.save('keras-model', save_format='tf', signatures={
        tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: serving_default})
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape ().
INFO:tensorflow:Assets written to: keras-model/assets
!saved_model_cli run --dir keras-model --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from keras-model/variables/variables
Result for output key output:
12.0

SavedModelのロード

上記のAPIのいずれかで保存されたSavedModelは、TensorFlow1またはTensorFlowAPIのいずれかを使用してロードできます。

TensorFlow 2にロードされたときTensorFlow 1 SavedModelは、一般的に推論するために使用することができるが、SavedModelリソース変数が含まれる場合トレーニング(勾配生成)が唯一可能です。変数のdtypeを確認できます。変数dtypeに「_ref」が含まれている場合、それは参照変数です。

SavedModelが署名付きで保存されている限り、TensorFlow 2SavedModelをTensorFlow1からロードして実行できます。

以下のセクションには、前のセクションで保存したSavedModelsをロードし、エクスポートされた署名を呼び出す方法を示すコードサンプルが含まれています。

TensorFlow 1:tf.saved_model.loadを使用してSavedModelをロードします

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オブジェクトに読み込まれます。これは、TensorFlow1から保存されたモデルと互換性があります。

チェックアウトtf.saved_model.load APIドキュメントとロードをし、カスタムモデルの使用からセクションSavedModel形式の使用の詳細についてのガイドを。

def load_tf2(path, input):
  print('Loading from', path)
  loaded = tf.saved_model.load(path)
  out = loaded.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY](
      tf.constant(input))['output']
  print('  Output with input', input, ': ', out)

load_tf2('saved-model-builder', 5.)
load_tf2('simple-save', 5.)
load_tf2('estimator-model', [5.])  # Estimator's input must be batched.
load_tf2('tf2-save', 5.)
load_tf2('keras-model', 5.)
Loading from saved-model-builder
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from simple-save
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from estimator-model
  Output with input [5.0] :  tf.Tensor([7.], shape=(1,), dtype=float32)
Loading from tf2-save
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from keras-model
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)

TensorFlow 2 APIで保存されたモデルは、アクセスすることができtf.function (代わりに署名としてエクスポートされるものの)モデルの変数を結合していること。例えば:

loaded = tf.saved_model.load('tf2-save')
print('restored __call__:', loaded.__call__)
print('output with input 5.', loaded(5))
restored __call__: <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x7f30cc940990>
output with input 5. tf.Tensor(7.0, shape=(), dtype=float32)

TensorFlow 2:Kerasで保存されたモデルをロードします

KerasロードAPI-のtf.keras.models.load_model Kerasモデルオブジェクトに保存されたモデルのバックをリロードすることができ許可します。注:これはのみKeras(で保存された負荷SavedModelsにあなたを可能にすることを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 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には。ただし、TF2のに輸入グラフことTF1コードを変換することができ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

TF1のAPIを使用して、使用することができます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

グラフをロードするためのTF2APIはありませんが、イーガーモードで実行できる具体的な関数にグラフをインポートすることはできます。

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>

TensorFlow1からTensorFlow2への変更

このセクションでは、TensorFlow 1、TensorFlow 2に相当するものからの主要な保存と読み込みの用語、および変更点を示します。

SavedModel

SavedModelは、その店舗のパラメータと計算との完全なTensorFlowプログラムを形式です。これには、モデルを実行するためにサービスを提供するプラットフォームによって使用される署名が含まれています。

ファイル形式自体は大幅に変更されていないため、SavedModelsはTensorFlow1またはTensorFlow2APIのいずれかを使用してロードおよび提供できます。

TensorFlow1とTensorFlow2の違い

サービス提供推論ユースケースは、APIの変更・改善がSavedModelからロードされた再利用する機能やコンモデルで導入されたとは別に、TensorFlow 2に更新されていません。

TensorFlow 2において、プログラムは、のようなオブジェクトによって表されるtf.Variabletf.Module 、またはより高いレベルKerasモデル( tf.keras.Model )と層( tf.keras.layers )。そこセッションに格納された値を持っている何よりのグローバル変数は存在せず、グラフは現在さまざまに存在するtf.function秒。したがって、モデルのエクスポート中に、SavedModelは各コンポーネントと関数のグラフを個別に保存します。

TensorFlow Python APIを使用してTensorFlowプログラムを作成する場合は、変数、関数、その他のリソースを管理するためのオブジェクトを作成する必要があります。一般的に、これはKeras APIを使用することによって達成されていますが、作成またはサブクラス化することで、オブジェクトを構築することができtf.Module

Kerasモデル( tf.keras.Model )とtf.Module自動的にそれらに添付の変数と関数を追跡します。 SavedModelは、モジュール、変数、および関数間のこれらの接続を保存して、ロード時に復元できるようにします。

署名

署名は、SavedModelのエンドポイントであり、モデルの実行方法と必要な入力をユーザーに通知します。

TensorFlow 1では、入力テンソルと出力テンソルを一覧表示することで署名が作成されます。 TensorFlow 2において、署名は、具体的機能に渡すことによって生成されます。 (複数でTensorFlow機能について読んグラフとtf.functionの概要要するに。ガイド)、具体的な機能は、生成されるからtf.function

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

tf.saved_model.save(model, path, signatures={
    'name': fn
})
# Option 2: Call `get_concrete_function`
@tf.function
def fn(...):
  ...
  return outputs

tf.saved_model.save(model, path, signatures={
    'name': fn.get_concrete_function(...)
})

Session.run

TensorFlow 1では、あなたが呼び出すことができSession.runすでにテンソルの名前を知っている限り、輸入グラフで。これにより、復元された変数値を取得したり、シグニチャでエクスポートされなかったモデルの一部を実行したりできます。

TensorFlow 2では、あなたは直接、このような重み行列(として、変数にアクセスすることができkernel ):

model = tf.Module()
model.dense_layer = tf.keras.layers.Dense(...)
tf.saved_model.save('my_saved_model')
loaded = tf.saved_model.load('my_saved_model')
loaded.dense_layer.kernel

またはコールtf.function Sは、モデルオブジェクトに取り付けられた:例えば、 loaded.__call__

TF1とは異なり、関数の一部を抽出して中間値にアクセスする方法はありません。あなたは、保存されたオブジェクトに必要な機能のすべてをエクスポートする必要があります

TensorFlowサービング移行ノート

SavedModelはもともとで動作するように作成されたTensorFlowサービング。このプラットフォームは、分類、回帰、予測など、さまざまなタイプの予測リクエストを提供します。

TensorFlow 1 APIを使用すると、utilsので署名のこれらのタイプを作成することができます:

分類classification_signature_def )と回帰regression_signature_def )入力がなければならないので、入力と出力を制限tf.Example 、出力がなければならないclassesscoresまたはprediction 。一方、署名予測predict_signature_def )制限はありません。

TensorFlow 2 APIでエクスポートSavedModelsはTensorFlowサービングと互換性があるが、唯一の予測署名が含まれています。分類と回帰のシグネチャは削除されました。

あなたが分類と回帰署名の使用が必要な場合は、使用してエクスポートSavedModelを変更することがありtf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater

次のステップ

TensorFlow 2のSavedModelsの詳細については、次のガイドをご覧ください。

TensorFlow Hubを使用している場合は、次のガイドが役立つ場合があります。