Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Verwenden des SavedModel-Formats

Ansicht auf TensorFlow.org Quelle auf GitHub anzeigen Notizbuch herunterladen

Ein SavedModel enthält ein vollständiges TensorFlow-Programm, einschließlich Gewichten und Berechnungen. Für die Ausführung ist nicht der ursprüngliche Modellbildungscode erforderlich, sodass er für die Freigabe oder Bereitstellung nützlich ist (mit TFLite , TensorFlow.js , TensorFlow Serving oder TensorFlow Hub ).

Dieses Dokument befasst sich mit einigen Details zur Verwendung der API tf.saved_model niedriger Ebene:

Erstellen eines SavedModel aus Keras

Für eine schnelle Einführung exportiert dieser Abschnitt ein vorab trainiertes Keras-Modell und bearbeitet damit Bildklassifizierungsanforderungen. Der Rest des Handbuchs füllt Details aus und erläutert andere Möglichkeiten zum Erstellen von SavedModels.

import os
import tempfile

from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf

tmpdir = tempfile.mkdtemp()
physical_devices = tf.config.experimental.list_physical_devices('GPU')
for device in physical_devices:
  tf.config.experimental.set_memory_growth(device, True)
file = tf.keras.utils.get_file(
    "grace_hopper.jpg",
    "https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg")
img = tf.keras.preprocessing.image.load_img(file, target_size=[224, 224])
plt.imshow(img)
plt.axis('off')
x = tf.keras.preprocessing.image.img_to_array(img)
x = tf.keras.applications.mobilenet.preprocess_input(
    x[tf.newaxis,...])
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg
65536/61306 [================================] - 0s 0us/step

png

Sie verwenden ein Bild von Grace Hopper als laufendes Beispiel und ein von Keras vorab trainiertes Bildklassifizierungsmodell, da es einfach zu verwenden ist. Benutzerdefinierte Modelle funktionieren ebenfalls und werden später ausführlich behandelt.

