Sử dụng định dạng SavedModel

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Một SavedModel chứa một chương trình TensorFlow hoàn chỉnh, bao gồm các thông số được đào tạo (ví dụ, tf.Variable s) và tính toán. Nó không đòi hỏi mã xây dựng mô hình ban đầu để chạy, mà làm cho nó hữu ích để chia sẻ hoặc triển khai với TFLite , TensorFlow.js , TensorFlow Phục vụ , hoặc TensorFlow Hub .

Bạn có thể lưu và tải mô hình ở định dạng SavedModel bằng cách sử dụng các API sau:

Tạo SavedModel từ Keras

Để giới thiệu nhanh, phần này xuất một mô hình Keras được đào tạo trước và phục vụ các yêu cầu phân loại hình ảnh với nó. Phần còn lại của hướng dẫn sẽ điền thông tin chi tiết và thảo luận về các cách khác để tạo 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.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
73728/61306 [====================================] - 0s 0us/step

png

Bạn sẽ sử dụng hình ảnh của Grace Hopper làm ví dụ đang chạy và mô hình phân loại hình ảnh được đào tạo trước của Keras vì nó rất dễ sử dụng. Các mô hình tùy chỉnh cũng hoạt động và sẽ được đề cập chi tiết sau.

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

Dự đoán hàng đầu cho hình ảnh này là "quân phục".

mobilenet_save_path = os.path.join(tmpdir, "mobilenet/1/")
tf.saved_model.save(pretrained_model, mobilenet_save_path)
2021-09-22 20:37:56.476712: 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/tmpiq7_1gwc/mobilenet/1/assets

Pha cản phá xuất-path sau một quy ước được sử dụng bởi TensorFlow Phục vụ nơi các thành phần đường dẫn mới nhất ( 1/ đây) là một số phiên bản cho mô hình của bạn - nó cho phép các công cụ như Tensorflow Phục vụ cho lý do về sự tươi mát tương đối.

Bạn có thể nạp lại SavedModel vào Python với tf.saved_model.load và xem như thế nào hình ảnh Đô đốc Hopper được phân loại.

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

Chữ ký được nhập luôn trả về từ điển. Để tùy chỉnh tên chữ ký và các phím từ điển ra, xem Xác định chữ ký trong xuất khẩu .

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

Chạy suy luận từ SavedModel cho kết quả giống như mô hình ban đầu.

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

Chạy một mô hình đã lưu trong TensorFlow phục vụ

SavedModels có thể sử dụng được từ Python (thông tin thêm về điều đó bên dưới), nhưng các môi trường sản xuất thường sử dụng một dịch vụ chuyên dụng để suy luận mà không cần chạy mã Python. Điều này dễ dàng thiết lập từ SavedModel bằng cách sử dụng TensorFlow Serving.

Xem TensorFlow Phục vụ REST của hướng dẫn cho một end-to-end tensorflow phục vụ chẳng hạn.

Định dạng SavedModel trên đĩa

SavedModel là một thư mục chứa các chữ ký được tuần tự hóa và trạng thái cần thiết để chạy chúng, bao gồm các giá trị biến và từ vựng.

ls {mobilenet_save_path}
assets  saved_model.pb  variables

Các saved_model.pb cửa hàng tập tin chương trình thực tế TensorFlow, hoặc mô hình, và một tập hợp các chữ ký tên, từng xác định một chức năng chấp nhận đầu vào tensor và sản xuất tensor đầu ra.

SavedModels có thể chứa nhiều biến thể của mô hình (nhiều v1.MetaGraphDefs , xác định với --tag_set cờ để saved_model_cli ), nhưng điều này là hiếm. API mà tạo nhiều biến thể của một mô hình bao gồm tf.Estimator.experimental_export_all_saved_models và trong 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"

Các variables thư mục chứa một trạm kiểm soát đào tạo tiêu chuẩn (xem hướng dẫn để các điểm kiểm tra đào tạo ).

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

Các assets thư mục chứa các tập tin được sử dụng bởi các đồ thị TensorFlow, cho các tập tin văn bản ví dụ sử dụng để khởi bảng từ vựng. Nó không được sử dụng trong ví dụ này.

