Korzystanie z formatu SavedModel

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło na GitHub Pobierz notatnik

SavedModel zawiera kompletny program TensorFlow, w tym wytrenowane parametry (tj. tf.Variable s) i obliczenia. Nie wymaga uruchamiania oryginalnego kodu budowania modelu, co czyni go przydatnym do udostępniania lub wdrażania za pomocą TFLite , TensorFlow.js , TensorFlow Serving lub TensorFlow Hub .

Możesz zapisać i wczytać model w formacie SavedModel, korzystając z następujących interfejsów API:

Tworzenie zapisanego modelu z Keras

Aby uzyskać krótkie wprowadzenie, ta sekcja eksportuje wstępnie wytrenowany model Keras i obsługuje z nim żądania klasyfikacji obrazów. Pozostała część przewodnika wypełni szczegóły i omówi inne sposoby tworzenia 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.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.utils.load_img(file, target_size=[224, 224])
plt.imshow(img)
plt.axis('off')
x = tf.keras.utils.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
73728/61306 [====================================] - 0s 0us/step

png

Użyjesz obrazu Grace Hopper jako działającego przykładu oraz wstępnie wytrenowanego modelu klasyfikacji obrazów Keras, ponieważ jest on łatwy w użyciu. Działają również modele niestandardowe, które zostaną szczegółowo omówione później.

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
24576/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 [==============================] - 0s 0us/step
17235968/17225924 [==============================] - 0s 0us/step
Result before saving:
 ['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']

Najważniejszą prognozą dla tego obrazu jest „mundur wojskowy”.

mobilenet_save_path = os.path.join(tmpdir, "mobilenet/1/")
tf.saved_model.save(pretrained_model, mobilenet_save_path)
2021-10-27 01:24:27.831628: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpbf9fpzwt/mobilenet/1/assets

Ścieżka zapisu jest zgodna z konwencją stosowaną przez TensorFlow Serving, w której ostatni komponent ścieżki ( 1/ tutaj) to numer wersji Twojego modelu - umożliwia to narzędziom takim jak Tensorflow Serving wnioskowanie o względnej świeżości.

Możesz załadować SavedModel z powrotem do Pythona za pomocą tf.saved_model.load i zobaczyć, jak klasyfikowany jest obraz Admirała Hoppera.

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

Zaimportowane podpisy zawsze zwracają słowniki. Aby dostosować nazwy podpisów i klucze słownika wyjściowego, zobacz Określanie podpisów podczas eksportu .

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

Uruchamianie wnioskowania z SavedModel daje taki sam wynik jak oryginalny model.

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']

Uruchamianie SavedModel w TensorFlow Serving

SavedModels można używać z Pythona (więcej na ten temat poniżej), ale środowiska produkcyjne zazwyczaj używają dedykowanej usługi do wnioskowania bez uruchamiania kodu Pythona. Jest to łatwe do skonfigurowania z SavedModel przy użyciu TensorFlow Serving.

Zobacz samouczek TensorFlow Serving REST , aby zapoznać się z przykładem kompleksowej obsługi tensorflow.

Format SavedModel na dysku

SavedModel to katalog zawierający zserializowane podpisy i stan potrzebny do ich uruchomienia, w tym wartości zmiennych i słowniki.

ls {mobilenet_save_path}
assets  saved_model.pb  variables

Plik saved_model.pb przechowuje rzeczywisty program lub model TensorFlow oraz zestaw nazwanych sygnatur, z których każdy identyfikuje funkcję, która akceptuje dane wejściowe tensora i generuje dane wyjściowe tensora.

SavedModels może zawierać wiele wariantów modelu (wiele v1.MetaGraphDefs , identyfikowane z flagą --tag_set do saved_model_cli ), ale jest to rzadkie. Interfejsy API tworzące wiele wariantów modelu obejmują tf.Estimator.experimental_export_all_saved_models oraz w TensorFlow 1.x tf.saved_model.Builder .

saved_model_cli show --dir {mobilenet_save_path} --tag_set serve
The given SavedModel MetaGraphDef contains SignatureDefs with the following keys:
SignatureDef key: "__saved_model_init_op"
SignatureDef key: "serving_default"