labels_path = tf.keras.utils.get_file(
    'ImageNetLabels.txt',
    'https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt
16384/10484 [==============================================] - 0s 0us/step

pretrained_model = tf.keras.applications.MobileNet()
result_before_save = pretrained_model(x)

decoded = imagenet_labels[np.argsort(result_before_save)[0,::-1][:5]+1]

print("Result before saving:\n", decoded)
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet/mobilenet_1_0_224_tf.h5
17227776/17225924 [==============================] - 1s 0us/step
Result before saving:
 ['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']

Die beste Vorhersage für dieses Bild ist "Militäruniform".

mobilenet_save_path = os.path.join(tmpdir, "mobilenet/1/")
tf.saved_model.save(pretrained_model, mobilenet_save_path)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: /tmp/tmpqrbxtm18/mobilenet/1/assets

Der Speicherpfad folgt einer von TensorFlow Serving verwendeten Konvention, bei der die letzte Pfadkomponente ( 1/ hier) eine Versionsnummer für Ihr Modell ist. Mit Tools wie Tensorflow Serving können Sie über die relative Frische nachdenken.

Sie können das SavedModel mit tf.saved_model.load wieder in Python tf.saved_model.load und sehen, wie das Bild von Admiral Hopper klassifiziert wird.

loaded = tf.saved_model.load(mobilenet_save_path)
print(list(loaded.signatures.keys()))  # ["serving_default"]
['serving_default']

Importierte Signaturen geben immer Wörterbücher zurück. Informationen zum Anpassen von Signaturnamen und Ausgabewörterbuchschlüsseln finden Sie unter Angeben von Signaturen während des Exports .

infer = loaded.signatures["serving_default"]
print(infer.structured_outputs)
{'predictions': TensorSpec(shape=(None, 1000), dtype=tf.float32, name='predictions')}

Das Ausführen von Inferenz aus dem SavedModel ergibt das gleiche Ergebnis wie das ursprüngliche Modell.

labeling = infer(tf.constant(x))[pretrained_model.output_names[0]]

decoded = imagenet_labels[np.argsort(labeling)[0,::-1][:5]+1]

print("Result after saving and loading:\n", decoded)
Result after saving and loading:
 ['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']

Ausführen eines gespeicherten Modells in TensorFlow Serving

SavedModels können von Python aus verwendet werden (mehr dazu weiter unten), aber Produktionsumgebungen verwenden normalerweise einen dedizierten Dienst für Inferenzen, ohne Python-Code auszuführen. Dies ist mit TensorFlow Serving einfach von einem SavedModel aus einzurichten.

Im TESTorFlow Serving REST-Lernprogramm finden Sie ein Beispiel für ein Ende-zu-Ende-Tensorflow-Serving.

Das SavedModel-Format auf der Festplatte

Ein SavedModel ist ein Verzeichnis, das serialisierte Signaturen und den zu ihrer Ausführung erforderlichen Status enthält, einschließlich variabler Werte und Vokabulare.

ls {mobilenet_save_path}
assets  saved_model.pb  variables

In der Datei saved_model.pb werden das eigentliche TensorFlow-Programm oder -Modell sowie eine Reihe benannter Signaturen gespeichert, die jeweils eine Funktion identifizieren, die Tensoreingaben akzeptiert und Tensorausgaben erzeugt.

SavedModels können mehrere Varianten des Modells (multiple enthalten v1.MetaGraphDefs , identifiziert mit dem --tag_set Flag auf saved_model_cli ), aber dies ist selten. APIs, die mehrere Varianten eines Modells erstellen, umfassen tf.Estimator.experimental_export_all_saved_models und in TensorFlow 1.x tf.saved_model.Builder .

saved_model_cli show --dir {mobilenet_save_path} --tag_set serve
2020-10-13 01:23:41.728141: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
The given SavedModel MetaGraphDef contains SignatureDefs with the following keys:
SignatureDef key: "__saved_model_init_op"
SignatureDef key: "serving_default"

Das variables enthält einen Standard-Trainingsprüfpunkt (siehe Anleitung zu Trainingsprüfpunkten ).

ls {mobilenet_save_path}/variables
variables.data-00000-of-00001  variables.index

Das assets Verzeichnis enthält Dateien, die vom TensorFlow-Diagramm verwendet werden, z. B. Textdateien, die zum Initialisieren von Vokabeltabellen verwendet werden. Es wird in diesem Beispiel nicht verwendet.

SavedModels verfügt möglicherweise über ein Verzeichnis assets.extra für alle Dateien, die nicht vom TensorFlow-Diagramm verwendet werden, z. B. Informationen für Verbraucher darüber, was mit dem SavedModel zu tun ist. TensorFlow selbst verwendet dieses Verzeichnis nicht.

Speichern eines benutzerdefinierten Modells

tf.saved_model.save unterstützt das Speichern von tf.Module Objekten und ihren Unterklassen wie tf.keras.Layer und tf.keras.Model .

Schauen wir uns ein Beispiel zum Speichern und Wiederherstellen eines tf.Module .

class CustomModule(tf.Module):

  def __init__(self):
    super(CustomModule, self).__init__()
    self.v = tf.Variable(1.)

  @tf.function
  def __call__(self, x):
    print('Tracing with', x)
    return x * self.v

  @tf.function(input_signature=[tf.TensorSpec([], tf.float32)])
  def mutate(self, new_v):
    self.v.assign(new_v)

module = CustomModule()

Wenn Sie ein tf.Module , werden alle tf.Variable Attribute, tf.function -decorated-Methoden und tf.Module die durch rekursives Durchlaufen gefunden wurden. (Weitere Informationen zu dieser rekursiven Durchquerung finden Sie im Checkpoint-Lernprogramm .) Alle Python-Attribute, -Funktionen und -Daten gehen jedoch verloren. Dies bedeutet, dass beim tf.function einer tf.function kein Python-Code gespeichert wird.

Woher kann SavedModel die Funktion wiederherstellen, wenn kein Python-Code gespeichert ist?

Kurz gesagt, tf.function verfolgt den Python-Code, um eine ConcreteFunction (einen aufrufbaren Wrapper um tf.Graph ) zu generieren. Wenn Sie eine tf.function speichern, tf.function Sie wirklich den Cache der tf.function von ConcreteFunctions.

Weitere tf.function zur Beziehung zwischen tf.function und ConcreteFunctions finden Sie im tf.function-Handbuch .

module_no_signatures_path = os.path.join(tmpdir, 'module_no_signatures')
module(tf.constant(0.))
print('Saving model...')
tf.saved_model.save(module, module_no_signatures_path)
Tracing with Tensor("x:0", shape=(), dtype=float32)
Saving model...
Tracing with Tensor("x:0", shape=(), dtype=float32)
INFO:tensorflow:Assets written to: /tmp/tmpqrbxtm18/module_no_signatures/assets

Laden und Verwenden eines benutzerdefinierten Modells

Wenn Sie ein SavedModel in Python laden, werden alle tf.Variable Attribute, tf.function -decorated-Methoden und tf.Module s in derselben Objektstruktur wie das ursprünglich gespeicherte tf.Module .

imported = tf.saved_model.load(module_no_signatures_path)
assert imported(tf.constant(3.)).numpy() == 3
imported.mutate(tf.constant(2.))
assert imported(tf.constant(3.)).numpy() == 6

Da kein Python-Code gespeichert ist, tf.function das Aufrufen einer tf.function mit einer neuen Eingabesignatur fehl:

imported(tf.constant([3.]))
ValueError: Could not find matching function to call for canonicalized inputs ((,), {}). Only existing signatures are [((TensorSpec(shape=(), dtype=tf.float32, name=u'x'),), {})].

Grundlegende Feinabstimmung

Es stehen variable Objekte zur Verfügung, und Sie können importierte Funktionen zurücksetzen. Dies reicht aus, um ein SavedModel in einfachen Fällen zu optimieren (dh neu zu trainieren).

optimizer = tf.optimizers.SGD(0.05)

def train_step():
  with tf.GradientTape() as tape:
    loss = (10. - imported(tf.constant(2.))) ** 2
  variables = tape.watched_variables()
  grads = tape.gradient(loss, variables)
  optimizer.apply_gradients(zip(grads, variables))
  return loss
for _ in range(10):
  # "v" approaches 5, "loss" approaches 0
  print("loss={:.2f} v={:.2f}".format(train_step(), imported.v.numpy()))
loss=36.00 v=3.20
loss=12.96 v=3.92
loss=4.67 v=4.35
loss=1.68 v=4.61
loss=0.60 v=4.77
loss=0.22 v=4.86
loss=0.08 v=4.92
loss=0.03 v=4.95
loss=0.01 v=4.97
loss=0.00 v=4.98

Allgemeine Feinabstimmung

Ein SavedModel von Keras bietet mehr Details als ein einfacher __call__ , um fortgeschrittenere Fälle von Feinabstimmung zu behandeln. TensorFlow Hub empfiehlt, in SavedModels, die zur Feinabstimmung freigegeben sind, gegebenenfalls Folgendes anzugeben:

  • Wenn das Modell Dropout oder eine andere Technik verwendet, bei der sich der Vorwärtsdurchlauf zwischen Training und Inferenz unterscheidet (z. B. Batch-Normalisierung), verwendet die Methode __call__ ein optionales Argument mit Python-Wert training= , das standardmäßig False aber auf True .
  • Neben dem __call__ Attribut gibt es .variable und .trainable_variable Attribute mit den entsprechenden Listen von Variablen. Eine Variable, die ursprünglich trainierbar war, aber während der Feinabstimmung eingefroren werden soll, wird in .trainable_variables weggelassen.
  • Für Frameworks wie Keras, die Weight Regularizer als Attribute von Layern oder Untermodellen darstellen, kann es auch ein .regularization_losses Attribut geben. Es enthält eine Liste von Nullargumentfunktionen, deren Werte zur Addition zum Gesamtverlust bestimmt sind.

Wenn Sie zum ersten MobileNet-Beispiel zurückkehren, sehen Sie einige davon in Aktion:

loaded = tf.saved_model.load(mobilenet_save_path)
print("MobileNet has {} trainable variables: {}, ...".format(
          len(loaded.trainable_variables),
          ", ".join([v.name for v in loaded.trainable_variables[:5]])))
MobileNet has 83 trainable variables: conv1/kernel:0, conv1_bn/gamma:0, conv1_bn/beta:0, conv_dw_1/depthwise_kernel:0, conv_dw_1_bn/gamma:0, ...

trainable_variable_ids = {id(v) for v in loaded.trainable_variables}
non_trainable_variables = [v for v in loaded.variables
                           if id(v) not in trainable_variable_ids]
print("MobileNet also has {} non-trainable variables: {}, ...".format(
          len(non_trainable_variables),
          ", ".join([v.name for v in non_trainable_variables[:3]])))
MobileNet also has 54 non-trainable variables: conv1_bn/moving_mean:0, conv1_bn/moving_variance:0, conv_dw_1_bn/moving_mean:0, ...

Angeben von Signaturen während des Exports

Tools wie TensorFlow Serving und saved_model_cli können mit SavedModels interagieren. Damit diese Tools bestimmen können, welche ConcreteFunctions verwendet werden sollen, müssen Sie Serving-Signaturen angeben. tf.keras.Model automatisch Serving-Signaturen an, aber Sie müssen explizit eine Serving-Signatur für unsere benutzerdefinierten Module deklarieren.

Standardmäßig werden in einem benutzerdefinierten tf.Module keine Signaturen deklariert.

assert len(imported.signatures) == 0

Geben Sie zum Deklarieren einer Serving-Signatur eine ConcreteFunction mit den signatures kwarg an. Wenn Sie eine einzelne Signatur 'serving_default' , lautet der Signaturschlüssel 'serving_default' , der als Konstante tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY .

module_with_signature_path = os.path.join(tmpdir, 'module_with_signature')
call = module.__call__.get_concrete_function(tf.TensorSpec(None, tf.float32))
tf.saved_model.save(module, module_with_signature_path, signatures=call)
Tracing with Tensor("x:0", dtype=float32)
Tracing with Tensor("x:0", dtype=float32)
INFO:tensorflow:Assets written to: /tmp/tmpqrbxtm18/module_with_signature/assets

imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())
['serving_default']

