Menggunakan format Model Tersimpan

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

SavedModel berisi program TensorFlow lengkap, termasuk parameter terlatih (yaitu, tf.Variable s) dan komputasi. Itu tidak memerlukan kode pembuatan model asli untuk dijalankan, yang membuatnya berguna untuk dibagikan atau diterapkan dengan TFLite , TensorFlow.js , TensorFlow Serving , 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.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

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

Save-path mengikuti konvensi yang digunakan oleh TensorFlow Serving di mana komponen jalur terakhir ( 1/ di sini) adalah nomor versi untuk model Anda - ini memungkinkan alat seperti Tensorflow Serving untuk mempertimbangkan kesegaran relatif.

Anda dapat memuat SavedModel kembali ke Python dengan tf.saved_model.load dan melihat bagaimana gambar Admiral 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 tanda tangan dan mengeluarkan kunci 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 tutorial TensorFlow Serving REST untuk contoh penyajian tensorflow end-to-end.

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

File saved_model.pb menyimpan program atau model TensorFlow aktual, dan sekumpulan tanda tangan bernama, masing-masing mengidentifikasi fungsi yang menerima input tensor dan menghasilkan output tensor.

SavedModels mungkin berisi beberapa varian model (beberapa v1.MetaGraphDefs , diidentifikasi dengan tanda --tag_set ke saved_model_cli ), tetapi ini jarang terjadi. API yang membuat beberapa varian model mencakup 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"

Direktori variables berisi pos pemeriksaan pelatihan standar (lihat panduan untuk pos pemeriksaan pelatihan ).

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

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

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

Menyimpan model khusus

tf.saved_model.save mendukung penyimpanan objek tf.Module dan subkelasnya, seperti tf.keras.Layer dan tf.keras.Model .

Mari kita lihat contoh menyimpan 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()

Saat Anda menyimpan tf.Module , semua atribut tf.Variable , tf.function methods, dan tf.Module s yang ditemukan melalui traversal rekursif akan disimpan. (Lihat tutorial Checkpoint untuk mengetahui lebih lanjut tentang traversal rekursif ini.) Namun, semua atribut, fungsi, dan data Python hilang. Ini berarti bahwa ketika tf.function disimpan, tidak ada kode Python yang disimpan.

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

Secara singkat, tf.function bekerja dengan menelusuri kode Python untuk menghasilkan ConcreteFunction (pembungkus yang dapat dipanggil di sekitar tf.Graph ). Saat menyimpan tf.function , Anda benar-benar menyimpan cache tf.function dari 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/tmpbf9fpzwt/module_no_signatures/assets

Memuat dan menggunakan model khusus

Saat Anda memuat SavedModel dengan Python, semua atribut tf.Variable , tf.function method, dan tf.Module s dipulihkan dalam struktur objek yang sama dengan tf.Module asli yang disimpan.

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 yang disimpan, pemanggilan tf.function dengan input signature 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

SavedModel dari Keras memberikan lebih banyak detail daripada __call__ biasa untuk menangani kasus fine-tuning yang lebih canggih. TensorFlow Hub merekomendasikan untuk menyediakan yang berikut ini, jika berlaku, di SavedModels yang dibagikan untuk tujuan penyempurnaan:

  • Jika model menggunakan dropout atau teknik lain di mana forward pass berbeda antara pelatihan dan inferensi (seperti normalisasi batch), metode __call__ mengambil argumen training= bernilai Python opsional yang defaultnya adalah False tetapi dapat disetel ke True .
  • Di sebelah atribut __call__ , ada atribut .variable dan .trainable_variable dengan daftar variabel yang sesuai. Variabel yang awalnya dapat dilatih tetapi dimaksudkan untuk dibekukan selama fine-tuning dihilangkan dari .trainable_variables .
  • Demi kerangka kerja seperti Keras yang mewakili pengatur bobot sebagai atribut lapisan atau sub-model, bisa juga ada atribut .regularization_losses . 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 Serving 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 secara otomatis menentukan tanda tangan penyajian, tetapi Anda harus secara eksplisit mendeklarasikan tanda tangan penyajian untuk modul khusus kami.

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

assert len(imported.signatures) == 0