Katalog variables zawiera standardowy punkt kontrolny szkolenia (zobacz przewodnik dotyczący punktów kontrolnych szkolenia ).

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

Katalog assets zawiera pliki używane przez wykres TensorFlow, na przykład pliki tekstowe używane do inicjowania tabel słowników. W tym przykładzie nie jest używany.

SavedModels może mieć katalog assets.extra dla dowolnych plików, które nie są używane przez wykres TensorFlow, na przykład informacje dla konsumentów o tym, co zrobić z SavedModel. Sam TensorFlow nie korzysta z tego katalogu.

Zapisywanie niestandardowego modelu

tf.saved_model.save obsługuje zapisywanie obiektów tf.Module i jego podklas, takich jak tf.keras.Layer i tf.keras.Model .

Spójrzmy na przykład zapisywania i przywracania 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()

Podczas zapisywania tf.Module , wszystkie atrybuty tf.Variable , metody z dekoracją tf.function i tf.Module s znalezione za pomocą przechodzenia rekurencyjnego są zapisywane. (Zobacz samouczek Checkpoint , aby uzyskać więcej informacji na temat tego rekursywnego przechodzenia.) Jednak wszystkie atrybuty, funkcje i dane Pythona zostaną utracone. Oznacza to, że gdy zapisywana jest tf.function ., nie jest zapisywany żaden kod Pythona.

Jeśli żaden kod Pythona nie zostanie zapisany, skąd SavedModel wie, jak przywrócić tę funkcję?

Krótko mówiąc, tf.function działa poprzez śledzenie kodu Pythona w celu wygenerowania ConcreteFunction (wywołalnego opakowania wokół tf.Graph ). tf.function , tak naprawdę zapisujesz pamięć podręczną ConcreteFunctions tf.function .

Aby dowiedzieć się więcej o relacji między tf.function i ConcreteFunctions, zobacz przewodnik tf.function .

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/tmpbf9fpzwt/module_no_signatures/assets

Ładowanie i używanie niestandardowego modelu

Po załadowaniu SavedModel w Pythonie wszystkie atrybuty tf.Variable , metody tf.function -decorated i tf.Module s są przywracane w tej samej strukturze obiektu, co oryginalny zapisany 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

Ponieważ żaden kod Pythona nie jest zapisywany, wywołanie funkcji tf.function z nową sygnaturą wejściową zakończy się niepowodzeniem:

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'),), {})].

Dostrajanie podstawowe

Obiekty zmienne są dostępne i można je wykonywać wstecznie za pomocą importowanych funkcji. To wystarczy do dostrojenia (tj. przekwalifikowania) SavedModel w prostych przypadkach.

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

Ogólne dostrajanie

SavedModel firmy Keras zawiera więcej szczegółów niż zwykłe __call__ , aby rozwiązać bardziej zaawansowane przypadki dostrajania. TensorFlow Hub zaleca udostępnienie następujących elementów, jeśli ma to zastosowanie, w SavedModels udostępnionych w celu dostrojenia:

  • Jeśli model używa przerywania lub innej techniki, w której przekazywanie do przodu różni się między szkoleniem a wnioskowaniem (takim jak normalizacja wsadowa), metoda __call__ przyjmuje opcjonalny argument training= o wartości Pythona, który ma wartość domyślną False , ale można go ustawić na True .
  • Obok atrybutu __call__ znajdują się atrybuty .variable i .trainable_variable z odpowiednimi listami zmiennych. Zmienna, która pierwotnie była możliwa do trenowania, ale ma zostać zamrożona podczas dostrajania, jest pomijana w .trainable_variables .
  • Ze względu na frameworki, takie jak Keras, które reprezentują regulatory wagi jako atrybuty warstw lub podmodeli, może istnieć również atrybut .regularization_losses . Zawiera listę funkcji z zerowymi argumentami, których wartości mają na celu dodanie do całkowitej straty.

Wracając do pierwszego przykładu MobileNet, możesz zobaczyć niektóre z nich w akcji:

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, ...

Określanie podpisów podczas eksportu

