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

SavedModel chứa một chương trình TensorFlow hoàn chỉnh, bao gồm các tham số được đào tạo (ví dụ: tf.Variable s) và tính toán. Nó không yêu cầu mã xây dựng mô hình gốc để chạy, điều này làm cho nó hữu ích cho việc chia sẻ hoặc triển khai với TFLite , TensorFlow.js , TensorFlow Serving 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.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

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

Đường dẫn lưu tuân theo một quy ước được TensorFlow Serving sử dụng trong đó thành phần đường dẫn cuối cùng ( 1/ here) là số phiên bản cho mô hình của bạn - nó cho phép các công cụ như Tensorflow Serving giải thích về độ mới tương đối.

Bạn có thể tải SavedModel trở lại Python bằng tf.saved_model.load và xem hình ảnh của Đô đốc Hopper được phân loại như thế nào.

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à khóa từ điển xuất, hãy xem Chỉ định chữ ký trong khi xuất .

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ô hình đã lưu trong phục vụ TensorFlow

SavedModels có thể sử dụng được từ Python (thông tin thêm về điều đó bên dưới), nhưng 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 hướng dẫn REST phục vụ TensorFlow để biết ví dụ về phân phối luồng căng thẳng từ đầu đến cuối.

Đị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

Tệp saved_model.pb lưu trữ chương trình hoặc mô hình TensorFlow thực tế và một tập hợp các chữ ký được đặt tên, mỗi chữ ký xác định một hàm chấp nhận đầu vào tensor và tạo ra đầu ra tensor.

SavedModels có thể chứa nhiều biến thể của mô hình (nhiều v1.MetaGraphDefs , được xác định bằng cờ --tag_set thành saved_model_cli ), nhưng điều này hiếm khi xảy ra. Các API 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"

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

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

Thư mục nội assets chứa các tệp được sử dụng bởi biểu đồ TensorFlow, ví dụ: tệp văn bản được sử dụng để khởi tạo bảng từ vựng. Nó không được sử dụng trong ví dụ này.

SavedModels có thể có thư assets.extra cho bất kỳ tệp nào không được biểu đồ TensorFlow sử dụng, chẳng hạn như thông tin cho người tiêu dùng về những việc cần làm với 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 hỗ trợ lưu các đối tượng tf.Module và các lớp con của nó, như tf.keras.Layertf.keras.Model .

Hãy xem một ví dụ về lưu 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 lưu một tf.Module , mọi thuộc tính tf.Variable , phương thức tf. tf.function -decorated và tf.Module được tìm thấy thông qua duyệt đệ quy đều được lưu. (Xem hướng dẫn Checkpoint để biết thêm về phương thức duyệt đệ quy này.) Tuy nhiên, mọi thuộc tính, hàm và dữ liệu Python đều bị mất. Điều này có nghĩa là khi một tf.function được lưu, không có mã Python nào đượ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 . function hoạt động bằng cách truy tìm mã Python để tạo ra ConcreteFunction (một trình bao bọc có thể gọi xung quanh tf.Graph ). Khi lưu một tf.function . Chức năng, bạn đang thực sự lưu vào bộ nhớ cache của ConcreteFunctions của tf.function . Chức năng.

Để tìm hiểu thêm về mối quan hệ giữa tf.function và ConcreteFunctions, hãy xem hướng dẫn về chức năng của 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

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

Khi bạn tải SavedModel bằng Python, tất cả các thuộc tính tf.Variable , phương thức tf. tf.function -decorated và tf.Module s được khôi phục trong cùng một cấu trúc đối tượng như tf.Module đã lưu ban đầu.

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

Vì không có mã Python nào được lưu nên việc gọi hàm tf.function bằng chữ ký đầu vào mới sẽ không thành công:

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

SavedModel từ Keras cung cấp nhiều chi tiết hơn một __call__ đơn thuần để giải quyết các trường hợp tinh chỉnh nâng cao hơn. 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 mô hình sử dụng tính năng bỏ qua hoặc một kỹ thuật khác trong đó chuyển tiếp khác nhau giữa đào tạo và suy luận (như chuẩn hóa hàng loạt), phương thức __call__ nhận đối số training= giá trị Python, tùy chọn, mặc định là False nhưng có thể được đặt thành True .
  • Bên cạnh thuộc tính __call__ , có các thuộc tính .variable.trainable_variable với danh sách các biến tương ứng. Một biến ban đầu có thể đào tạo nhưng có nghĩa là bị đóng băng trong quá trình tinh chỉnh sẽ bị bỏ qua khỏi .trainable_variables .
  • Vì lợi ích của các khuôn khổ như Keras đại diện cho các bộ điều chỉnh trọng số dưới dạng thuộc tính của các lớp hoặc mô hình con, cũng có thể có một thuộc tính .regularization_losses . 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 Serving và saved_model_cli có 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 chữ ký phục vụ, nhưng bạn sẽ phải khai báo rõ ràng chữ ký phục vụ cho các mô-đun tùy chỉnh của chúng tôi.

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

