Ayuda a proteger la Gran Barrera de Coral con TensorFlow en Kaggle Únete Challenge

Migrar el flujo de trabajo del modelo guardado

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

Una vez que haya migrado su modelo a partir de gráficos y sesiones de TensorFlow 1 a 2 TensorFlow API, como tf.function , tf.Module y tf.keras.Model , puede migrar el ahorro de modelo y el código de carga. Este cuaderno proporciona ejemplos de cómo puede guardar y cargar en el formato SavedModel en TensorFlow 1 y TensorFlow 2. A continuación, se muestra una descripción general rápida de los cambios de API relacionados para la migración de TensorFlow 1 a TensorFlow 2:

TensorFlow 1 Migración a TensorFlow 2
Ahorro tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
Keras: tf.keras.models.save_model
Cargando tf.compat.v1.saved_model.load tf.saved_model.load
Keras: tf.keras.models.load_model
Firmas: un conjunto de entrada
y tensores de salida que
se puede utilizar para ejecutar el
Generada mediante el *.signature_def utils
(por ejemplo tf.compat.v1.saved_model.predict_signature_def )
Escribir una tf.function y exportarlo utilizando la signatures argumento
en tf.saved_model.save .
Clasificación
y la regresión:

tipos especiales de firmas
Generado con
tf.compat.v1.saved_model.classification_signature_def ,
tf.compat.v1.saved_model.regression_signature_def ,
y determinadas exportaciones de Estimator.
Estos dos tipos de firmas se han eliminado de TensorFlow 2.
Si la biblioteca de servicio requiere estos nombres de métodos,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Para una explicación más en profundidad de la cartografía, consulte los cambios de TensorFlow 1 a TensorFlow 2 sección de abajo.

Configuración

Los siguientes ejemplos muestran cómo exportar y cargar el mismo modelo de maniquí TensorFlow (definido como add_two abajo) a un formato SavedModel uso de la API TensorFlow 1 y TensorFlow 2. Comience configurando las funciones de importación y utilidad:

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: guardar y exportar un modelo guardado

En TensorFlow 1, se utilizan los tf.compat.v1.saved_model.Builder , tf.compat.v1.saved_model.simple_save y tf.estimator.Estimator.export_saved_model API para construir, guardar y exportar el gráfico TensorFlow y la sesión:

1. Guarde el gráfico como modelo guardado con 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. Cree un modelo guardado para publicar

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. Exportar el gráfico de inferencia de Estimator como modelo guardado

En la definición del Estimador model_fn (definido más adelante), se puede definir firmas en su modelo mediante la devolución de export_outputs en el tf.estimator.EstimatorSpec . Hay diferentes tipos de salidas:

Estos producirán tipos de firma de clasificación, regresión y predicción, respectivamente.

Cuando el estimador se exporta con tf.estimator.Estimator.export_saved_model , estas firmas se guardarán con el modelo.

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: guardar y exportar un modelo guardado

Guarde y exporte un modelo guardado definido con tf.Module

Para exportar su modelo de TensorFlow 2, se debe definir una tf.Module o una tf.keras.Model para contener todas las variables y funciones de su modelo. A continuación, puede llamar tf.saved_model.save para crear un SavedModel. Consulte el Almacenamiento de un modelo personalizado en el uso del formato SavedModel guía para aprender más.

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

Guardar y exportar un modelo guardado definido con Keras

Las API Keras para el ahorro y exporting- Mode.save o tf.keras.models.save_model exportación -can un SavedModel de un tf.keras.Model . Echa un vistazo a la Salvar y cargar modelos Keras para más detalles.

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

Cargando un modelo guardado

Un modelo guardado guardado con cualquiera de las API anteriores se puede cargar con las API de TensorFlow 1 o TensorFlow.

A TensorFlow 1 SavedModel generalmente se puede utilizar para la inferencia cuando se carga en TensorFlow 2, pero (gradientes de generación) de formación sólo es posible si la SavedModel contiene variables de recursos. Puede verificar el dtype de las variables; si la variable dtype contiene "_ref", entonces es una variable de referencia.

Un modelo guardado de TensorFlow 2 se puede cargar y ejecutar desde TensorFlow 1 siempre que el modelo guardado se guarde con firmas.

Las secciones siguientes contienen ejemplos de código que muestran cómo cargar los modelos guardados guardados en las secciones anteriores y cómo llamar a la firma exportada.

TensorFlow 1: carga un modelo guardado con tf.saved_model.load

En TensorFlow 1, puede importar un SavedModel directamente en la corriente gráfico y sesión usando tf.saved_model.load . Puede llamar Session.run en los nombres de entrada y salida de 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: carga un modelo guardado con tf.saved_model

En TensorFlow 2, los objetos se cargan en un objeto de Python que almacena las variables y funciones. Esto es compatible con los modelos guardados de TensorFlow 1.

Echa un vistazo a los tf.saved_model.load documentos de la API y de carga y el uso de un modelo personalizado sección del uso del formato SavedModel guía para más detalles.

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)

Modelos guardados con la API TensorFlow 2 pueden también acceder tf.function s y variables que están asociadas con el modelo (en lugar de los exportados como firmas). Por ejemplo:

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: carga un modelo guardado con Keras

