مشاهده در TensorFlow.org | در Google Colab اجرا شود | مشاهده منبع در GitHub | دانلود دفترچه یادداشت |
یک SavedModel شامل یک برنامه کامل TensorFlow، شامل پارامترهای آموزش دیده (یعنی tf.Variable
s) و محاسبات است. برای اجرا به کد ساخت مدل اصلی نیازی ندارد، که آن را برای اشتراکگذاری یا استقرار با TFLite ، TensorFlow.js ، TensorFlow Serving یا TensorFlow Hub مفید میکند.
با استفاده از API های زیر می توانید یک مدل را در قالب SavedModel ذخیره و بارگذاری کنید:
- API سطح پایین
tf.saved_model
. این سند نحوه استفاده از این API را به تفصیل شرح می دهد.- ذخیره:
tf.saved_model.save(model, path_to_dir)
- بارگذاری:
model = tf.saved_model.load(path_to_dir)
- ذخیره:
- سطح بالا
tf.keras.Model
API. به راهنمای ذخیره و سریال keras مراجعه کنید. - اگر فقط می خواهید وزنه ها را در طول تمرین ذخیره یا بارگذاری کنید، به راهنمای پست های بازرسی مراجعه کنید.
ایجاد 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
شما از تصویر گریس هاپر به عنوان نمونه در حال اجرا و یک مدل طبقه بندی تصویر از پیش آموزش دیده 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 traintraining=
میگیرد که پیشفرض روی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
استفاده کنید.