Übergeben Sie zum Exportieren mehrerer Signaturen ein Wörterbuch mit Signaturschlüsseln an ConcreteFunctions. Jeder Signaturschlüssel entspricht einer ConcreteFunction.

module_multiple_signatures_path = os.path.join(tmpdir, 'module_with_multiple_signatures')
signatures = {"serving_default": call,
              "array_input": module.__call__.get_concrete_function(tf.TensorSpec([None], tf.float32))}

tf.saved_model.save(module, module_multiple_signatures_path, signatures=signatures)
Tracing with Tensor("x:0", shape=(None,), dtype=float32)
Tracing with Tensor("x:0", shape=(None,), dtype=float32)
INFO:tensorflow:Assets written to: /tmp/tmpqrbxtm18/module_with_multiple_signatures/assets

imported_with_multiple_signatures = tf.saved_model.load(module_multiple_signatures_path)
list(imported_with_multiple_signatures.signatures.keys())
['serving_default', 'array_input']

Standardmäßig sind die Namen der Ausgabe-Tensoren ziemlich generisch, wie output_0 . B. output_0 . Um die Namen der Ausgaben zu steuern, ändern Sie Ihre tf.function , um ein Wörterbuch zurückzugeben, das die Ausgabenamen den Ausgaben tf.function . Die Namen der Eingaben werden von den Argumentnamen der Python-Funktion abgeleitet.