Untuk mendeklarasikan tanda tangan penyajian, tentukan ConcreteFunction menggunakan signatures kwarg. Saat menentukan satu tanda tangan, kunci tanda tangannya adalah '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/tmpbf9fpzwt/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 banyak 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/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']

Secara default, nama tensor output cukup umum, seperti output_0 . Untuk mengontrol nama keluaran, ubah tf.function Anda untuk mengembalikan kamus yang memetakan nama keluaran ke keluaran. 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/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')}

Muat Model Tersimpan di C++

Loader SavedModel versi C++ menyediakan API untuk memuat SavedModel dari jalur, sekaligus mengizinkan 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. Misalnya, Anda dapat menggunakan CLI untuk memeriksa SignatureDef s model. CLI memungkinkan Anda mengonfirmasi dengan cepat 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 biner TensorFlow bawaan, maka SavedModel CLI sudah diinstal pada sistem Anda di pathname bin/saved_model_cli .

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

$ bazel build tensorflow/python/tools:saved_model_cli

Ikhtisar perintah

CLI SavedModel mendukung dua perintah berikut pada SavedModel:

  • show , yang menunjukkan komputasi yang tersedia dari SavedModel.
  • run , yang menjalankan komputasi dari SavedModel.

show perintah

SavedModel berisi satu atau beberapa varian model (secara teknis, v1.MetaGraphDef s), yang diidentifikasi oleh kumpulan tagnya. Untuk menyajikan model, Anda mungkin bertanya-tanya apa jenis SignatureDef di setiap varian model, dan apa input dan outputnya. Perintah show memungkinkan Anda memeriksa konten SavedModel dalam urutan hierarkis. 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 menampilkan semua kunci SignatureDef yang tersedia untuk kumpulan 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 dalam kumpulan tag, 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 input dan output TensorInfo untuk SignatureDef tertentu, teruskan kunci SignatureDef ke opsi signature_def . 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 opsi --all . 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 perintah

Panggil perintah run untuk menjalankan perhitungan grafik, meneruskan input dan kemudian menampilkan (dan secara 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]

Perintah run menyediakan tiga cara berikut untuk meneruskan input ke model:

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

--inputs

Untuk meneruskan data input dalam file, tentukan opsi --inputs , 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 melewatkan beberapa input, gunakan titik koma untuk memisahkan setiap INPUT .

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

  • .npy
  • .npz
  • format acar

File .npy selalu berisi ndarray numpy. Oleh karena itu, saat memuat dari file .npy , konten akan langsung ditetapkan ke tensor input yang ditentukan. Jika Anda menentukan nama_variabel dengan file .npy itu, nama_variabel akan diabaikan dan peringatan akan dikeluarkan.

Saat memuat dari file .npz (zip), Anda dapat secara opsional menentukan nama_variabel untuk mengidentifikasi variabel dalam file zip yang akan dimuat untuk kunci tensor input. Jika Anda tidak menentukan variabel_name , SavedModel CLI akan memeriksa bahwa hanya satu file yang disertakan dalam file zip dan memuatnya untuk kunci tensor input yang ditentukan.

Saat memuat dari file acar, jika tidak ada variable_name yang ditentukan dalam tanda kurung siku, apa pun yang ada di dalam file acar akan diteruskan ke kunci tensor input yang ditentukan. Jika tidak, CLI SavedModel akan menganggap kamus disimpan dalam file acar dan nilai yang sesuai dengan nama_variabel akan digunakan.

--input_exprs

Untuk meneruskan input melalui ekspresi Python, tentukan opsi --input_exprs . Ini dapat berguna ketika Anda tidak memiliki file data yang tergeletak di sekitar, tetapi masih ingin memeriksa kewarasan model dengan beberapa input sederhana yang cocok dengan dtype dan bentuk dari 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))`

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

--input_examples

Untuk meneruskan tf.train.Example sebagai input, tentukan opsi --input_examples . Untuk setiap kunci input, dibutuhkan daftar kamus, di mana setiap 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 sebuah direktori diteruskan ke opsi --outdir , output akan disimpan sebagai file .npy yang dinamai dengan kunci tensor output di bawah direktori yang diberikan.

Gunakan --overwrite untuk menimpa file keluaran yang ada.