Narzędzia takie jak TensorFlow Serving i saved_model_cli mogą wchodzić w interakcje z SavedModels. Aby pomóc tym narzędziom określić, których funkcji ConcreteFunctions użyć, musisz określić sygnatury obsługujące. tf.keras.Model automatycznie określa sygnatury obsługujące, ale będziesz musiał jawnie zadeklarować sygnaturę obsługującą dla naszych niestandardowych modułów.

Domyślnie żadne podpisy nie są deklarowane w niestandardowym tf.Module .

assert len(imported.signatures) == 0

Aby zadeklarować sygnaturę obsługującą, określ funkcję ConcreteFunction za pomocą signatures kwarg. Podczas określania pojedynczego podpisu, jego klucz podpisu będzie 'serving_default' , który jest zapisywany jako stała 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/tmpbf9fpzwt/module_with_signature/assets
imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())
['serving_default']

Aby wyeksportować wiele podpisów, przekaż słownik kluczy podpisów do ConcreteFunctions. Każdy klucz podpisu odpowiada jednej konkretnej funkcji.

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/tmpbf9fpzwt/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']

Domyślnie nazwy tensorów wyjściowych są dość ogólne, na przykład output_0 . Aby kontrolować nazwy wyjść, zmodyfikuj swoją tf.function , aby zwracała słownik, który mapuje nazwy wyjść na wyjścia. Nazwy wejść pochodzą od nazw argumentów funkcji Pythona.

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/tmpbf9fpzwt/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')}

Załaduj SavedModel w C++

Wersja C++ modułu ładującego SavedModel udostępnia interfejs API do ładowania SavedModel ze ścieżki, jednocześnie zezwalając na SessionOptions i RunOptions. Musisz określić tagi powiązane z wykresem, który ma zostać załadowany. Załadowana wersja SavedModel jest określana jako SavedModelBundle i zawiera MetaGraphDef oraz sesję, w której jest ładowana.

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

Szczegóły interfejsu wiersza poleceń SavedModel

Za pomocą interfejsu wiersza poleceń SavedModel (CLI) można sprawdzić i wykonać SavedModel. Na przykład można użyć interfejsu wiersza polecenia do sprawdzenia SignatureDef s modelu. Interfejs CLI umożliwia szybkie potwierdzenie, że typ i kształt wejściowego Tensora pasują do modelu. Co więcej, jeśli chcesz przetestować swój model, możesz użyć CLI do sprawdzenia poprawności, przekazując przykładowe dane wejściowe w różnych formatach (na przykład wyrażenia Pythona), a następnie pobierając dane wyjściowe.

Zainstaluj SavedModel CLI

Ogólnie rzecz biorąc, TensorFlow można zainstalować na jeden z dwóch poniższych sposobów:

  • Instalując gotowy plik binarny TensorFlow.
  • Budując TensorFlow z kodu źródłowego.

Jeśli zainstalowałeś TensorFlow za pomocą gotowego pliku binarnego TensorFlow, interfejs SavedModel CLI jest już zainstalowany w twoim systemie w bin/saved_model_cli .

Jeśli zbudowałeś TensorFlow z kodu źródłowego, musisz uruchomić następujące dodatkowe polecenie, aby zbudować saved_model_cli :

$ bazel build tensorflow/python/tools:saved_model_cli

Przegląd poleceń

SavedModel CLI obsługuje następujące dwa polecenia w SavedModel:

  • show , który pokazuje obliczenia dostępne z SavedModel.
  • run , który uruchamia obliczenia z SavedModel.

show polecenie

SavedModel zawiera jeden lub więcej wariantów modelu (technicznie v1.MetaGraphDef s), identyfikowanych przez ich zestawy znaczników. Aby obsłużyć model, możesz się zastanawiać, jakie typy SignatureDef znajdują się w każdym wariancie modelu i jakie są ich wejścia i wyjścia. Polecenie show pozwala zbadać zawartość SavedModel w kolejności hierarchicznej. Oto składnia:

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

Na przykład poniższe polecenie pokazuje wszystkie dostępne zestawy tagów w SavedModel:

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

Poniższe polecenie pokazuje wszystkie dostępne klucze SignatureDef dla zestawu znaczników:

$ 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"

Jeśli w zestawie znaczników znajduje się wiele znaczników, należy określić wszystkie znaczniki, każdy znacznik oddzielony przecinkiem. Na przykład:

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

