Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Menggunakan format SavedModel

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

SavedModel berisi program TensorFlow lengkap, termasuk bobot dan komputasi. Ini tidak memerlukan kode pembuatan model asli untuk dijalankan, yang membuatnya berguna untuk berbagi atau menerapkan (dengan TFLite , TensorFlow.js , TensorFlow Serving , atau TensorFlow Hub ).

Dokumen ini membahas beberapa detail tentang cara menggunakan api tf.saved_model tingkat tf.saved_model :

Membuat SavedModel dari Keras

Untuk pengenalan singkat, bagian ini mengekspor model Keras yang telah dilatih sebelumnya dan melayani permintaan klasifikasi gambar dengannya. Panduan lainnya akan mengisi detail dan membahas 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.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

png

Anda akan menggunakan gambar Grace Hopper sebagai contoh yang sedang berjalan, dan model klasifikasi gambar yang sudah terlatih dengan Keras karena mudah digunakan. Model kustom juga berfungsi, dan akan 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

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 [==============================] - 1s 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)
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/tmpqrbxtm18/mobilenet/1/assets

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

Anda dapat memuat kembali SavedModel 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 kunci kamus keluaran, 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 dalam Penyajian TensorFlow

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 REST Penyajian TensorFlow untuk contoh penyajian tensorflow ujung ke ujung.

Format SavedModel di disk

SavedModel adalah direktori yang berisi tanda tangan berseri 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 satu set tanda tangan bernama, masing-masing mengidentifikasi fungsi yang menerima input tensor dan menghasilkan output tensor.

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

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. Itu tidak digunakan dalam contoh ini.

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

Menyimpan model kustom

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

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 mengetahui lebih lanjut tentang traversal rekursif ini.) Namun, semua atribut, fungsi, dan data Python hilang. Ini berarti bahwa ketika fungsi tf.function disimpan, tidak ada kode Python yang disimpan.

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

Singkatnya, tf.function bekerja dengan melacak kode Python untuk menghasilkan ConcreteFunction (pembungkus callable di sekitar tf.Graph ). Saat menyimpan sebuah tf.function , Anda benar-benar menyimpan cache ConcreteFunctions dari tf.function .

Untuk mempelajari lebih lanjut tentang hubungan antara tf.function dan ConcreteFunctions, lihat panduan tf.fungsi .

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

Memuat dan menggunakan model kustom

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 yang disimpan, memanggil fungsi tf.function dengan tanda tangan input 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'),), {})].

Penyempurnaan dasar

Objek variabel tersedia, dan Anda dapat melakukan backprop melalui fungsi yang diimpor. Itu cukup untuk menyempurnakan (yaitu melatih ulang) SavedModel dalam 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

A SavedModel dari Keras memberikan lebih banyak detail daripada __call__ biasa untuk menangani kasus fine-tuning tingkat lanjut. 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 __call__ berbeda antara pelatihan dan inferensi (seperti normalisasi batch), metode __call__ mengambil argumen opsional training= bernilai Python yang defaultnya ke False tetapi dapat disetel ke True .
  • Di __call__ 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 merepresentasikan pengatur bobot sebagai atribut lapisan atau sub-model, bisa juga ada atribut .regularization_losses . Ini memegang daftar fungsi nol-argumen yang nilainya dimaksudkan untuk menambah kerugian total.

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 ConcreteFunctions yang akan digunakan, Anda perlu menentukan tanda tangan penyajian. tf.keras.Model s secara otomatis menentukan tanda tangan penyajian, tetapi Anda harus secara eksplisit menyatakan 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 tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY konstan.

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/tmpqrbxtm18/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, teruskan kamus kunci tanda tangan ke ConcreteFunctions. Setiap kunci tanda tangan sesuai dengan satu Fungsi Beton.

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/tmpqrbxtm18/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 keluaran 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 diturunkan 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/tmpqrbxtm18/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 SavedModel di C ++

Versi C ++ dari loader SavedModel menyediakan API untuk memuat SavedModel dari jalur, sambil 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 dari antarmuka baris perintah SavedModel

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

Instal CLI SavedModel

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

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

Jika Anda menginstal TensorFlow melalui biner TensorFlow yang dibuat sebelumnya, CLI SavedModel sudah diinstal di 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

Gambaran umum perintah

CLI SavedModel mendukung dua perintah berikut di SavedModel:

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

show perintah

A SavedModel berisi satu atau beberapa varian model (secara teknis, v1.MetaGraphDef s), yang diidentifikasi oleh set tag-nya. Untuk menyajikan model, Anda mungkin bertanya-tanya jenis SignatureDef yang ada di setiap varian model, dan apa input dan outputnya. Perintah show memungkinkan Anda memeriksa konten SavedModel dalam urutan hierarki. 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 set 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 kunci SignatureDef tersedia 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 set-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 . Ini sangat berguna ketika Anda ingin mengetahui nilai kunci tensor, tipe d, dan bentuk tensor input untuk menjalankan grafik komputasi nanti. 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 komputasi 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:

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

--inputs

Untuk meneruskan data masukan dalam file, tentukan opsi --inputs , yang menggunakan format umum berikut:

--inputs <INPUTS>

dengan INPUTS dalam salah satu format berikut:

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

Anda dapat memberikan beberapa INPUT . Jika Anda meneruskan beberapa masukan, 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 variable_name dengan yang .npy file, 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 tombol input 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 input tensor tertentu.

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 variabel_name akan digunakan.

--input_exprs

Untuk melewatkan 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 model SignatureDef s. Sebagai contoh:

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

Selain ekspresi Python, Anda juga dapat meneruskan 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 tombol input, dibutuhkan daftar kamus, di mana setiap kamus adalah turunan dari tf.train.Example . Kunci kamus adalah fiturnya 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 diteruskan ke opsi --outdir , output akan disimpan sebagai file .npy dinamai kunci tensor output di bawah direktori yang diberikan.

Gunakan --overwrite untuk menimpa file output yang ada.