class CustomModuleWithOutputName(tf.Module):
  def __init__(self):
    super(CustomModuleWithOutputName, self).__init__()
    self.v = tf.Variable(1.)

  @tf.function(input_signature=[tf.TensorSpec([], tf.float32)])
  def __call__(self, x):
    return {'custom_output_name': x * self.v}

module_output = CustomModuleWithOutputName()
call_output = module_output.__call__.get_concrete_function(tf.TensorSpec(None, tf.float32))
module_output_path = os.path.join(tmpdir, 'module_with_output_name')
tf.saved_model.save(module_output, module_output_path,
                    signatures={'serving_default': call_output})
INFO:tensorflow:Assets written to: /tmp/tmpqrbxtm18/module_with_output_name/assets

imported_with_output_name = tf.saved_model.load(module_output_path)
imported_with_output_name.signatures['serving_default'].structured_outputs
{'custom_output_name': TensorSpec(shape=(), dtype=tf.float32, name='custom_output_name')}

Laden Sie ein SavedModel in C ++

Die C ++ Version des SavedModel Loader bietet eine API einen SavedModel von einem Pfad zu laden, während SessionOptions und RunOptions ermöglicht. Sie müssen die Tags angeben, die dem zu ladenden Diagramm zugeordnet sind. Die geladene Version von SavedModel wird als SavedModelBundle bezeichnet und enthält das MetaGraphDef und die Sitzung, in der es geladen wird.

const string export_dir = ...
SavedModelBundle bundle;
...
LoadSavedModel(session_options, run_options, export_dir, {kSavedModelTagTrain},
               &bundle);

Details der SavedModel-Befehlszeilenschnittstelle