SavedModels có thể có một assets.extra thư mục cho bất kỳ tập tin không được sử dụng bởi các đồ thị TensorFlow, ví dụ thông tin cho người tiêu dùng về những gì để làm với các SavedModel. Bản thân TensorFlow không sử dụng thư mục này.

Lưu một mô hình tùy chỉnh

tf.saved_model.save tiết kiệm hỗ trợ tf.Module đối tượng và lớp con của nó, giống như tf.keras.Layertf.keras.Model .

Hãy nhìn vào một ví dụ về tiết kiệm và khôi phục một 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()

Khi bạn tiết kiệm một tf.Module , bất kỳ tf.Variable thuộc tính, tf.function -decorated phương pháp, và tf.Module s tìm thấy qua traversal đệ quy được lưu. (Xem hướng dẫn Checkpoint để biết thêm về traversal đệ quy này.) Tuy nhiên, bất kỳ Python thuộc tính, chức năng, và các dữ liệu bị mất. Điều này có nghĩa rằng khi một tf.function được lưu, không có mã Python được lưu.

Nếu không có mã Python nào được lưu, làm thế nào SavedModel biết cách khôi phục chức năng?

Tóm lại, tf.function hoạt động bằng cách truy tìm các mã Python để tạo ra một ConcreteFunction (một Callable Wrapper xung quanh tf.Graph ). Khi lưu một tf.function , bạn đang thực sự tiết kiệm tf.function bộ nhớ cache của các ConcreteFunctions.

Để tìm hiểu thêm về mối quan hệ giữa tf.function và ConcreteFunctions, vui lòng xem hướng dẫn 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/tmpiq7_1gwc/module_no_signatures/assets

Đang tải và sử dụng mô hình tùy chỉnh

Khi bạn tải một SavedModel bằng Python, tất cả tf.Variable thuộc tính, tf.function -decorated phương pháp, và tf.Module s được khôi phục trong cơ cấu đối tượng giống như bản gốc lưu 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

Bởi vì không có mã Python được lưu, gọi một tf.function với một chữ ký đầu vào mới sẽ thất bại:

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

Tinh chỉnh cơ bản

Các đối tượng có thể thay đổi có sẵn và bạn có thể sao chép lại thông qua các hàm đã nhập. Như vậy là đủ để tinh chỉnh (tức là đào tạo lại) một SavedModel trong các trường hợp đơn giản.

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

Tinh chỉnh chung

Một SavedModel từ Keras cung cấp thêm chi tiết hơn một đồng bằng __call__ để giải quyết trường hợp tiên tiến hơn của tinh chỉnh. TensorFlow Hub khuyên bạn nên cung cấp những thông tin sau, nếu có, trong SavedModels được chia sẻ với mục đích tinh chỉnh:

  • Nếu việc sử dụng mô hình bỏ học hoặc kỹ thuật khác, trong đó đèo khác về phía trước giữa đào tạo và suy luận (như bình thường batch), các __call__ phương pháp có một tùy chọn, Python có giá trị training= lập luận rằng mặc định là False nhưng có thể được thiết lập để True .
  • Bên cạnh __call__ thuộc tính, có .variable.trainable_variable thuộc tính với các danh mục tương ứng của các biến. Một biến mà ban đầu được khả năng huấn luyện nhưng có nghĩa là để được đông lạnh trong tinh chỉnh được bỏ qua từ .trainable_variables .
  • Vì lợi ích của các khuôn khổ như Keras đại diện regularizers cân như các thuộc tính của các lớp hoặc sub-mô hình, cũng có thể là một .regularization_losses thuộc tính. Nó chứa một danh sách các hàm không đối số có giá trị được dùng để cộng vào tổng tổn thất.

Quay lại ví dụ MobileNet ban đầu, bạn có thể thấy một số trong số đó đang hoạt động:

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

Chỉ định chữ ký trong quá trình xuất

Các công cụ như TensorFlow Phục vụ và saved_model_cli thể tương tác với SavedModels. Để giúp các công cụ này xác định ConcreteFunctions nào sẽ sử dụng, bạn cần chỉ định chữ ký phục vụ. tf.keras.Model s tự động chỉ định phục vụ chữ ký, nhưng bạn sẽ phải khai báo rõ ràng một chữ ký phục vụ cho các module tùy chỉnh của chúng tôi.

Theo mặc định, không có chữ ký được khai báo trong một tùy chỉnh tf.Module .

assert len(imported.signatures) == 0

Để khai báo một chữ ký phục vụ, chỉ định một ConcreteFunction bằng cách sử dụng signatures kwarg. Khi xác định một chữ ký duy nhất, chính chữ ký của nó sẽ là 'serving_default' , được lưu lại dưới dạng hằng số 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/tmpiq7_1gwc/module_with_signature/assets
imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())
['serving_default']

Để xuất nhiều chữ ký, hãy chuyển một từ điển các khóa chữ ký cho ConcreteFunctions. Mỗi khóa chữ ký tương ứng với một 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/tmpiq7_1gwc/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']

Theo mặc định, tên đầu ra tensor là khá chung chung, như output_0 . Để kiểm soát tên của kết quả đầu ra, sửa đổi của bạn tf.function trở về một cuốn từ điển mà các bản đồ tên đầu ra để đầu ra. Tên của các đầu vào có nguồn gốc từ các tên đối số của hàm Python.

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

Tải SavedModel trong C ++

Các ++ phiên bản C của SavedModel nạp cung cấp một API để tải một SavedModel từ một con đường, trong khi cho phép SessionOptions và RunOptions. Bạn phải chỉ định các thẻ được liên kết với biểu đồ sẽ được tải. Phiên bản đã tải của SavedModel được gọi là SavedModelBundle và chứa MetaGraphDef và phiên trong đó nó được tải.

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

Chi tiết về giao diện dòng lệnh SavedModel

Bạn có thể sử dụng Giao diện dòng lệnh SavedModel (CLI) để kiểm tra và thực thi SavedModel. Ví dụ, bạn có thể sử dụng CLI để kiểm tra của mô hình SignatureDef s. CLI cho phép bạn nhanh chóng xác nhận rằng loại và hình dạng Tensor đầu vào khớp với mô hình. Hơn nữa, nếu bạn muốn kiểm tra mô hình của mình, bạn có thể sử dụng CLI để kiểm tra độ tỉnh táo bằng cách chuyển các đầu vào mẫu ở các định dạng khác nhau (ví dụ: biểu thức Python) và sau đó tìm nạp đầu ra.

Cài đặt CLI SavedModel

Nói chung, bạn có thể cài đặt TensorFlow theo một trong hai cách sau:

  • Bằng cách cài đặt tệp nhị phân TensorFlow được tạo sẵn.
  • Bằng cách xây dựng TensorFlow từ mã nguồn.

Nếu bạn cài đặt TensorFlow qua một pre-built TensorFlow nhị phân, thì SavedModel CLI đã được cài đặt trên hệ thống của bạn tại tên đường dẫn bin/saved_model_cli .

Nếu bạn xây dựng TensorFlow từ mã nguồn, bạn phải chạy lệnh bổ sung sau đây để xây dựng saved_model_cli :

$ bazel build tensorflow/python/tools:saved_model_cli

Tổng quan về các lệnh

SavedModel CLI hỗ trợ hai lệnh sau trên SavedModel:

  • show , trong đó cho thấy tính toán có sẵn từ một SavedModel.
  • run , mà chạy một tính toán từ một SavedModel.

show lệnh

Một SavedModel chứa một hoặc nhiều biến thể mô hình (về mặt kỹ thuật, v1.MetaGraphDef s), xác định bởi tag-bộ của họ. Để phục vụ người mẫu, bạn có thể tự hỏi loại SignatureDef s trong mỗi biến thể mô hình, và các đầu vào và đầu ra của họ là gì. Các show lệnh cho phép bạn kiểm tra các nội dung của SavedModel trong thứ bậc. Đây là cú pháp:

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

Ví dụ: lệnh sau hiển thị tất cả các bộ thẻ có sẵn trong SavedModel:

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

Lệnh show sau tất cả có sẵn SignatureDef phím cho một bộ thẻ:

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

Nếu có nhiều thẻ trong thẻ-set, bạn phải xác định tất cả các thẻ, mỗi thẻ phân cách bằng dấu phẩy. Ví dụ:

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

