クラウドMLエンジンは1つがほぼエクスポートすることができます任意のTensorFlowモデルを展開することができます。そのようなモデルでは、入力と出力を定義し、それが要求と応答の形式を決定します。
例を見て理解すると便利だと思います。あなたはそうのようなモデルをエクスポート想像:
def my_model(image_in):
# Construct an inference graph for predicting captions
#
# image_in is a tensor/array with shape=(None,) and dtype=string
# Meaning, a batch of raw image bytes.
... Do your interesting stuff here ...
# caption_out is a tensor/matrix with shape=(None, MAX_WORDS) and
# dtype=tf.string), that is, you will be returning a batch
# of captions, one per input image, one word per column with
# padding when the number of words to output is < MAX_WORDS
return caption_out
image_in = tf.placeholder(shape=(None,), dtype=tf.string)
caption_out = my_model(image_in)
inputs = {"image_bytes": tf.saved_model.utils.build_tensor_info(image_in}
outputs = {"caption": tf.saved_model.utils.build_tensor_info(caption_out)}
signature = tf.saved_model.signature_def_utils.build_signature_def(
inputs=inputs,
outputs=outputs,
method_name='tensorflow/serving/predict'
)
あなたがこのモデル(CF this post)をエクスポートした後、あなたがそうのようなJSONリクエストを構築します:
{
"instances": [
{
"image_bytes": {
"b64": <base64_encoded_image1>
}
},
{
"image_bytes": {
"b64": <base64_encoded_image2>
}
}
]
}
私たちは要求を分析してみましょう。まず、一式の画像をサービスに送付します。すべてのリクエストは、「インスタンス」という配列値の属性を持つJSONオブジェクトです。配列の各エントリは、予測のためにグラフを供給するためのインスタンスです。このため、エクスポートされるモデルで最も外側の寸法をNone
に設定する必要があるため、可変サイズのバッチを処理できる必要があります。
配列の各エントリ自体はJSONオブジェクトです。属性は、モデルをエクスポートするときに定義したinput
のキーです。この例では、image_bytes
と定義しました。 image_bytes
はバイト文字列なので、データをbase64でエンコードする必要があります。これは、{"b64": <data>}
という形式のJSONオブジェクトを渡して行います。サービスに複数のイメージを送信したい場合は、instance
配列に各イメージの同様のエントリを追加できます。すべての応答は、「予測」と呼ばれる配列値属性を持つJSONオブジェクトです
{
"predictions": [
{
"caption": [
"the",
"quick",
"brown",
"",
"",
""
]
},
{
"caption": [
"A",
"person",
"on",
"the",
"beach",
""
]
}
]
}
:
さて、この例のサンプルのJSONレスポンスは、次のようになります。配列の各要素は、要求からのinstances
配列内の対応する入力に関連付けられた予測値です。
配列内の各エントリは、以前にエクスポートしたoutputs
dictのキーによって属性が決まるJSONオブジェクトです。この場合、入力あたり1つの出力がcaption
となっています。キャプションのソーステンソルcaption_out
は、実際には行列であり、行数はサービスに送信されたインスタンス数と定義された列数に一定であることに注意してください。ただし、行列を返す代わりに、サービスは行列の各行をprediction
配列のエントリとして独立して返します。行列の第2次元は一定であり、おそらくモデルそのものが余分な単語を空の文字列として埋め込む(上記のように)。
非常に重要な注記:上記の例では、生のJSON要求/応答本文を示しました。あなたの投稿から、レスポンスを解析してその周囲に構造を追加しているGoogleの汎用クライアントを使用していることが明らかです。具体的には、印刷対象のオブジェクトはネストされたフィールド[data]
とその後[modelData:protected]
内の予測をラップします。
私の個人的なお勧めは、そのクライアントをサービスに使用せず、汎用のリクエスト/レスポンスライブラリ(Googleの認証ライブラリと一緒に)を使用することですが、機能しているので何でも使えます。
なぜこのモデルはキャプションを文字列の配列として与えるのですか?複数の単語を含む1つの文字列を与えるように定義できますか? –
このような出力を生成するTensorFlowモデルを定義できるのであれば、絶対に可能です。 – rhaertel80