assert len(imported.signatures) == 0

Để khai báo một chữ ký phục vụ, hãy chỉ định một ConcreteFunction bằng cách sử dụng các signatures kwarg. Khi chỉ định một chữ ký, khóa chữ ký của nó sẽ là 'serving_default' , được lưu 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/tmpbf9fpzwt/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/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']

Theo mặc định, tên tensor đầu ra khá chung chung, như output_0 . Để kiểm soát tên của các kết quả đầu ra, hãy sửa đổi tf.function của bạn để trả về một từ điển ánh xạ các tên đầu ra cho các kết quả đầu ra. Tên của các đầu vào được lấy 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/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')}

Tải SavedModel trong C ++

Phiên bản C ++ của trình tải SavedModel cung cấp một API để tải SavedModel từ một đường dẫn, đồng thời 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 SignatureDef của mô hình. 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 thông qua tệp nhị phân TensorFlow được tạo sẵn, thì SavedModel CLI đã được cài đặt trên hệ thống của bạn tại pathname bin/saved_model_cli .

Nếu bạn đã tạo TensorFlow từ mã nguồn, bạn phải chạy lệnh bổ sung sau để 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 , hiển thị các tính toán có sẵn từ SavedModel.
  • run , chạy tính toán từ SavedModel.

show lệnh

SavedModel chứa một hoặc nhiều biến thể mô hình (về mặt kỹ thuật, v1.MetaGraphDef s), được xác định bởi bộ thẻ của chúng. Để phục vụ một mô hình, bạn có thể tự hỏi loại SignatureDef trong mỗi biến thể mô hình là gì và đầu vào và đầu ra của chúng là gì. Lệnh show cho phép bạn kiểm tra nội dung của SavedModel theo thứ tự phân cấp. Đâ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 sau đây hiển thị tất cả các khóa SignatureDef có sẵn cho một tập hợp 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 tập hợp thẻ, bạn phải chỉ định tất cả các thẻ, mỗi thẻ được phân tá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 SignatureDef cụ thể, hãy chuyển khóa SignatureDef vào tùy chọn signature_def . Đ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ả thông tin có sẵn trong SavedModel, hãy sử dụng tùy chọn --all . 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

lệnh run

Gọi lệnh run để chạy tính toán đồ thị, chuyển các đầu vào và sau đó hiển thị (và lưu tùy chọn) 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]

Lệnh run cung cấp ba cách sau để chuyển đầu vào cho mô hình:

  • Tùy chọn --inputs cho phép bạn truyền ndarray numpy trong các tệp.
  • Tùy chọn --input_exprs cho phép bạn chuyển các biểu thức Python.
  • --input_examples option cho phép bạn chuyển tf.train.Example .

--inputs

Để chuyển dữ liệu đầu vào trong tệp, hãy chỉ định tùy chọn --inputs , có định dạng chung sau:

--inputs <INPUTS>

trong đó INPUTS 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 chuyển nhiều đầu vào, hãy sử dụng dấu chấm phẩy để phân tách từng đầu vào .

saved_model_cli sử dụng numpy.load để tải tên tệp . Tên tệp có thể ở bất kỳ định dạng nào sau đây:

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

.npy luôn chứa một ndarray numpy. Do đó, khi tải từ tệp .npy , nội dung sẽ được gán trực tiếp cho tensor đầu vào được chỉ định. Nếu bạn chỉ định tên_biến với tệp .npy đó, tên_biến sẽ bị bỏ qua và cảnh báo sẽ được đưa ra.

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

Khi tải từ một tệp pickle, nếu không có variable_name nào được chỉ định trong dấu ngoặc vuông, thì bất kỳ thứ gì bên trong tệp pickle sẽ được chuyển đến khóa tensor đầu vào được chỉ định. Nếu không, SavedModel CLI sẽ giả sử một từ điển được lưu trong tệp pickle và giá trị tương ứng với tên_biến sẽ được sử dụng.

--input_exprs

Để chuyển đầu vào thông qua các biểu thức Python, hãy chỉ định tùy chọn --input_exprs . Điều này có thể hữu ích khi bạn không có tệp dữ liệu nằm xung quanh, nhưng vẫn muốn kiểm tra mô hình một cách tỉnh táo bằng một số đầu vào đơn giản phù hợp với loại và hình dạng của SignatureDef của mô hình. 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 mô-đun numpy đã có sẵn cho bạn dưới dạng np .)

--input_examples

Để chuyển tf.train.Example làm đầu vào, hãy chỉ định tùy chọn --input_examples . Đối với mỗi khóa nhập, cần có một danh sách 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 được chuyển đến tùy chọn --outdir , các kết quả đầu ra sẽ được lưu dưới dạng tệp .npy được đặt tên theo các khóa tensor đầu ra trong thư mục nhất định.

Sử dụng --overwrite để ghi đè lên các tệp đầu ra hiện có.