در سمپوزیوم زنان در ML در 7 دسامبر شرکت کنید هم اکنون ثبت نام کنید

با استفاده از قالب SavedModel

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

یک SavedModel شامل یک برنامه کامل TensorFlow، شامل پارامترهای آموزش دیده (یعنی tf.Variable s) و محاسبات است. برای اجرا به کد ساخت مدل اصلی نیازی ندارد، که آن را برای اشتراک‌گذاری یا استقرار با TFLite ، TensorFlow.js ، TensorFlow Serving یا TensorFlow Hub مفید می‌کند.

با استفاده از API های زیر می توانید یک مدل را در قالب SavedModel ذخیره و بارگذاری کنید:

ایجاد SavedModel از Keras

برای معرفی سریع، این بخش یک مدل Keras از پیش آموزش دیده را صادر می کند و درخواست های طبقه بندی تصویر را با آن ارائه می کند. بقیه راهنما جزئیات را پر می کند و راه های دیگر ایجاد 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

شما از تصویر گریس هاپر به عنوان نمونه در حال اجرا و یک مدل طبقه بندی تصویر از پیش آموزش دیده Keras استفاده خواهید کرد زیرا استفاده از آن آسان است. مدل‌های سفارشی نیز کار می‌کنند و بعداً به تفصیل توضیح داده می‌شوند.

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

پیش بینی برتر برای این تصویر "یونیفرم نظامی" است.

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

مسیر ذخیره از قراردادی پیروی می کند که توسط TensorFlow Serving استفاده می شود که در آن آخرین مؤلفه مسیر ( 1/ اینجا) یک شماره نسخه برای مدل شما است - به ابزارهایی مانند Tensorflow Serving اجازه می دهد تا در مورد تازگی نسبی استدلال کنند.

می توانید SavedModel را با tf.saved_model.load دوباره در پایتون بارگیری کنید و ببینید که چگونه تصویر Admiral Hopper طبقه بندی می شود.

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

امضاهای وارداتی همیشه دیکشنری ها را برمی گرداند. برای سفارشی کردن نام امضا و کلیدهای فرهنگ لغت خروجی، به تعیین امضا در حین صادرات مراجعه کنید.

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

اجرای استنتاج از SavedModel همان نتیجه مدل اصلی را می دهد.

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

اجرای SavedModel در سرویس TensorFlow

SavedModel ها از پایتون قابل استفاده هستند (در ادامه در مورد آن بیشتر توضیح می دهیم)، اما محیط های تولیدی معمولاً از یک سرویس اختصاصی برای استنتاج بدون اجرای کد پایتون استفاده می کنند. تنظیم این مورد از SavedModel با استفاده از TensorFlow Serving آسان است.

آموزش TensorFlow Serving REST را برای مثالی از پایان به انتها tensorflow-serving ببینید.

فرمت SavedModel روی دیسک

SavedModel یک دایرکتوری حاوی امضاهای سریالی و وضعیت مورد نیاز برای اجرای آنها، از جمله مقادیر متغیر و واژگان است.

ls {mobilenet_save_path}
assets  saved_model.pb  variables

فایل saved_model.pb برنامه یا مدل واقعی TensorFlow و مجموعه‌ای از امضاهای نام‌گذاری شده را ذخیره می‌کند که هر کدام تابعی را شناسایی می‌کنند که ورودی‌های تانسور را می‌پذیرد و خروجی‌های تانسور تولید می‌کند.

SavedModels ممکن است دارای انواع مختلفی از مدل باشد (multiple v1.MetaGraphDefs ، با --tag_set به saved_model_cli مشخص شده است)، اما این نادر است. APIهایی که چندین گونه از یک مدل را ایجاد می کنند عبارتند از tf.Estimator.experimental_export_all_saved_models و در 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"

دایرکتوری variables حاوی یک نقطه بازرسی آموزشی استاندارد است ( راهنمای نقاط بازرسی آموزشی را ببینید).

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

فهرست assets حاوی فایل هایی است که توسط نمودار TensorFlow استفاده می شود، برای مثال فایل های متنی که برای مقداردهی اولیه جداول واژگان استفاده می شوند. در این مثال استفاده نشده است.

SavedModels ممکن است دارای یک فهرست assets.extra برای هر فایلی باشد که توسط نمودار TensorFlow استفاده نمی‌شود، برای مثال اطلاعاتی برای مصرف‌کنندگان در مورد کارهایی که باید با SavedModel انجام دهند. خود TensorFlow از این دایرکتوری استفاده نمی کند.