Aby wyświetlić wszystkie dane wejściowe i wyjściowe TensorInfo dla określonego SignatureDef , przekaż klucz SignatureDef do opcji signature_def . Jest to bardzo przydatne, gdy chcesz poznać wartość klucza tensora, typ d i kształt tensorów wejściowych w celu późniejszego wykonania wykresu obliczeń. Na przykład:

$ 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

Aby wyświetlić wszystkie dostępne informacje w SavedModel, użyj opcji --all . Na przykład:

$ 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

run polecenie

Wywołaj polecenie run , aby uruchomić obliczenie wykresu, przekazując dane wejściowe, a następnie wyświetlając (i opcjonalnie zapisując) dane wyjściowe. Oto składnia:

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]

Polecenie run udostępnia następujące trzy sposoby przekazywania danych wejściowych do modelu:

  • Opcja --inputs umożliwia przekazywanie numpy ndarray w plikach.
  • Opcja --input_exprs umożliwia przekazywanie wyrażeń Pythona.
  • Opcja --input_examples umożliwia przekazanie tf.train.Example .

--inputs

Aby przekazać dane wejściowe w plikach, określ opcję --inputs , która przyjmuje następujący ogólny format:

--inputs <INPUTS>

gdzie WEJŚCIA to jeden z następujących formatów:

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

Możesz przekazać wiele WEJŚĆ . Jeśli przekazujesz wiele danych wejściowych, użyj średnika, aby oddzielić każde z WEJŚĆ .

saved_model_cli używa numpy.load do załadowania nazwy pliku . Nazwa pliku może mieć dowolny z następujących formatów:

  • .npy
  • .npz
  • format marynaty

Plik .npy zawsze zawiera numpy ndarray. Dlatego podczas ładowania z pliku .npy zawartość zostanie bezpośrednio przypisana do określonego tensora wejściowego. Jeśli określisz nazwę_zmiennej z tym plikiem .npy , nazwa_zmiennej zostanie zignorowana i zostanie wyświetlone ostrzeżenie.

Podczas ładowania z pliku .npz (zip) można opcjonalnie określić nazwę_zmiennej, aby zidentyfikować zmienną w pliku zip do załadowania dla wejściowego klucza tensora. Jeśli nie określisz zmiennej nazwa_zmiennej , SavedModel CLI sprawdzi, czy tylko jeden plik jest zawarty w pliku zip i załaduje go dla określonego klucza tensora wejściowego.

Podczas ładowania z pliku zalewy, jeśli w nawiasach kwadratowych nie określono variable_name , wszystko, co znajduje się w pliku zalewy, zostanie przekazane do określonego klucza tensora wejściowego. W przeciwnym razie SavedModel CLI przyjmie, że słownik jest przechowywany w pliku pickle i zostanie użyta wartość odpowiadająca zmiennej nazwa_zmiennej.

--input_exprs

Aby przekazywać dane wejściowe przez wyrażenia Pythona, określ opcję --input_exprs . Może to być przydatne, gdy nie masz leżących plików danych, ale nadal chcesz sprawdzić poprawność modelu za pomocą kilku prostych danych wejściowych, które pasują do typu dtype i kształtu SignatureDef s modelu. Na przykład:

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

Oprócz wyrażeń Pythona możesz również przekazywać funkcje numpy. Na przykład:

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

(Zauważ, że moduł numpy jest już dostępny jako np .)

--input_examples

Aby przekazać tf.train.Example jako dane wejściowe, określ opcję --input_examples . Dla każdego klucza wejściowego pobierana jest lista słowników, gdzie każdy słownik jest instancją tf.train.Example . Klucze słownika to funkcje, a wartości to listy wartości dla każdej funkcji. Na przykład:

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

Zapisz dane wyjściowe

Domyślnie SavedModel CLI zapisuje dane wyjściowe na standardowe wyjście. Jeśli katalog zostanie przekazany do opcji --outdir , dane wyjściowe zostaną zapisane jako pliki .npy nazwane zgodnie z kluczami tensora wyjściowego w podanym katalogu.

Użyj --overwrite , aby nadpisać istniejące pliki wyjściowe.