![]() | ![]() | ![]() | ![]() |
SavedModel zawiera kompletny program TensorFlow, w tym wyuczone parametry (tj. tf.Variable
s) i obliczenia. Nie wymaga do uruchomienia oryginalnego kodu do budowania modelu, dzięki czemu jest przydatny do udostępniania lub wdrażania za pomocą TFLite , TensorFlow.js , TensorFlow Serving lub TensorFlow Hub .
Możesz zapisać i załadować model w formacie SavedModel przy użyciu następujących interfejsów API:
-
tf.saved_model
interfejs APItf.saved_model
. W tym dokumencie szczegółowo opisano sposób korzystania z tego interfejsu API.- Zapisz:
tf.saved_model.save(model, path_to_dir)
- Load:
model = tf.saved_model.load(path_to_dir)
- Zapisz:
-
tf.keras.Model
interfejs APItf.keras.Model
. Zapoznaj się z przewodnikiem zapisywania i serializacji Keras . - Jeśli chcesz po prostu zapisywać / ładować ciężary podczas treningu, zapoznaj się z przewodnikiem po punktach kontrolnych .
Tworzenie SavedModel z Keras
Aby uzyskać krótkie wprowadzenie, ta sekcja eksportuje wstępnie wytrenowany model Keras i obsługuje z nim żądania klasyfikacji obrazu. Reszta przewodnika zawiera szczegółowe informacje i omawia 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.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
Użyjesz obrazu Grace Hopper jako przykładowego działania i wstępnie wyszkolonego modelu klasyfikacji obrazu Keras, ponieważ jest łatwy w użyciu. Modele niestandardowe również działają i 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
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 Result before saving: ['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']
Najpopularniejsza nazwa tego zdjęcia to „mundur wojskowy”.
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/tmps13igs50/mobilenet/1/assets
Ścieżka zapisu jest zgodna z konwencją używaną przez udostępnianie TensorFlow, gdzie ostatni składnik ścieżki ( 1/
tutaj) jest numerem wersji Twojego modelu - pozwala to narzędziom takim jak Tensorflow Serving na 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 sklasyfikowany jest obraz Admiral Hopper.
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 wyjściowe klucze słownika, 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 udostępnianiu TensorFlow
SavedModels można używać w Pythonie (więcej na ten temat poniżej), ale środowiska produkcyjne zazwyczaj używają dedykowanej usługi do wnioskowania bez uruchamiania kodu Pythona. Można to łatwo skonfigurować z poziomu SavedModel przy użyciu usługi TensorFlow Serving.
Zapoznaj się z samouczkiem dotyczącym obsługi REST TensorFlow, aby zapoznać się z kompleksowym przykładem obsługi tensorflow.
Format SavedModel na dysku
SavedModel to katalog zawierający zserializowane sygnatury 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żda identyfikuje funkcję, która przyjmuje dane wejściowe tensora i generuje dane wyjściowe tensora.
SavedModels może zawierać wiele odmian wzoru (wiele v1.MetaGraphDefs
, zidentyfikowane z --tag_set
flaga do saved_model_cli
), ale rzadko. Interfejsy API, które tworzą 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
2020-12-10 02:22:25.726807: 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"
Katalog variables
zawiera standardowy szkoleniowy punkt kontrolny (zobacz przewodnik po szkoleniowych punktach kontrolnych ).
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łownictwa. W tym przykładzie nie jest używany.
SavedModels może mieć katalog assets.extra
dla wszystkich 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 używa tego katalogu.
Zapisywanie modelu niestandardowego
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()
Po zapisaniu tf.Module
wszelkie tf.Variable
atrybuty, tf.function
-decorated metod i tf.Module
s znalezione przez rekurencyjnego przechodzenia są zapisywane. (Zobacz samouczek dotyczący punktu kontrolnego, aby uzyskać więcej informacji na temat przechodzenia cyklicznego). Jednak wszystkie atrybuty, funkcje i dane Pythona zostaną utracone. Oznacza to, że gdy tf.function
jest tf.function
, żaden kod Pythona nie jest zapisywany.
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ływanego opakowania wokół tf.Graph
). Podczas zapisywania tf.function
naprawdę oszczędzasz pamięć podręczną tf.function
ConcreteFunctions.
Aby dowiedzieć się więcej na temat związku 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/tmps13igs50/module_no_signatures/assets
Ładowanie i używanie modelu niestandardowego
Podczas ładowania SavedModel W Pythonie wszystkie tf.Variable
atrybuty tf.function
-decorated metod i tf.Module
s przywracane są w tej samej strukturze obiektów jak oryginał zapisane 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'),), {})].
Podstawowe dostrojenie
Obiekty zmienne są dostępne i można je cofać za pomocą importowanych funkcji. To wystarczy, aby dostroić (tj. Przekwalifikować) 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 dostrojenie
SavedModel z Keras dostarcza więcej szczegółów niż zwykłe __call__
aby rozwiązać bardziej zaawansowane przypadki dostrajania. TensorFlow Hub zaleca udostępnienie następujących z nich, jeśli ma to zastosowanie, w zapisanychModelach udostępnianych w celu dostrojenia:
- Jeśli model wykorzystuje dropout lub inną technikę, w której przebieg do przodu różni się między
__call__
a wnioskiem (np. Normalizacja wsadowa), metoda__call__
przyjmuje opcjonalny argumenttraining=
o wartości Pythona, który domyślnie ma wartośćFalse
ale można go ustawić naTrue
. - Obok atrybutu
__call__
atrybuty.variable
i.trainable_variable
z odpowiednimi listami zmiennych. Zmienna, która była pierwotnie możliwa do trenowania, ale ma zostać zamrożona podczas dostrajania, jest pomijana w.trainable_variables
. - Ze względu na struktury, takie jak Keras, które reprezentują regulatory wagi jako atrybuty warstw lub
.regularization_losses
, może istnieć również atrybut.regularization_losses
. Zawiera listę funkcji o zerowych argumentach, których wartości są przeznaczone do dodania 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ą współdziałać z SavedModels. Aby pomóc tym narzędziom określić, których ConcreteFunctions użyć, musisz określić obsługujące podpisy. tf.keras.Model
s automatycznie określają obsługujące podpisy, ale musisz jawnie zadeklarować serwujący podpis dla naszych niestandardowych modułów.
Domyślnie żadne podpisy nie są deklarowane w niestandardowym tf.Module
.
assert len(imported.signatures) == 0
Aby zadeklarować udostępniany podpis, określ ConcreteFunction, używając kwarg signatures
. Podczas określania pojedynczego podpisu jego klucz podpisu będzie miał wartość 'serving_default'
, która jest zapisywana 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/tmps13igs50/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 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/tmps13igs50/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, np. output_0
. Aby kontrolować nazwy wyjść, zmodyfikuj tf.function
aby tf.function
słownik, który odwzorowuje nazwy wyników na wyjścia. Nazwy wejść pochodzą z nazw arg 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/tmps13igs50/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 zapewnia interfejs API do ładowania SavedModel ze ścieżki, jednocześnie zezwalając na SessionOptions i RunOptions. Musisz określić tagi powiązane z ładowanym wykresem. Załadowana wersja SavedModel jest nazywana 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
Możesz użyć interfejsu wiersza poleceń SavedModel (CLI), aby sprawdzić i wykonać SavedModel. Na przykład, możesz użyć interfejsu wiersza polecenia, aby sprawdzić wartości SignatureDef
modelu. Interfejs CLI umożliwia szybkie potwierdzenie, że typ i kształt wejściowego tensora są zgodne z modelem. Co więcej, jeśli chcesz przetestować swój model, możesz użyć interfejsu wiersza polecenia 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 dwa sposoby:
- Instalując gotowy plik binarny TensorFlow.
- Budując TensorFlow z kodu źródłowego.
Jeśli zainstalowałeś TensorFlow za pomocą wstępnie zbudowanego pliku binarnego TensorFlow, to SavedModel CLI jest już zainstalowany w twoim systemie pod ścieżką bin/saved_model_cli
.
Jeśli zbudowałeś TensorFlow z kodu źródłowego, musisz uruchomić następującą dodatkową komendę, aby zbudować saved_model_cli
:
$ bazel build tensorflow/python/tools:saved_model_cli
Przegląd poleceń
Interfejs wiersza polecenia SavedModel 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 tagów. Aby obsłużyć model, możesz się zastanawiać, jakie typy SignatureDef
są w każdym wariancie modelu i jakie są ich wejścia i wyjścia. Polecenie show
umożliwia zbadanie zawartości SavedModel w porządku hierarchicznym. 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 wyświetla 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 tagów jest wiele tagów, musisz określić wszystkie tagi, każdy oddzielony przecinkiem. Na przykład:
$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve,gpu
Aby wyświetlić wszystkie wejścia i wyjścia TensorInfo dla określonego SignatureDef
, przekaż klucz SignatureDef
do opcji signature_def
. Jest to bardzo przydatne, gdy chcesz poznać wartość klucza tensora, typ i kształt tensorów wejściowych do późniejszego wykonania wykresu obliczeniowego. 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ć obliczenia 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
zapewnia 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. -
--input_examples
opcja umożliwia przekazanietf.train.Example
.
--inputs
Aby przekazać dane wejściowe w plikach, należy określić opcję --inputs
, która przyjmuje następujący format ogólny:
--inputs <INPUTS>
gdzie INPUTS ma jeden z następujących formatów:
-
<input_key>=<filename>
-
<input_key>=<filename>[<variable_name>]
Możesz przekazać wiele WEJŚĆ . Jeśli przepuszczasz wiele wejść, 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 nazwa_zmiennej z tym .npy
pliku, variable_name będą ignorowane i ostrzeżenie zostanie wydana.
Podczas ładowania z .npz
pliku (zip), można ewentualnie określić nazwa_zmiennej zidentyfikować zmienną w pliku zip, aby załadować klucza tensora wejściowego. 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 wejściowego klucza tensora.
Podczas ładowania z pliku marynowane, jeśli nie variable_name
podano w nawiasach kwadratowych, cokolwiek to jest wewnątrz pliku ogórka zostaną przekazane do określonego klucza tensora wejściowego. W przeciwnym razie interfejs CLI SavedModel zakłada, że słownik jest przechowywany w pliku pikle 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 plików danych leżących w pobliżu, ale nadal chcesz sprawdzić poprawność modelu za pomocą kilku prostych danych wejściowych, które pasują do typu i kształtu SignatureDef
modelu. Na przykład:
`<input_key>=[[1],[2],[3]]`
Oprócz wyrażeń w Pythonie możesz także 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 pobiera listę 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 wyjście
Domyślnie interfejs wiersza polecenia SavedModel 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 na podstawie kluczy tensora wyjściowego w podanym katalogu.
Użyj --overwrite
aby nadpisać istniejące pliki wyjściowe.