Để hiển thị tất cả các đầu vào và đầu ra TensorInfo cho một cụ thể SignatureDef , vượt qua trong SignatureDef chìa khóa để signature_def tùy chọn. Điều này rất hữu ích khi bạn muốn biết giá trị khóa tensor, loại dtype và hình dạng của tensor đầu vào để thực hiện đồ thị tính toán sau này. Ví 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

Để hiển thị tất cả các thông tin có sẵn trong SavedModel, sử dụng --all tùy chọn. Ví dụ:

$ 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 lệnh

Gọi các run lệnh để chạy một tính toán đồ thị, đi qua các đầu vào và sau đó hiển thị (và tùy chọn tiết kiệm) các kết quả đầu ra. Đây là cú pháp:

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]

Các run lệnh cung cấp ba cách sau đây để vượt qua đầu vào cho các mô hình:

  • --inputs tùy chọn cho phép bạn vượt qua ndarray NumPy trong các tập tin.
  • --input_exprs tùy chọn cho phép bạn vượt qua biểu Python.
  • --input_examples tùy chọn cho phép bạn vượt qua tf.train.Example .

--inputs

Để truyền dữ liệu đầu vào trong các tập tin, xác định --inputs tùy chọn, trong đó có định dạng chung sau đây:

--inputs <INPUTS>

nơi ĐẦU VÀO là một trong các định dạng sau:

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

Bạn có thể vượt qua nhiều đầu vào. Nếu bạn làm vượt qua nhiều đầu vào, sử dụng dấu chấm phẩy để tách từng ĐẦU VÀO.

saved_model_cli sử dụng numpy.load để nạp tên tập tin. Tên file có thể nằm trong bất kỳ các định dạng sau:

  • .npy
  • .npz
  • định dạng dưa chua

Một .npy tập tin luôn luôn chứa một ndarray NumPy. Do đó, khi tải từ một .npy tập tin, nội dung sẽ được chỉ định trực tiếp đến tensor đầu vào quy định. Nếu bạn chỉ định một variable_name với điều đó .npy tập tin, các variable_name sẽ bị bỏ qua và cảnh báo sẽ được phát hành.

Khi tải từ một .npz file (zip), bạn có thể tùy chọn chỉ định một variable_name để xác định các biến bên trong file zip để tải cho phím tensor đầu vào. Nếu bạn không chỉ định một variable_name, các SavedModel CLI sẽ kiểm tra rằng chỉ có một tập tin được bao gồm trong các tập tin zip và tải nó cho phím tensor đầu vào quy định.

Khi tải từ một tập tin dưa, nếu không có variable_name được quy định trong dấu ngoặc vuông, bất kể đó là bên trong file dưa sẽ được chuyển đến phím tensor đầu vào theo quy định. Nếu không, SavedModel CLI sẽ cho rằng một cuốn từ điển được lưu trữ trong file dưa và giá trị tương ứng với variable_name sẽ được sử dụng.

--input_exprs

Để vượt qua đầu vào thông qua biểu Python, xác định --input_exprs tùy chọn. Điều này có thể hữu ích cho khi bạn không có tập tin dữ liệu nằm xung quanh, nhưng vẫn muốn sự tỉnh táo kiểm tra các mô hình với một số đầu vào đơn giản phù hợp với dtype và hình dạng của mô hình của SignatureDef s. Ví dụ:

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

Ngoài các biểu thức Python, bạn cũng có thể chuyển các hàm numpy. Ví dụ:

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

(Lưu ý rằng numpy mô-đun đã có sẵn cho bạn khi np .)

--input_examples

Để vượt qua tf.train.Example như đầu vào, xác định --input_examples tùy chọn. Đối với mỗi phím đầu vào, phải mất một danh sách các từ điển, trong đó mỗi từ điển là một thể hiện của tf.train.Example . Các khóa từ điển là các tính năng và các giá trị là danh sách giá trị cho mỗi tính năng. Ví dụ:

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

Lưu đầu ra

Theo mặc định, SavedModel CLI ghi đầu ra vào stdout. Nếu một thư mục sẽ được chuyển cho --outdir tùy chọn, kết quả đầu ra sẽ được lưu dưới .npy tập tin có tên sau phím đầu ra tensor dưới thư mục nhất định.

Sử dụng --overwrite ghi đè lên tập tin đầu ra đang tồn tại.