ذخیره یک مدل سفارشی

tf.saved_model.save از ذخیره اشیاء tf.Module و زیر کلاس‌های آن مانند tf.keras.Layer و tf.keras.Model .

بیایید به مثالی از ذخیره و بازیابی 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()

وقتی یک tf.Module را ذخیره می‌کنید، هر ویژگی tf.Variable ، روش‌های تزئین شده با tf.function tf، و tf.Module که از طریق پیمایش بازگشتی یافت می‌شوند، ذخیره می‌شوند. (برای اطلاعات بیشتر در مورد این پیمایش بازگشتی به آموزش Checkpoint مراجعه کنید.) با این حال، هر ویژگی، توابع و داده پایتون از بین می رود. این بدان معنی است که وقتی یک tf.function ذخیره می شود، هیچ کد پایتون ذخیره نمی شود.

اگر هیچ کد پایتون ذخیره نشده باشد، SavedModel چگونه می داند که چگونه عملکرد را بازیابی کند؟

به طور خلاصه، tf.function با ردیابی کد پایتون برای تولید یک ConcreteFunction (یک پوشش قابل فراخوانی در اطراف tf.Graph ) کار می کند. وقتی یک tf.function را ذخیره می کنید، در واقع حافظه پنهان ConcreteFunctions tf.function را ذخیره می کنید.

برای کسب اطلاعات بیشتر در مورد رابطه بین tf.function و ConcreteFunctions، به راهنمای 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

بارگیری و استفاده از یک مدل سفارشی

وقتی SavedModel را در پایتون بارگذاری می‌کنید، همه ویژگی‌های tf.Variable ، روش‌های tf.function شده tf.function، و tf.Module s در همان ساختار شیء مشابه 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

از آنجایی که هیچ کد پایتون ذخیره نمی شود، فراخوانی یک tf.function با امضای ورودی جدید ناموفق خواهد بود:

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

تنظیم دقیق اولیه

اشیاء متغیر در دسترس هستند، و می توانید از طریق توابع وارد شده پشتیبان بگیرید. این برای تنظیم دقیق (یعنی بازآموزی) SavedModel در موارد ساده کافی است.

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

تنظیم دقیق عمومی

SavedModel از Keras جزئیات بیشتری را نسبت به یک __call__ ساده برای رسیدگی به موارد پیشرفته تر تنظیم دقیق ارائه می دهد. TensorFlow Hub توصیه می‌کند در صورت وجود موارد زیر را در SavedModels به اشتراک گذاشته شده به منظور تنظیم دقیق ارائه کنید:

  • اگر مدل از انصراف یا تکنیک دیگری استفاده می‌کند که در آن پاس رو به جلو بین آموزش و استنتاج متفاوت است (مانند نرمال‌سازی دسته‌ای)، روش __call__ یک آرگومان اختیاری با ارزش Python train training= می‌گیرد که پیش‌فرض روی False است اما می‌توان آن را روی True تنظیم کرد.
  • در کنار ویژگی __call__ ، ویژگی های .variable و .trainable_variable با لیست های مربوط به متغیرها وجود دارد. متغیری که در ابتدا قابل آموزش بود اما قرار است در طول تنظیم دقیق ثابت شود، از .trainable_variables حذف شده است.
  • به خاطر چارچوب‌هایی مانند Keras که تنظیم‌کننده‌های وزن را به عنوان ویژگی‌های لایه‌ها یا مدل‌های فرعی نشان می‌دهند، می‌تواند یک ویژگی .regularization_losses نیز وجود داشته باشد. فهرستی از توابع آرگومان صفر را در خود جای داده است که مقادیر آنها برای جمع کردن ضرر کل در نظر گرفته شده است.

با بازگشت به مثال اولیه MobileNet، می توانید برخی از آنها را در عمل مشاهده کنید:

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

مشخص کردن امضا در حین صادرات

ابزارهایی مانند TensorFlow Serving و saved_model_cli می توانند با SavedModels تعامل داشته باشند. برای کمک به این ابزارها در تعیین اینکه از کدام ConcreteFunctions استفاده کنید، باید امضاهای سرویس را مشخص کنید. tf.keras.Model به طور خودکار امضاهای سرویس را مشخص می کند، اما شما باید به صراحت یک امضای سرویس را برای ماژول های سفارشی ما اعلام کنید.

