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:
- Niskopoziomowy interfejs API
tf.saved_model
. W tym dokumencie szczegółowo opisano, jak korzystać z tego interfejsu API.- Zapisz:
tf.saved_model.save(model, path_to_dir)
- Załaduj:
model = tf.saved_model.load(path_to_dir)
- Zapisz:
- Wysokopoziomowy interfejs API
tf.keras.Model
. Zapoznaj się z przewodnikiem dotyczącym zapisywania i serializacji keras . - Jeśli chcesz tylko zapisać/załadować ciężary podczas treningu, zapoznaj się z przewodnikiem po punktach kontrolnych .
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
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 argumenttraining=
o wartości Pythona, który ma wartość domyślnąFalse
, ale można go ustawić naTrue
. - 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 przekazanietf.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.