このページは Cloud Translation API によって翻訳されました。
Switch to English

SavedModel形式の使用

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示ノートブックをダウンロード

SavedModelには、重みと計算を含む完全なTensorFlowプログラムが含まれています。元のモデル構築コードを実行する必要がないため、共有またはデプロイに役立ちます( TFLiteTensorFlow.jsTensorFlow Serving 、またはTensorFlow Hubを使用)。

このドキュメントでは、低レベルのtf.saved_model使用方法の詳細について詳しく説明します。

KerasからSavedModelを作成する

簡単に紹介するために、このセクションでは、事前にトレーニングされたKerasモデルをエクスポートし、それを使用して画像分類リクエストを処理します。ガイドの残りの部分では、詳細を入力し、SavedModelを作成する他の方法について説明します。

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

png

実行例としてGraceHopperの画像を使用し、使いやすいため、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 [==============================] - 1s 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/tmpqrbxtm18/mobilenet/1/assets

保存パスは、最後のパスコンポーネント(ここでは1/ )がモデルのバージョン番号であるTensorFlow Servingで使用される規則に従います。これにより、TensorflowServingなどのツールが相対的な鮮度について推論できるようになります。

あなたがPythonのにSavedModelバックをロードすることができtf.saved_model.loadと提督ホッパーの画像を分類する方法を参照してください。

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

TensorFlowサービングでSavedModelを実行する

SavedModelsはPythonから使用できます(詳細は以下を参照)が、本番環境では通常、Pythonコードを実行せずに推論専用のサービスを使用します。これは、TensorFlowServingを使用してSavedModelから簡単に設定できます。

エンドツーエンドのテンソルフローサービングの例については、 TensorFlowサービングRESTチュートリアルを参照してください。

ディスク上のSavedModel形式

SavedModelは、シリアル化された署名と、変数値や語彙など、署名を実行するために必要な状態を含むディレクトリです。

ls {mobilenet_save_path}
assets  saved_model.pb  variables

saved_model.pbファイルには、実際のTensorFlowプログラムまたはモデルと、名前付き署名のセットが格納されます。各署名は、テンソル入力を受け入れ、テンソル出力を生成する関数を識別します。

SavedModelsは、(複数のモデルの複数の変異体を含んでいてもよいv1.MetaGraphDefsで識別、 --tag_setにフラグsaved_model_cli )が、これは稀です。モデルの複数のバリアントを作成するAPIには、 tf.Estimator.experimental_export_all_saved_modelsおよびTensorFlow tf.saved_model.Builderます。

saved_model_cli show --dir {mobilenet_save_path} --tag_set serve
2020-10-13 01:23:41.728141: 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グラフで使用されるファイルが含まれています。この例では使用されていません。

SavedModelsには、TensorFlowグラフで使用されていないファイル用のassets.extraディレクトリが含まれている場合があります。たとえば、SavedModelの処理に関する消費者向けの情報などです。 TensorFlow自体はこのディレクトリを使用しません。

カスタムモデルの保存

tf.saved_model.saveは、 tf.keras.Layertf.keras.Modelなどのtf.Moduleオブジェクトとそのサブクラスの保存をtf.Moduleます。

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.Module 、再帰的トラバーサルを介して検出されたtf.Variable属性、 tf.function装飾されたメソッド、およびtf.Moduleが保存されます。 (この再帰的走査の詳細については、チェックポイントチュートリアルを参照してください。)ただし、Pythonの属性、関数、およびデータはすべて失われます。これは、 tf.functionが保存されるときに、Pythonコードが保存されないことを意味します。

Pythonコードが保存されていない場合、SavedModelはどのようにして関数を復元する方法を知っていますか?

簡単に言うと、 tf.functionは、PythonコードをトレースしてConcreteFunction( tf.Graph呼び出し可能なラッパー)を生成することで機能します。 tf.function保存すると、 tf.functiontf.functionのキャッシュが実際に保存されます。

tf.functionとConcreteFunctionsの関係の詳細については、 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/tmpqrbxtm18/module_no_signatures/assets

カスタムモデルの読み込みと使用

SavedModelをPythonでロードすると、すべてのtf.Variable属性、 tf.function装飾されたメソッド、およびtf.Moduleが、元の保存された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

一般的な微調整

KerasのSavedModelは、より高度な微調整のケースに対処する__call__に、単純な__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 Servingやsaved_model_cliなどのツールは、SavedModelsとsaved_model_cliできます。これらのツールが使用するConcreteFunctionを決定できるようにするには、サービングシグネチャを指定する必要があります。 tf.keras.Model自動的にサービング署名を指定しますが、カスタムモジュールのサービング署名を明示的に宣言する必要があります。

デフォルトでは、カスタムtf.Moduleで署名は宣言されていtf.Module

assert len(imported.signatures) == 0