به طور پیش فرض، هیچ امضایی در یک tf.Module سفارشی اعلام نمی شود.

assert len(imported.signatures) == 0

برای اعلام امضای خدمت، یک ConcreteFunction را با استفاده از signatures kwarg مشخص کنید. هنگام تعیین یک امضا، کلید امضای آن 'serving_default' خواهد بود که به عنوان ثابت 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']

برای صادر کردن چندین امضا، فرهنگ لغت کلیدهای امضا را به ConcreteFunctions ارسال کنید. هر کلید امضا مربوط به یک 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']

به طور پیش فرض، نام های تانسور خروجی نسبتاً عمومی هستند، مانند output_0 . برای کنترل نام خروجی ها، tf.function خود را تغییر دهید تا فرهنگ لغتی که نام خروجی ها را به خروجی ها نگاشت می کند، بازگردانید. نام ورودی ها از نام های arg تابع پایتون گرفته شده است.

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

یک SavedModel را در C++ بارگیری کنید

نسخه C++ لودر SavedModel یک API برای بارگذاری SavedModel از یک مسیر ارائه می‌کند، در حالی که به SessionOptions و RunOptions اجازه می‌دهد. شما باید تگ های مرتبط با گراف را برای بارگذاری مشخص کنید. نسخه بارگذاری شده SavedModel به عنوان SavedModelBundle نامیده می شود و حاوی MetaGraphDef و جلسه ای است که در آن بارگذاری می شود.

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

جزئیات رابط خط فرمان SavedModel

می توانید از رابط خط فرمان SavedModel (CLI) برای بررسی و اجرای SavedModel استفاده کنید. به عنوان مثال، می توانید از CLI برای بررسی SignatureDef مدل استفاده کنید. CLI شما را قادر می سازد تا به سرعت تأیید کنید که نوع و شکل تنسور ورودی با مدل مطابقت دارد. علاوه بر این، اگر می‌خواهید مدل خود را آزمایش کنید، می‌توانید با عبور از ورودی‌های نمونه در قالب‌های مختلف (مثلاً عبارات پایتون) و سپس واکشی خروجی، از CLI برای بررسی سلامت عقل استفاده کنید.

SavedModel CLI را نصب کنید

به طور کلی، می‌توانید TensorFlow را به یکی از دو روش زیر نصب کنید:

  • با نصب یک باینری از پیش ساخته شده TensorFlow.
  • با ساختن TensorFlow از کد منبع.

اگر TensorFlow را از طریق یک باینری از پیش ساخته شده TensorFlow نصب کرده اید، SavedModel CLI قبلاً روی سیستم شما در pathname bin/saved_model_cli شده است.

اگر TensorFlow را از کد منبع ساخته اید، باید دستور اضافی زیر را برای ساخت saved_model_cli :

$ bazel build tensorflow/python/tools:saved_model_cli

مروری بر دستورات

SavedModel CLI از دو دستور زیر در SavedModel پشتیبانی می کند:

  • show ، که محاسبات موجود از یک SavedModel را نشان می دهد.
  • run ، که محاسباتی را از SavedModel اجرا می کند.

show فرمان

یک SavedModel شامل یک یا چند مدل مدل (از لحاظ فنی، v1.MetaGraphDef s) است که با مجموعه برچسب های آنها مشخص می شود. برای ارائه یک مدل، ممکن است تعجب کنید که SignatureDef در هر مدل مدل چه نوع SignatureDef است و ورودی و خروجی آنها چیست. دستور show به شما امکان می دهد محتویات SavedModel را به ترتیب سلسله مراتبی بررسی کنید. در اینجا نحو است:

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

برای مثال، دستور زیر تمام مجموعه‌های برچسب موجود در SavedModel را نشان می‌دهد:

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

دستور زیر تمام کلیدهای SignatureDef موجود برای یک مجموعه برچسب را نشان می دهد:

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

اگر چندین تگ در مجموعه تگ وجود دارد، باید همه تگ ها را مشخص کنید، هر تگ با کاما از هم جدا شود. مثلا:

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