La carga API- Keras tf.keras.models.load_model que -permite para recargar una copia de modelo guardado en un objeto Keras modelo. Tenga en cuenta que esto sólo le permite SavedModels carga guardados con Keras ( Model.save o tf.keras.models.save_model ).

Modelos guardados con tf.saved_model.save deben ser cargados con tf.saved_model.load . Puede cargar un modelo Keras guardado con Model.save usando tf.saved_model.load pero sólo obtendrá el gráfico TensorFlow. Consulte las tf.keras.models.load_model documentos de la API y parada de modelos Keras carga guiará para más detalles.

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

No hay manera fácil de cargar una prima GraphDef o MetaGraphDef a TF2. Sin embargo, se puede convertir el código TF1 que las importaciones el gráfico en un TF2 concrete_function usando v1.wrap_function .

Primero, guarde un 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

El uso de las API de TF1, puede utilizar tf1.train.import_meta_graph importar el gráfico y restaurar los valores:

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

No hay API de TF2 para cargar el gráfico, pero aún puede importarlo en una función concreta que se puede ejecutar en modo ansioso:

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>

Cambios de TensorFlow 1 a TensorFlow 2

En esta sección, se enumeran los términos de carga y guardado de claves de TensorFlow 1, sus equivalentes de TensorFlow 2 y lo que ha cambiado.

Modelo guardado

SavedModel es un formato que almacena un programa TensorFlow completa con los parámetros y la computación. Contiene firmas utilizadas por las plataformas de servicio para ejecutar el modelo.

El formato de archivo en sí no ha cambiado significativamente, por lo que SavedModels se puede cargar y entregar con las API de TensorFlow 1 o TensorFlow 2.

Diferencias entre TensorFlow 1 y TensorFlow 2

Los casos que sirven y de inferencia de uso no se han actualizado en TensorFlow 2, Aparte de los cambios-la API mejora se introdujo en la capacidad de reutilizar y modelos de redacción cargado desde SavedModel.

En TensorFlow 2, el programa está representado por objetos como tf.Variable , tf.Module , o modelos Keras de nivel superior ( tf.keras.Model ) y capas ( tf.keras.layers ). No hay más variables globales que tienen valores almacenados en una sesión, y el gráfico ahora existe en diferentes tf.function s. En consecuencia, durante la exportación de un modelo, SavedModel guarda los gráficos de cada componente y función por separado.

Cuando escribes un programa de TensorFlow con las API de Python de TensorFlow, debes compilar un objeto para administrar las variables, funciones y otros recursos. Por lo general, esto se logra mediante el uso de la API Keras, pero también se puede construir el objeto mediante la creación o la subclasificación tf.Module .

Modelos Keras ( tf.keras.Model ) y tf.Module un seguimiento automático de las variables y funciones conectados a ellos. SavedModel guarda estas conexiones entre módulos, variables y funciones, para que se puedan restaurar al cargar.

Firmas

Las firmas son los puntos finales de un modelo guardado: le dicen al usuario cómo ejecutar el modelo y qué entradas se necesitan.

En TensorFlow 1, las firmas se crean enumerando los tensores de entrada y salida. En TensorFlow 2, las firmas se generan haciendo pasar en funciones concretas. (Lea más sobre las funciones TensorFlow en la Introducción a los gráficos y tf.function . Guía) En pocas palabras, una función concreta se genera a partir de una 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

En TensorFlow 1, se podría llamar Session.run con el gráfico importado, siempre y cuando usted ya conoce los nombres de tensor. Esto le permite recuperar los valores de las variables restauradas o ejecutar partes del modelo que no se exportaron en las firmas.

En TensorFlow 2, se puede acceder directamente a una variable, tal como una matriz de pesos ( 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

o llamada tf.function s adjunta al objeto modelo: por ejemplo, loaded.__call__ .

A diferencia de TF1, no hay forma de extraer partes de una función y acceder a valores intermedios. Debe exportar toda la funcionalidad necesaria en el objeto guardado.

Notas de migración de TensorFlow Serving

SavedModel fue creado originalmente para el trabajo con TensorFlow Servir . Esta plataforma ofrece diferentes tipos de solicitudes de predicción: clasificar, retroceder y predecir.

La API TensorFlow 1 le permite crear este tipo de firmas con las utilidades:

Clasificación ( classification_signature_def ) y regresión ( regression_signature_def ) restringir las entradas y salidas, así que las entradas deben ser un tf.Example , y las salidas deben ser classes , scores o prediction . Mientras tanto, la firma predecir ( predict_signature_def ) no tiene restricciones.

SavedModels exportados con la API TensorFlow 2 son compatibles con TensorFlow Servir, pero sólo contendrán firmas de predicción. Se han eliminado las firmas de clasificación y regresión.

Si requiere el uso de las firmas de clasificación y regresión, es posible modificar el SavedModel exportados utilizando tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

Próximos pasos

Para obtener más información sobre los modelos guardados en TensorFlow 2, consulte las siguientes guías:

Si está utilizando TensorFlow Hub, estas guías pueden resultarle útiles: