Hari Komunitas ML adalah 9 November! Bergabung dengan kami untuk update dari TensorFlow, JAX, dan lebih Pelajari lebih lanjut

Menggunakan format Model Tersimpan

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Sebuah SavedModel berisi program TensorFlow lengkap, termasuk parameter dilatih (yaitu, tf.Variable s) dan komputasi. Tidak memerlukan asli kode model yang bangunan untuk menjalankan, yang membuatnya berguna untuk berbagi atau menyebarkan dengan TFLite , TensorFlow.js , TensorFlow Melayani , atau TensorFlow Hub .

Anda dapat menyimpan dan memuat model dalam format SavedModel menggunakan API berikut:

Membuat SavedModel dari Keras

Untuk pengenalan singkat, bagian ini mengekspor model Keras yang telah dilatih sebelumnya dan melayani permintaan klasifikasi gambar dengannya. Panduan selanjutnya akan mengisi detail dan mendiskusikan cara lain untuk membuat 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.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
73728/61306 [====================================] - 0s 0us/step

png

Anda akan menggunakan gambar Grace Hopper sebagai contoh berjalan, dan model klasifikasi gambar terlatih Keras karena mudah digunakan. Model khusus juga berfungsi, dan dibahas secara mendetail nanti.

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

Prediksi teratas untuk gambar ini adalah "seragam militer".

mobilenet_save_path = os.path.join(tmpdir, "mobilenet/1/")
tf.saved_model.save(pretrained_model, mobilenet_save_path)
2021-09-22 20:37:56.476712: 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/tmpiq7_1gwc/mobilenet/1/assets

Save-jalan mengikuti konvensi yang digunakan oleh TensorFlow Melayani mana komponen jalan terakhir ( 1/ disini) adalah nomor versi untuk model Anda - memungkinkan alat seperti Tensorflow Melayani alasan tentang kesegaran relatif.

Anda dapat memuat kembali SavedModel ke Python dengan tf.saved_model.load dan melihat bagaimana gambar Laksamana Hopper diklasifikasikan.

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

Tanda tangan yang diimpor selalu mengembalikan kamus. Untuk menyesuaikan nama signature dan kunci keluaran kamus, lihat Menentukan tanda tangan selama ekspor .

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

Menjalankan inferensi dari SavedModel memberikan hasil yang sama seperti model aslinya.

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

Menjalankan SavedModel di TensorFlow Serving

SavedModels dapat digunakan dari Python (lebih lanjut tentang itu di bawah), tetapi lingkungan produksi biasanya menggunakan layanan khusus untuk inferensi tanpa menjalankan kode Python. Ini mudah disiapkan dari SavedModel menggunakan TensorFlow Serving.

Lihat TensorFlow Melayani SISA tutorial untuk end-to-end tensorflow-melayani contoh.

Format SavedModel pada disk

SavedModel adalah direktori yang berisi tanda tangan serial dan status yang diperlukan untuk menjalankannya, termasuk nilai variabel dan kosakata.

ls {mobilenet_save_path}
assets  saved_model.pb  variables

The saved_model.pb berkas toko program yang sebenarnya TensorFlow, atau model, dan satu set tanda tangan bernama, masing-masing mengidentifikasi sebuah fungsi yang menerima input tensor dan menghasilkan tensor output.

SavedModels mungkin berisi beberapa varian dari model (multiple v1.MetaGraphDefs , diidentifikasi dengan --tag_set bendera untuk saved_model_cli ), tapi ini jarang terjadi. API yang membuat beberapa varian dari model termasuk tf.Estimator.experimental_export_all_saved_models dan di 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"

The variables direktori berisi sebuah pos pemeriksaan pelatihan standar (lihat panduan untuk pos-pos pemeriksaan pelatihan ).

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

The assets direktori berisi file yang digunakan oleh grafik TensorFlow, untuk file teks contoh yang digunakan untuk menginisialisasi tabel kosakata. Ini tidak digunakan dalam contoh ini.

SavedModels mungkin memiliki assets.extra direktori untuk setiap file tidak digunakan oleh grafik TensorFlow, untuk informasi contoh bagi konsumen tentang apa yang harus dilakukan dengan SavedModel. TensorFlow sendiri tidak menggunakan direktori ini.

Menyimpan model khusus

tf.saved_model.save mendukung tabungan tf.Module objek dan subclass, seperti tf.keras.Layer dan tf.keras.Model .

Penampilan Mari kita lihat contoh dari tabungan dan memulihkan 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()

Bila Anda menyimpan sebuah tf.Module , setiap tf.Variable atribut, tf.function -decorated metode, dan tf.Module s ditemukan melalui traversal rekursif disimpan. (Lihat tutorial Checkpoint untuk lebih lanjut tentang traversal rekursif ini.) Namun, setiap Python atribut, fungsi, dan data yang hilang. Ini berarti bahwa ketika tf.function disimpan, tidak ada kode Python disimpan.

Jika tidak ada kode Python yang disimpan, bagaimana SavedModel mengetahui cara mengembalikan fungsi?

Secara singkat, tf.function bekerja dengan menelusuri kode Python untuk menghasilkan ConcreteFunction (bungkus callable sekitar tf.Graph ). Saat menyimpan tf.function , Anda benar-benar menyimpan tf.function tembolok 's of ConcreteFunctions.

Untuk mempelajari lebih lanjut tentang hubungan antara tf.function dan ConcreteFunctions, lihat panduan 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/tmpiq7_1gwc/module_no_signatures/assets

Memuat dan menggunakan model khusus

Ketika Anda memuat SavedModel di Python, semua tf.Variable atribut, tf.function -decorated metode, dan tf.Module s dikembalikan dalam struktur objek yang sama seperti aslinya disimpan 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

Karena tidak ada kode Python disimpan, memanggil tf.function dengan tanda tangan masukan baru akan gagal:

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

Penyetelan dasar

Objek variabel tersedia, dan Anda dapat melakukan backprop melalui fungsi yang diimpor. Itu cukup untuk menyempurnakan (yaitu melatih kembali) SavedModel dalam kasus-kasus sederhana.

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

Penyesuaian umum

Sebuah SavedModel dari Keras memberikan rincian lebih lanjut dari polos __call__ untuk mengatasi kasus-kasus yang lebih maju dari fine-tuning. TensorFlow Hub merekomendasikan untuk menyediakan yang berikut ini, jika berlaku, di SavedModels yang dibagikan untuk tujuan penyempurnaan:

  • Jika menggunakan model yang putus sekolah atau teknik lain di mana berbeda lulus ke depan antara pelatihan dan inferensi (seperti normalisasi batch), yang __call__ metode mengambil opsional, Python-dihargai training= argumen yang defaultnya False tetapi dapat diatur untuk True .
  • Sebelah __call__ atribut, ada .variable dan .trainable_variable atribut dengan daftar yang sesuai variabel. Sebuah variabel yang awalnya dilatih tetapi dimaksudkan untuk dibekukan selama fine-tuning dihilangkan dari .trainable_variables .
  • Demi kerangka seperti Keras yang mewakili regularizers berat sebagai atribut dari lapisan atau sub-model, ada juga dapat menjadi .regularization_losses atribut. Ini memegang daftar fungsi argumen nol yang nilainya dimaksudkan untuk penambahan total kerugian.

Kembali ke contoh MobileNet awal, Anda dapat melihat beberapa di antaranya beraksi:

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

Menentukan tanda tangan selama ekspor

Alat seperti TensorFlow Melayani dan saved_model_cli dapat berinteraksi dengan SavedModels. Untuk membantu alat ini menentukan Fungsi Beton yang akan digunakan, Anda perlu menentukan tanda tangan penyajian. tf.keras.Model s otomatis menentukan melayani tanda tangan, tetapi Anda harus secara eksplisit menyatakan tanda tangan melayani untuk modul kebiasaan kami.

Secara default, tidak ada tanda tangan dinyatakan dalam kustom tf.Module .

assert len(imported.signatures) == 0

Untuk menyatakan tanda tangan yang melayani, menentukan ConcreteFunction menggunakan signatures kwarg. Ketika menentukan satu tanda tangan, kunci tanda tangan akan 'serving_default' , yang disimpan sebagai konstanta 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/tmpiq7_1gwc/module_with_signature/assets
imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())
['serving_default']

Untuk mengekspor beberapa tanda tangan, berikan kamus kunci tanda tangan ke ConcreteFunctions. Setiap kunci tanda tangan sesuai dengan satu 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/tmpiq7_1gwc/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']

Secara default, nama-nama keluaran tensor cukup generik, seperti output_0 . Untuk mengontrol nama-nama output, memodifikasi Anda tf.function untuk kembali kamus yang memetakan nama output ke output. Nama-nama input berasal dari nama arg fungsi Python.

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

Muat Model Tersimpan di C++

C ++ versi SavedModel loader menyediakan API untuk memuat SavedModel dari jalan, sementara memungkinkan SessionOptions dan RunOptions. Anda harus menentukan tag yang terkait dengan grafik yang akan dimuat. Versi SavedModel yang dimuat disebut sebagai SavedModelBundle dan berisi MetaGraphDef dan sesi di mana ia dimuat.

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

Detail antarmuka baris perintah SavedModel

Anda dapat menggunakan SavedModel Command Line Interface (CLI) untuk memeriksa dan menjalankan SavedModel. Sebagai contoh, Anda dapat menggunakan CLI untuk memeriksa model SignatureDef s. CLI memungkinkan Anda dengan cepat mengonfirmasi bahwa jenis dan bentuk Tensor input cocok dengan model. Selain itu, jika Anda ingin menguji model Anda, Anda dapat menggunakan CLI untuk melakukan pemeriksaan kewarasan dengan memasukkan input sampel dalam berbagai format (misalnya, ekspresi Python) dan kemudian mengambil outputnya.

Instal CLI Model Tersimpan

Secara garis besar, Anda dapat menginstal TensorFlow dengan salah satu dari dua cara berikut:

  • Dengan menginstal biner TensorFlow bawaan.
  • Dengan membangun TensorFlow dari kode sumber.

Jika Anda menginstal TensorFlow melalui pre-built TensorFlow biner, maka SavedModel CLI telah terinstal di sistem Anda di path bin/saved_model_cli .

Jika Anda membangun TensorFlow dari kode sumber, Anda harus menjalankan perintah tambahan berikut untuk membangun saved_model_cli :

$ bazel build tensorflow/python/tools:saved_model_cli

Ikhtisar perintah

CLI SavedModel mendukung dua perintah berikut pada SavedModel:

  • show , yang menunjukkan perhitungan tersedia dari SavedModel.
  • run , yang menjalankan perhitungan dari SavedModel a.

show perintah

Sebuah SavedModel berisi satu atau lebih varian model yang (secara teknis, v1.MetaGraphDef s), diidentifikasi oleh mereka tag-set. Untuk melayani model, Anda mungkin bertanya-tanya apa jenis SignatureDef s berada di masing-masing model varian, dan apa yang input dan output mereka. The show perintah membiarkan Anda memeriksa isi dari SavedModel agar hirarkis. Berikut sintaksnya:

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

Misalnya, perintah berikut menunjukkan semua kumpulan tag yang tersedia di SavedModel:

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

Perintah berikut menunjukkan semua tersedia SignatureDef kunci untuk satu set tag:

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

Jika ada beberapa tag di tag-set, Anda harus menentukan semua tag, setiap tag dipisahkan dengan koma. Sebagai contoh:

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

Untuk menampilkan semua masukan dan output TensorInfo untuk tertentu SignatureDef , lulus dalam SignatureDef kunci untuk signature_def pilihan. Hal ini sangat berguna ketika Anda ingin mengetahui nilai tensor key, dtype dan bentuk tensor input untuk mengeksekusi grafik komputasi nantinya. Sebagai contoh:

$ 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

Untuk menampilkan semua informasi yang tersedia di SavedModel, gunakan --all pilihan. Sebagai contoh:

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

Invoke yang run perintah untuk menjalankan perhitungan grafik, melewati input dan kemudian menampilkan (dan opsional menyimpan) output. Berikut sintaksnya:

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]

The run command menyediakan tiga cara berikut untuk lulus masukan untuk model:

  • --inputs pilihan memungkinkan Anda untuk lulus ndarray numpy dalam file.
  • --input_exprs pilihan memungkinkan Anda untuk lulus ekspresi Python.
  • --input_examples pilihan memungkinkan Anda untuk lulus tf.train.Example .

--inputs

Untuk lulus input data dalam file, tentukan --inputs pilihan, yang mengambil format umum berikut:

--inputs <INPUTS>

di mana INPUT adalah salah satu dari format berikut:

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

Anda dapat melewati beberapa INPUT. Jika Anda melewati beberapa masukan, gunakan titik koma untuk memisahkan masing-masing INPUT.

saved_model_cli penggunaan numpy.load memuat nama file. Nama file mungkin dalam salah satu format berikut:

  • .npy
  • .npz
  • format acar

Sebuah .npy File selalu mengandung ndarray numpy. Karena itu, ketika loading dari .npy berkas, konten akan langsung ditugaskan ke tensor masukan tertentu. Jika Anda menentukan variable_name dengan yang .npy berkas, variable_name tersebut akan diabaikan dan peringatan akan dikeluarkan.

Ketika loading dari .npz (zip) file, Anda mungkin opsional menentukan variable_name untuk mengidentifikasi variabel dalam file zip untuk memuat untuk kunci masukan tensor. Jika Anda tidak menentukan variable_name, maka SavedModel CLI akan memeriksa bahwa hanya satu file termasuk dalam file zip dan beban itu untuk kunci masukan tensor tertentu.

Ketika memuat dari file acar, jika tidak ada variable_name ditentukan dalam kurung, apa pun yang ada di dalam file acar akan diteruskan ke tombol masukan tensor yang ditentukan. Jika tidak, SavedModel CLI akan menganggap kamus disimpan dalam file acar dan nilai yang sesuai dengan variable_name yang akan digunakan.

--input_exprs

Untuk lulus input melalui ekspresi Python, tentukan --input_exprs pilihan. Hal ini dapat berguna ketika Anda tidak memiliki file data tergeletak di sekitar, tapi masih ingin kewarasan memeriksa model dengan beberapa masukan sederhana yang sesuai dengan dtype dan bentuk model SignatureDef s. Sebagai contoh:

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

Selain ekspresi Python, Anda juga dapat melewatkan fungsi numpy. Sebagai contoh:

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

(Catatan bahwa numpy modul sudah tersedia untuk Anda sebagai np .)

--input_examples

Untuk lulus tf.train.Example sebagai masukan, tentukan --input_examples pilihan. Untuk setiap tombol masukan, dibutuhkan daftar kamus, di mana masing-masing kamus adalah turunan dari tf.train.Example . Kunci kamus adalah fitur dan nilainya adalah daftar nilai untuk setiap fitur. Sebagai contoh:

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

Simpan keluaran

Secara default, CLI SavedModel menulis output ke stdout. Jika direktori akan diteruskan ke --outdir pilihan, output akan disimpan sebagai .npy file dinamai kunci keluaran tensor bawah direktori yang diberikan.

Gunakan --overwrite menimpa file output yang ada.