ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

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

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

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

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

بي إن جي

ستستخدم صورة 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

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
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)
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/tmps13igs50/mobilenet/1/assets

يتبع مسار الحفظ اصطلاحًا مستخدمًا بواسطة خدمة TensorFlow حيث يكون مكون المسار الأخير ( 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
2020-12-10 02:22:25.726807: 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"

يحتوي دليل variables على نقطة تفتيش قياسية للتدريب (انظر دليل نقاط تفتيش التدريب ).

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

يحتوي دليل assets على الملفات المستخدمة بواسطة الرسم البياني TensorFlow ، على سبيل المثال الملفات النصية المستخدمة لتهيئة جداول المفردات. لم يتم استخدامه في هذا المثال.

قد يكون لدى assets.extra دليل 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 -decorated الأساليب، و tf.Module يتم حفظ الصورة وجدت عبر اجتياز العودية. (راجع البرنامج التعليمي Checkpoint لمزيد من المعلومات حول هذا الاجتياز العودي.) ومع ذلك ، يتم فقد أي من سمات ووظائف وبيانات Python. هذا يعني أنه عند حفظ tf.function ، لا يتم حفظ أي كود من رموز Python.

إذا لم يتم حفظ كود Python ، فكيف يعرف SavedModel كيفية استعادة الوظيفة؟

باختصار ، تعمل tf.function عن طريق تتبع كود Python لإنشاء وظيفة Concrete (غلاف قابل للاستدعاء حول tf.Graph ). عند حفظ tf.function ، فأنت تقوم بالفعل بحفظ ذاكرة التخزين المؤقت 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/tmps13igs50/module_no_signatures/assets

تحميل واستخدام نموذج مخصص

عند تحميل SavedModel في Python ، tf.Variable جميع سمات tf.function وطرق tf.Module و 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 استدعاء 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 من .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 و saved_model_cli التفاعل مع SavedModels. لمساعدة هذه الأدوات في تحديد وظائف Concrete التي يجب استخدامها ، تحتاج إلى تحديد توقيعات الخدمة. tf.keras.Model تواقيع الخدمة تلقائيًا ، ولكن سيتعين عليك الإعلان صراحةً عن توقيع 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/tmps13igs50/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/tmps13igs50/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/tmps13igs50/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 ملف .npy دائمًا على numpy ndarray. لذلك ، عند التحميل من ملف .npy ، سيتم تعيين المحتوى مباشرة إلى موتر الإدخال المحدد. إذا حددت اسمًا متغيرًا باستخدام ملف .npy هذا ، فسيتم تجاهل اسم المتغير وسيتم إصدار تحذير.

عند التحميل من ملف .npz (مضغوط) ، يمكنك تحديد اسم متغير اختياريًا لتحديد المتغير داخل الملف المضغوط ليتم تحميله لمفتاح موتر الإدخال. إذا لم تحدد اسمًا متغيرًا ، فسيقوم SavedModel CLI بالتحقق من تضمين ملف واحد فقط في الملف المضغوط وتحميله لمفتاح موتر الإدخال المحدد.

عند التحميل من ملف 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 كملفات .npy مسماة بعد مفاتيح موتر الإخراج ضمن الدليل المحدد.

استخدم --overwrite للكتابة فوق ملفات الإخراج الموجودة.