0

に余分な次元を追加します。のgcloud MLエンジンは、次のコードでのgcloud MLエンジンを設定しようとすると、入力配列

import numpy as np 
import tensorflow as tf 

x = tf.placeholder('float', shape=[None, 3], name='x') 
w = tf.Variable(tf.zeros([3, 2])) 
y = tf.nn.softmax(tf.matmul(x, w), name='y') 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

tensor_info_x = tf.saved_model.utils.build_tensor_info(x) 
tensor_info_y = tf.saved_model.utils.build_tensor_info(y) 

prediction_signature = (
    tf.saved_model.signature_def_utils.build_signature_def(
     inputs={'inputs': tensor_info_x}, 
     outputs={'scores': tensor_info_y}, 
     method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME) 
    ) 

export_path = './test_exports' 
builder = tf.saved_model.builder.SavedModelBuilder(export_path) 
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op') 
builder.add_meta_graph_and_variables(
     sess, [tf.saved_model.tag_constants.SERVING], 
     signature_def_map={ 
      'predict_images': 
       prediction_signature 
     }, 
     legacy_init_op=legacy_init_op) 
builder.save() 

私は予測に用いたサンプル入力JSONファイルは次のとおりです。

{ "inputs" : [[ 0.32439028, 0.07830289, 0.30881251], [ 0.32439028, 0.07830289, 0.30881251]] } 

ご覧のように、入力配列の形状は(2,3)です。モデルへの入力として、これを供給したときにしかし、私はエラーに直面している:

Cannot feed value of shape (1, 2, 3) for Tensor u'x:0', which has shape '(?, 3)' (Error code: 2)

これをさらに検証するために、サイズ(1、3)の入力を与えることで、モデルが完璧に動作します。どのように余分な次元が追加されているか考えてみましょうか?

EDIT:

コマンドテストに使用:

答えて

0

MLエンジンは1つだけでなく、入力のバッチのために予測します。したがって、入力した入力プレースホルダーを[None、2,3]に変更する必要があります。

ちなみに、モデルプロセスを使用すると、トレーニングにも適しています。

+0

返信いただきありがとうございます。私は少し混乱しています。私の入力は長さ3の一次元配列であると考えられます。したがって、バッチとして作るために、xのサイズを[None、3]としました。このプロセスは、[N、3]入力行列と[3、w]行列の行列乗算を行います。ここで、Nはバッチでの入力数を表します。サイズ2は固定されていないので、Xの形状を[None、2,3]に変更することはできません。どのようにこれを回避するための任意のアイデアですか? –

+1

Aah。あなたのjsonファイルでは、異なる行に異なるインスタンスを配置します。入力は1次元配列でなければなりません。 – Lak

+0

有効なポイントのようです。私はそれを試してみましょう。 –

0

同じ作業をするすべての人にソリューションを投稿する。

この例では、モデルにmlエンジンによって与えられた入力は、形状[1、N、m](Nは入力数、mはフィーチャサイズ)になります。だから、次のようにtf.squeeze()を使用し、このフォーマットへの入力を変換するには:

x = tf.placeholder('float', shape=[1, None, 3], name='x') 
x_exp = tf.squeeze(x, axis=0) 

を今、あなたはさらなる処理のためx_expを使用することができます。

関連する問題