عرض على TensorFlow.org | تشغيل في Google Colab | عرض المصدر على جيثب | تحميل دفتر |
يحتوي SavedModel على برنامج TensorFlow كامل ، بما في ذلك المعلمات المدربة (على سبيل المثال ، tf.Variable
) والحساب. لا يتطلب تشغيل كود بناء النموذج الأصلي ، مما يجعله مفيدًا للمشاركة أو النشر مع TFLite أو TensorFlow.js أو TensorFlow Serving أو TensorFlow Hub .
يمكنك حفظ وتحميل نموذج بتنسيق SavedModel باستخدام واجهات برمجة التطبيقات التالية:
- واجهة برمجة تطبيقات
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 . - إذا كنت تريد فقط حفظ / تحميل الأوزان أثناء التدريب ، فراجع دليل نقاط التفتيش .
إنشاء نموذج محفوظ من 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
ستستخدم صورة Grace Hopper كمثال قيد التشغيل ، ونموذج تصنيف صور 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 إلى Python باستخدام 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
يمكن استخدام SavedModels من Python (المزيد عن ذلك أدناه) ، ولكن بيئات الإنتاج عادةً ما تستخدم خدمة مخصصة للاستدلال دون تشغيل كود Python. هذا سهل الإعداد من SavedModel باستخدام خدمة TensorFlow.
راجع البرنامج التعليمي TensorFlow Serving REST للحصول على مثال لخدمة tensorflow من طرف إلى طرف.
تنسيق SavedModel على القرص
SavedModel هو دليل يحتوي على التوقيعات المتسلسلة والحالة اللازمة لتشغيلها ، بما في ذلك القيم المتغيرة والمفردات.
ls {mobilenet_save_path}
assets saved_model.pb variables
يخزن ملف saved_model.pb
برنامج أو نموذج TensorFlow الفعلي ومجموعة من التواقيع المسماة ، كل منها يحدد وظيفة تقبل مدخلات الموتر وتنتج مخرجات موتر.
قد تحتوي SavedModels على متغيرات متعددة للنموذج (متعددة v1.MetaGraphDefs
، محددة --tag_set
to saved_model_cli
) ، لكن هذا نادر. تتضمن واجهات برمجة التطبيقات التي تنشئ متغيرات متعددة للنموذج 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 ، على سبيل المثال الملفات النصية المستخدمة لتهيئة جداول المفردات. لم يتم استخدامه في هذا المثال.
قد يكون لدى assets.extra
دليل أصول. 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
-decorated و tf.Module
s الموجودة عبر الاجتياز العودي. (راجع البرنامج التعليمي Checkpoint لمزيد من المعلومات حول هذا الاجتياز العودي.) ومع ذلك ، يتم فقد أي سمات ووظائف وبيانات Python. هذا يعني أنه عندما يتم حفظ tf.function
، لا يتم حفظ أي كود Python.
إذا لم يتم حفظ رمز Python ، فكيف يعرف SavedModel كيفية استعادة الوظيفة؟
باختصار ، تعمل tf.function
عن طريق تتبع كود Python لإنشاء وظيفة Concrete (غلاف قابل للاستدعاء حول tf.Graph
). عند حفظ tf.function
، فأنت تقوم بالفعل بحفظ ذاكرة التخزين المؤقت tf.function
الخاصة بالوظائف الخرسانية.
لمعرفة المزيد حول العلاقة بين tf.function
و ConcreteFunctions ، راجع دليل الدالة tf .
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 في Python ، تتم استعادة جميع سمات tf.Variable
وطرق tf.function
-decorated و 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
نظرًا لعدم حفظ رمز Python ، سيفشل استدعاء 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__
تأخذ تدريبًا اختياريًا بقيمة Pythontraining=
وسيطة افتراضية علىFalse
ولكن يمكن تعيينها علىTrue
. - بجانب السمة
__call__
، هناك سمات.variable
قابلة.trainable_variable
مع قوائم المتغيرات المقابلة. يتم حذف المتغير الذي كان قابلاً للتدريب في الأصل ولكن من المفترض تجميده أثناء الضبط الدقيق من.trainable_variables
. - من أجل أطر عمل مثل
.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 و saved_model_cli
التفاعل مع SavedModels. لمساعدة هذه الأدوات في تحديد الوظائف الخرسانية التي يجب استخدامها ، تحتاج إلى تحديد توقيعات الخدمة. tf.keras.Model
تواقيع الخدمة تلقائيًا ، ولكن سيتعين عليك الإعلان صراحةً عن توقيع خدمة لوحداتنا المخصصة.
بشكل افتراضي ، لا يتم التصريح عن أي توقيعات في وحدة tf.Module
المخصصة.
assert len(imported.signatures) == 0
للإعلان عن توقيع تقديم ، حدد وظيفة ConcreteFunction باستخدام kwarg signatures
. عند تحديد توقيع واحد ، سيكون مفتاح التوقيع الخاص به هو '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. يتوافق كل مفتاح توقيع مع وظيفة ملموسة واحدة.
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
لإرجاع قاموس يقوم بتعيين أسماء المخرجات للمخرجات. يتم اشتقاق أسماء المدخلات من أسماء حجج دالة بايثون.
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 واجهة برمجة تطبيقات لتحميل 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 من التأكيد بسرعة على تطابق نوع الإدخال والشكل من Tensor مع النموذج. علاوة على ذلك ، إذا كنت ترغب في اختبار نموذجك ، فيمكنك استخدام CLI لإجراء فحص سلامة من خلال تمرير عينة من المدخلات بتنسيقات مختلفة (على سبيل المثال ، تعبيرات Python) ثم جلب المخرجات.
قم بتثبيت SavedModel CLI
بشكل عام ، يمكنك تثبيت TensorFlow بإحدى الطريقتين التاليتين:
- عن طريق تثبيت برنامج TensorFlow الثنائي المبني مسبقًا.
- من خلال بناء TensorFlow من التعليمات البرمجية المصدر.
إذا قمت بتثبيت TensorFlow من خلال برنامج TensorFlow الثنائي المبني مسبقًا ، فسيتم تثبيت SavedModel CLI بالفعل على نظامك في 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
الموجودة في كل متغير نموذج ، وما هي مدخلاتها ومخرجاتها. يتيح لك الأمر 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
. يعد هذا مفيدًا جدًا عندما تريد معرفة قيمة مفتاح الموتر ونوع وشكل موتر الإدخال لتنفيذ الرسم البياني للحساب لاحقًا. فمثلا:
$ 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
دائمًا على numpy ndarray. لذلك ، عند التحميل من ملف .npy
، سيتم تعيين المحتوى مباشرة إلى موتر الإدخال المحدد. إذا حددت اسمًا متغيرًا باستخدام ملف .npy
هذا ، فسيتم تجاهل اسم المتغير وسيتم إصدار تحذير.
عند التحميل من ملف .npz
(مضغوط) ، يمكنك اختياريا تحديد اسم متغير لتحديد المتغير داخل ملف مضغوط للتحميل لمفتاح موتر الإدخال. إذا لم تحدد اسمًا متغيرًا ، فسيقوم SavedModel CLI بالتحقق من تضمين ملف واحد فقط في ملف zip وتحميله لمفتاح موتر الإدخال المحدد.
عند التحميل من ملف pickle ، إذا لم يتم تحديد اسم variable_name
في الأقواس المربعة ، فسيتم تمرير كل ما هو داخل ملف Pickle إلى مفتاح موتر الإدخال المحدد. خلاف ذلك ، سيفترض SavedModel CLI أنه تم تخزين قاموس في ملف pickle وسيتم استخدام القيمة المقابلة لـ variable_name .
--input_exprs
لتمرير المدخلات من خلال تعبيرات Python ، حدد الخيار --input_exprs
. يمكن أن يكون هذا مفيدًا عندما لا يكون لديك ملفات بيانات موجودة ، ولكنك لا تزال تريد التحقق من صحة النموذج ببعض المدخلات البسيطة التي تتطابق مع نوع وشكل SignatureDef
s الخاص بالنموذج. فمثلا:
`<input_key>=[[1],[2],[3]]`
بالإضافة إلى تعبيرات Python ، يمكنك أيضًا تمرير وظائف 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
للكتابة فوق ملفات الإخراج الموجودة.