Se usó la API de Cloud Translation para traducir esta página.
Switch to English

tf.saved_model.save

TensorFlow 1 versión Ver código fuente en GitHub

Las exportaciones del objeto rastreable obj a formato SavedModel .

Se utiliza en los cuadernos

Se utiliza en la guía Se utiliza en los tutoriales

Ejemplo de uso:

 class Adder(tf.Module):

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def add(self, x):
    return x + x + 1.

to_export = Adder()
tf.saved_model.save(to_export, '/tmp/adder')
 

El SavedModel resultante es entonces servable con una entrada denominada "x", su valor que tiene cualquier forma y dtype float32.

El sistema opcional de signatures controles argumento que los métodos de obj estarán disponibles para los programas que consumen SavedModel s, por ejemplo, al servicio API. Las funciones de Python pueden ser decorados con @tf.function(input_signature=...) y pasa como firmas directamente o con pereza con una llamada a get_concrete_function en el método decorado con @tf.function .

Si la signatures se omite el argumento, obj se buscará por @tf.function -decorated métodos. Si exactamente un @tf.function se encuentra, que el método será utilizado como la firma predeterminada para el SavedModel. Este comportamiento se espera que cambie en el futuro, cuando la correspondiente tf.saved_model.load se añade símbolo. En ese momento, las firmas serán completamente opcional, y cualquier @tf.function unido a obj o sus dependencias serán exportados para su uso con load .

Cuando se invoca una firma en un SavedModel exportados, Tensor argumentos son identificados por su nombre. Estos nombres provienen de nombres de los argumentos de la función Python por defecto. Pueden ser reemplazado especificando un name=... argumento en el correspondiente tf.TensorSpec objeto. Se requiere denominación explícita si varios Tensor s se pasan a través de un solo argumento a la función de Python.

Las salidas de las funciones utilizadas como signatures deben ser listas de planos, en los que se numeran las salidas de casos, o un diccionario de claves de cadena mapeo a Tensor , en cuyo caso se utilizarán las claves para nombrar salidas.

Las firmas están disponibles en los objetos devueltos por tf.saved_model.load como .signatures atributo. Este es un atributo reservado: tf.saved_model.save en un objeto con una costumbre .signatures atributo lanzará una excepción.

Desde tf.keras.Model objetos son también rastreable, esta función se puede utilizar para exportar modelos Keras. Por ejemplo, la exportación con una firma especifica:

 class Model(tf.keras.Model):

  @tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.string)])
  def serve(self, serialized):
    ...

m = Model()
tf.saved_model.save(m, '/tmp/saved_model/')
 

La exportación de una función sin una firma fija:

 class Model(tf.keras.Model):

  @tf.function
  def call(self, x):
    ...

m = Model()
tf.saved_model.save(
    m, '/tmp/saved_model/',
    signatures=m.call.get_concrete_function(
        tf.TensorSpec(shape=[None, 3], dtype=tf.float32, name="inp")))
 

tf.keras.Model casos construidas a partir de las entradas y salidas ya tienen una firma y por lo tanto no requieren un @tf.function decorador o un signatures argumento. Si ni se especifican, pase hacia adelante del modelo se exporta.

 x = input_layer.Input((4,), name="x")
y = core.Dense(5, name="out")(x)
model = training.Model(x, y)
tf.saved_model.save(model, '/tmp/saved_model/')
# The exported SavedModel takes "x" with shape [None, 4] and returns "out"
# with shape [None, 5]
 

Las variables deben ser rastreados asignándolos a un atributo de un objeto a seguir oa un atributo de obj directamente. Objetos TensorFlow (por ejemplo, capas de tf.keras.layers , optimizadores de tf.train ) realizar un seguimiento de sus variables automáticamente. Este es el mismo esquema de seguimiento que tf.train.Checkpoint usos, y una exportados Checkpoint objeto pueden ser restaurados como un puesto de control de la formación señalando tf.train.Checkpoint.restore a "/ Variables" subdirectorio del SavedModel. Actualmente, las variables son los objetos sólo con estado apoyados por tf.saved_model.save , pero otros (por ejemplo, tablas) se apoyarán en el futuro.

tf.function hace anotaciones dispositivo no es difícil de código desde fuera del cuerpo de la función, en lugar de utilizar el dispositivo del contexto de llamada. Esto significa, por ejemplo, que la exportación de un modelo que se ejecuta en una GPU y servirlo en una CPU generalmente trabajar, con algunas excepciones. tf.device anotaciones en el interior del cuerpo de la función será difícil codificadas en el modelo exportado; este tipo de anotación se recomienda. operaciones específicas de dispositivo, por ejemplo con "cuDNN" en el nombre o con diseños de dispositivo específicos, pueden provocar problemas. Actualmente un DistributionStrategy es otra excepción: las estrategias de distribución de activos hará que la colocación de dispositivos para estar codificadas en una función. Exportación de un cálculo de un solo dispositivo y la importación bajo un DistributionStrategy no es compatible actualmente, pero puede ser en el futuro.

SavedModels exportados con tf.saved_model.save tira de atributos por defecto de valor automáticamente, lo que elimina una fuente de incompatibilidades cuando el consumidor de un SavedModel está ejecutando una versión TensorFlow más antiguo que el fabricante. Sin embargo, existen otras fuentes de incompatibilidades que no se manejan de forma automática, por ejemplo cuando el modelo exportado contiene operaciones que el consumidor no tiene definiciones para.

Una sola tf.function puede generar muchos ConcreteFunctions. Si una herramienta aguas abajo quiere hacer referencia a todas las funciones concretas generadas por un solo tf.function puede utilizar el function_aliases argumento para almacenar un mapa del nombre de alias para todos los nombres de función concreta. P.ej

 class MyModel:
@tf.function
def func():
  ...

@tf.function
def serve():
  ...
  func()

model = MyModel()
signatures = {
    'serving_default': model.serve.get_concrete_function(),
}
options = tf.saved_model.SaveOptions(function_aliases={
    'my_func': func,
})
tf.saved_model.save(model, export_dir, signatures, options)
 

obj Un objeto rastreable para exportar.
export_dir Un directorio en el que se escribe el SavedModel.
signatures Opcional, ya sea un tf.function con una firma de entrada especificado o el resultado de f.get_concrete_function en un @tf.function -decorated función f , en cuyo caso f se utiliza para generar una firma para el SavedModel bajo la forma predeterminada que sirve de clave de firma . signatures también pueden ser un diccionario, en cuyo caso se asigna de claves de firma a cualquiera de tf.function instancias con las firmas de entrada o funciones concretas. Las claves del diccionario Tal pueden ser cadenas arbitrarias, sino que suelen ser de la tf.saved_model.signature_constants módulo.
options Opcional, tf.saved_model.SaveOptions objeto que especifica las opciones para el ahorro.

ValueError Si obj no es rastreable.

Compatibilidad ansiosos

No está bien apoyado al edificio gráfico. De TensorFlow 1.x, tf.compat.v1.enable_eager_execution() debe ejecutar primero. Llamando tf.saved_model.save en un bucle cuando la construcción gráfica de TensorFlow 1.x añadirá nueva operaciones de salvar a la gráfica por defecto cada iteración.

No se puede llamar desde el interior de un cuerpo de la función.