サービングシグニチャを宣言するには、 signatures kwargを使用してConcreteFunctionを指定します。単一の署名を指定する場合、その署名キーは'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/tmpqrbxtm18/module_with_signature/assets

imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())

['serving_default']

複数の署名をエクスポートするには、署名キーの辞書をConcreteFunctionsに渡します。各署名キーは1つの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/tmpqrbxtm18/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ようにかなり一般的output_0 。出力の名前を制御するには、 tf.functionを変更して、出力名を出力にマップするディクショナリを返します。入力の名前は、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/tmpqrbxtm18/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 ++でロードします

SavedModelローダーのC ++バージョンは、SessionOptionsとRunOptionsを許可しながら、パスからSavedModelをロードするためのAPIを提供します。ロードするグラフに関連付けられているタグを指定する必要があります。ロードされたバージョンの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のdtypeと形状がモデルと一致することをすばやく確認できます。さらに、モデルをテストする場合は、CLIを使用して、さまざまな形式(Python式など)でサンプル入力を渡し、出力をフェッチすることでサニティチェックを実行できます。

SavedModelCLIをインストールします

大まかに言えば、TensorFlowは次の2つの方法のいずれかでインストールできます。

  • ビルド済みのTensorFlowバイナリをインストールする。
  • ソースコードからTensorFlowを構築する。

ビルド済みのTensorFlowバイナリを介してTensorFlowをインストールした場合、SavedModelCLIはシステムのパス名bin/saved_model_cli既にインストールされています。

ソースコードからsaved_model_cliをビルドした場合、 saved_model_cliをビルドするには、次の追加コマンドを実行する必要があります。

$ bazel build tensorflow/python/tools:saved_model_cli

コマンドの概要

SavedModel CLIは、SavedModelで次の2つのコマンドをサポートします。

  • showは、SavedModelから利用可能な計算を示します。
  • run 、SavedModelから計算を実行します。

showコマンド

SavedModelには、タグセットで識別される1つ以上のモデルバリアント(技術的にはv1.MetaGraphDef )が含まれています。モデルを提供するために、各モデルバリアントにどのような種類の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

特定のSignatureDefすべての入力と出力のTensorInfoを表示するには、 SignatureDefキーをsignature_defオプションに渡します。これは、後で計算グラフを実行するために、入力テンソルのテンソルキー値、dtype、および形状を知りたい場合に非常に役立ちます。例えば:

$ 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コマンドは、入力をモデルに渡すための次の3つの方法を提供します。

  • --inputsオプションを使用すると、ファイルでnumpyndarrayを渡すことができます。
  • --input_exprsオプションを使用すると、Python式を渡すことができます。
  • --input_examplesオプションを使用すると、 tf.train.Exampleを渡すことができます。

--inputs

入力データをファイルで渡すには、次の一般的な形式をとる--inputsオプションを指定します。

--inputs <INPUTS>

ここで、 INPUTSは次のいずれかの形式です。

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

複数のINPUTを渡すことができます。複数の入力を渡す場合は、セミコロンを使用して各入力を区切ります。

saved_model_cliは、 numpy.loadを使用してファイル名をロードしますファイル名は、次のいずれかの形式にすることができます。

  • .npy
  • .npz
  • ピクルスフォーマット

.npyファイルには常に.npyが含まれています。したがって、 .npyファイルからロードする場合、コンテンツは指定された入力テンソルに直接割り当てられます。その.npyファイルでvariable_nameを指定すると、 variable_nameは無視され、警告が発行されます。

.npz (zip)ファイルからロードする場合、オプションでvariable_nameを指定して、入力テンソルキー用にロードするzipファイル内の変数を識別できます。 variable_nameを指定しない場合、SavedModel CLIはzipファイルに1つのファイルのみが含まれていることを確認し、指定された入力テンソルキーに対してそれをロードします。

ピクルスファイルからロードするときに、角括弧内にvariable_nameが指定されていない場合、ピクルスファイル内にあるものはすべて指定された入力テンソルキーに渡されます。それ以外の場合、SavedModel CLIは、ディクショナリがpickleファイルに格納されていると想定し、 variable_nameに対応する値が使用されます。

--input_exprs

Python式を介して入力を渡すには、 --input_exprsオプションを指定します。これは、データファイルがない場合でも、モデルのSignatureDefのdtypeと形状に一致するいくつかの単純な入力を使用してモデルのサニティチェックを行う場合に役立ちます。例えば:

`<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ます。各辞書はtf.train.Exampleインスタンスです。ディクショナリキーは機能であり、値は各機能の値リストです。例えば:

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

出力を保存

デフォルトでは、SavedModelCLIは出力をstdoutに書き込みます。ディレクトリが--outdirオプションに渡された場合、出力は、指定されたディレクトリの下の出力テンソルキーにちなんで名付けられた.npyファイルとして保存されます。

--overwriteを使用して、既存の出力ファイルを上書きします。