برای نمایش تمام ورودی‌ها و خروجی‌ها TensorInfo برای یک SignatureDef خاص، کلید SignatureDef را به گزینه signature_def منتقل کنید. زمانی که می خواهید مقدار کلید تانسور، نوع d و شکل تانسورهای ورودی را برای اجرای نمودار محاسباتی بعداً بدانید، بسیار مفید است. مثلا:

$ 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

برای نمایش تمام اطلاعات موجود در SavedModel، از گزینه --all استفاده کنید. مثلا:

$ 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

برای اجرای محاسبات گراف، ورودی‌ها و سپس نمایش (و در صورت تمایل ذخیره) خروجی‌ها، دستور run را فراخوانی کنید. در اینجا نحو است:

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]

دستور run سه راه زیر را برای ارسال ورودی به مدل ارائه می دهد:

  • گزینه --inputs شما را قادر می سازد تا numpy ndarray را در فایل ها ارسال کنید.
  • گزینه --input_exprs شما را قادر می سازد عبارات پایتون را ارسال کنید.
  • گزینه --input_examples شما را قادر می سازد tf.train.Example را پاس کنید.

--inputs

برای ارسال داده های ورودی در فایل ها، گزینه --inputs را مشخص کنید که فرمت کلی زیر را دارد:

--inputs <INPUTS>

که در آن INPUTS یکی از فرمت های زیر است:

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

شما می توانید چندین ورودی را ارسال کنید. اگر چندین ورودی را ارسال می کنید، از یک نقطه ویرگول برای جدا کردن هر یک از ورودی ها استفاده کنید.

saved_model_cli از numpy.load برای بارگذاری نام فایل استفاده می کند. نام فایل ممکن است در یکی از فرمت های زیر باشد:

  • .npy
  • .npz
  • فرمت ترشی

یک فایل .npy همیشه حاوی یک ndarray numpy است. بنابراین، هنگام بارگیری از یک فایل .npy ، محتوا مستقیماً به تانسور ورودی مشخص شده اختصاص داده می شود. اگر یک variable_name را با آن فایل .npy مشخص کنید، متغیر_ name نادیده گرفته می شود و یک هشدار صادر می شود.

هنگام بارگیری از یک فایل .npz (zip)، می‌توانید به صورت اختیاری یک متغیر_name برای شناسایی متغیر درون فایل zip برای بارگیری کلید تانسور ورودی تعیین کنید. اگر متغیر_name را مشخص نکنید، SavedModel CLI بررسی می‌کند که فقط یک فایل در فایل فشرده وجود دارد و آن را برای کلید تانسور ورودی مشخص شده بارگذاری می‌کند.

هنگام بارگذاری از یک فایل pickle، اگر variable_name name در پرانتز مشخص نشده باشد، هر آنچه در داخل فایل pickle باشد به کلید تانسور ورودی مشخص شده ارسال می‌شود. در غیر این صورت، SavedModel CLI فرض می‌کند که یک فرهنگ لغت در فایل pickle ذخیره شده است و مقدار مربوط به variable_name استفاده خواهد شد.

--input_exprs

برای ارسال ورودی ها از طریق عبارات پایتون، گزینه --input_exprs را مشخص کنید. این می تواند برای زمانی مفید باشد که فایل های داده ای در اطراف ندارید، اما همچنان می خواهید مدل را با چند ورودی ساده که با نوع d و شکل SignatureDef مدل مطابقت دارد بررسی کنید. مثلا:

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

علاوه بر عبارات پایتون، می توانید توابع numpy را نیز ارسال کنید. مثلا:

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

(توجه داشته باشید که ماژول numpy از قبل به عنوان np در دسترس شماست.)

--input_examples

برای ارسال tf.train.Example به عنوان ورودی، گزینه --input_examples را مشخص کنید. برای هر کلید ورودی، فهرستی از فرهنگ لغت می‌گیرد که در آن هر دیکشنری نمونه‌ای از tf.train.Example است. کلیدهای فرهنگ لغت ویژگی ها و مقادیر لیست های ارزشی برای هر ویژگی هستند. مثلا:

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

ذخیره خروجی

به طور پیش فرض، SavedModel CLI خروجی را در stdout می نویسد. اگر دایرکتوری به گزینه --outdir ارسال شود، خروجی ها به عنوان فایل های .npy نام گذاری شده از کلیدهای تانسور خروجی در زیر پوشه داده شده ذخیره می شوند.

برای بازنویسی فایل های خروجی موجود از --overwrite استفاده کنید.