باستخدام تنسيق SavedModel

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

يحتوي SavedModel على برنامج TensorFlow كامل ، بما في ذلك المعلمات المدربة (على سبيل المثال ، tf.Variable ) والحساب. لا يتطلب تشغيل كود بناء النموذج الأصلي ، مما يجعله مفيدًا للمشاركة أو النشر مع TFLite أو TensorFlow.js أو TensorFlow Serving أو TensorFlow Hub .

يمكنك حفظ وتحميل نموذج بتنسيق 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

بي إن جي

ستستخدم صورة 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__ تأخذ تدريبًا اختياريًا بقيمة Python training= وسيطة افتراضية على 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 للكتابة فوق ملفات الإخراج الموجودة.