Sie können die SavedModel-Befehlszeilenschnittstelle (CLI) verwenden, um ein SavedModel zu überprüfen und auszuführen. Sie können beispielsweise die CLI verwenden, um die SignatureDef des Modells zu überprüfen. Mit der CLI können Sie schnell bestätigen, dass der Typ und die Form des Eingabetensors mit dem Modell übereinstimmen. Wenn Sie Ihr Modell testen möchten, können Sie außerdem die CLI verwenden, um eine Überprüfung der Integrität durchzuführen, indem Sie Beispieleingaben in verschiedenen Formaten (z. B. Python-Ausdrücke) übergeben und dann die Ausgabe abrufen.

Installieren Sie die SavedModel-CLI

Grundsätzlich können Sie TensorFlow auf zwei Arten installieren:

  • Durch die Installation einer vorgefertigten TensorFlow-Binärdatei.
  • Durch Erstellen von TensorFlow aus dem Quellcode.

Wenn Sie TensorFlow über eine vorgefertigte TensorFlow-Binärdatei installiert haben, ist die SavedModel-CLI bereits unter dem Pfadnamen bin/saved_model_cli auf Ihrem System bin/saved_model_cli .

Wenn Sie TensorFlow aus dem Quellcode erstellt haben, müssen Sie den folgenden zusätzlichen Befehl saved_model_cli , um saved_model_cli zu saved_model_cli :

$ bazel build tensorflow/python/tools:saved_model_cli

Übersicht der Befehle

Die SavedModel-CLI unterstützt die folgenden zwei Befehle in einem SavedModel:

  • show , das die von einem SavedModel verfügbaren Berechnungen zeigt.
  • run , das eine Berechnung von einem SavedModel aus ausführt.

Befehl show

Ein SavedModel enthält eine oder mehrere Modellvarianten (technisch gesehen v1.MetaGraphDef s), die durch ihre Tag-Sets identifiziert werden. Um ein Modell zu bedienen, fragen Sie sich möglicherweise, welche Art von SignatureDef in jeder Modellvariante enthalten sind und welche Ein- und Ausgänge sie haben. Mit dem Befehl show Sie den Inhalt des SavedModel in hierarchischer Reihenfolge untersuchen. Hier ist die Syntax:

usage: saved_model_cli show [-h] --dir DIR [--all]
[--tag_set TAG_SET] [--signature_def SIGNATURE_DEF_KEY]

Der folgende Befehl zeigt beispielsweise alle verfügbaren Tag-Sets im SavedModel an:

$ saved_model_cli show --dir /tmp/saved_model_dir
The given SavedModel contains the following tag-sets:
serve
serve, gpu

Der folgende Befehl zeigt alle verfügbaren SignatureDef Schlüssel für einen Tag-Satz an:

$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve
The given SavedModel `MetaGraphDef` contains `SignatureDefs` with the
following keys:
SignatureDef key: "classify_x2_to_y3"
SignatureDef key: "classify_x_to_y"
SignatureDef key: "regress_x2_to_y3"
SignatureDef key: "regress_x_to_y"
SignatureDef key: "regress_x_to_y2"
SignatureDef key: "serving_default"

Wenn das Tag-Set mehrere Tags enthält, müssen Sie alle Tags angeben, wobei jedes Tag durch ein Komma getrennt ist. Zum Beispiel:

$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve,gpu

Um alle Ein- und Ausgänge TensorInfo für ein bestimmtes SignatureDef anzuzeigen, übergeben Sie den SignatureDef Schlüssel an die Option signature_def . Dies ist sehr nützlich, wenn Sie den Tensorschlüsselwert, den Typ und die Form der Eingabetensoren kennen möchten, um das Berechnungsdiagramm später ausführen zu können. Zum Beispiel:

$ saved_model_cli show --dir \
/tmp/saved_model_dir --tag_set serve --signature_def serving_default
The given SavedModel SignatureDef contains the following input(s):
  inputs['x'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: x:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['y'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: y:0
Method name is: tensorflow/serving/predict

Verwenden Sie die Option --all, um alle verfügbaren Informationen im SavedModel --all . Zum Beispiel:

$ saved_model_cli show --dir /tmp/saved_model_dir --all
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['classify_x2_to_y3']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['inputs'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: x2:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: y3:0
  Method name is: tensorflow/serving/classify

...

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['x'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: x:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['y'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: y:0
  Method name is: tensorflow/serving/predict

Befehl run

Rufen Sie den Befehl run auf, um eine Diagrammberechnung auszuführen, Eingaben zu übergeben und die Ausgaben anzuzeigen (und optional zu speichern). Hier ist die Syntax:

usage: saved_model_cli run [-h] --dir DIR --tag_set TAG_SET --signature_def
                           SIGNATURE_DEF_KEY [--inputs INPUTS]
                           [--input_exprs INPUT_EXPRS]
                           [--input_examples INPUT_EXAMPLES] [--outdir OUTDIR]
                           [--overwrite] [--tf_debug]

Der Befehl run bietet die folgenden drei Möglichkeiten, um Eingaben an das Modell zu übergeben:

  • --inputs Option --inputs können Sie numpy ndarray in Dateien übergeben.
  • --input_exprs Option --input_exprs können Sie Python-Ausdrücke übergeben.
  • --input_examples Option --input_examples können Sie tf.train.Example .

--inputs

--inputs zum --inputs Eingabedaten in Dateien die Option --inputs , die das folgende allgemeine Format hat:

--inputs <INPUTS>

Dabei ist INPUTS eines der folgenden Formate:

  • <input_key>=<filename>
  • <input_key>=<filename>[<variable_name>]

Sie können mehrere EINGÄNGE übergeben . Wenn Sie mehrere Eingaben übergeben, verwenden Sie ein Semikolon, um die einzelnen EINGÄNGE zu trennen.

saved_model_cli verwendet numpy.load , um den Dateinamen zu laden. Der Dateiname kann in einem der folgenden Formate vorliegen:

  • .npy
  • .npz
  • Essiggurkenformat

Eine .npy Datei enthält immer ein numpy ndarray. Daher wird der Inhalt beim Laden aus einer .npy Datei direkt dem angegebenen Eingabetensor zugewiesen. Wenn Sie mit dieser .npy Datei einen Variablennamen .npy , wird der Variablenname ignoriert und eine Warnung ausgegeben.

Beim Laden aus einer .npz (zip) -Datei können Sie optional einen Variablennamen angeben, um die Variable in der zip-Datei zu identifizieren, die für den Eingabetensorschlüssel geladen werden soll. Wenn Sie keinen Variablennamen angeben, überprüft die SavedModel-CLI, ob nur eine Datei in der Zip-Datei enthalten ist, und lädt sie für den angegebenen Eingabetensorschlüssel.

Wenn beim Laden aus einer Pickle-Datei in den eckigen Klammern kein variable_name angegeben wird, wird alles, was sich in der Pickle-Datei befindet, an den angegebenen Eingabetensorschlüssel übergeben. Andernfalls geht die SavedModel-CLI davon aus, dass ein Wörterbuch in der Pickle-Datei gespeichert ist und der dem Variablennamen entsprechende Wert verwendet wird.

--input_exprs

--input_exprs Option --input_exprs an, um Eingaben über Python-Ausdrücke zu --input_exprs . Dies kann nützlich sein, wenn Sie keine Datendateien herumliegen haben, aber dennoch das Modell mit einigen einfachen Eingaben überprüfen möchten, die dem Typ und der Form der SignatureDef des Modells entsprechen. Zum Beispiel:

`<input_key>=[[1],[2],[3]]`

Zusätzlich zu Python-Ausdrücken können Sie auch Numpy-Funktionen übergeben. Zum Beispiel:

`<input_key>=np.ones((32,32,3))`

(Beachten Sie, dass numpy das numpy Modul bereits als np .)

--input_examples

--input_examples Option tf.train.Example an, um tf.train.Example als --input_examples . Für jeden Eingabeschlüssel wird eine Liste von Wörterbüchern verwendet, wobei jedes Wörterbuch eine Instanz von tf.train.Example . Die Wörterbuchschlüssel sind die Features und die Werte sind die Wertelisten für jedes Feature. Zum Beispiel:

`<input_key>=[{"age":[22,24],"education":["BS","MS"]}]`

Ausgabe speichern

Standardmäßig schreibt die SavedModel-CLI die Ausgabe in stdout. Wenn ein Verzeichnis an die Option --outdir , werden die Ausgaben als .npy Dateien gespeichert, die nach den Ausgabetensorschlüsseln unter dem angegebenen Verzeichnis benannt sind.

Verwenden Sie --overwrite , um vorhandene Ausgabedateien zu überschreiben.