簡體   English   中英

Tensorflow服務REST API拋出錯誤

[英]Tensorflow Serving REST API Throwing error

我在tensorflow版本'1.10.0'中為IRIS數據集構建了一個非常簡單的分類模型。 該代碼在jupyter Notebook中運行良好。 我正在嘗試通過使用docker的Tensorflow服務進行部署和服務。 盡管docker啟動了,但我無法獲得良好的結果。 Tensorflow服務對我來說有點新。 我使用的命令和錯誤輸出如下:

curl -d '{"instances": [1.0, 2.0, 5.0,4.2]}'   -X POST http://localhost:8501/v1/models/irismodel:predict

{ "error": "You must feed a value for placeholder tensor \'y\' with dtype int32\n\t [[{{node y}} = Placeholder[_output_shapes=[<unknown>], dtype=DT_INT32, shape=<unknown>, _device=\"/job:localhost/replica:0/task:0/device:CPU:0\"]()]]" }

訓練和保存模型的完整代碼如下。 請注意,我正在使用從saved_model.simple_save獲得的對象。 由於未創建任何模型版本,因此我僅創建一個名為“ 1”的文件夾,然后將內容移動到該文件夾​​。

from numpy import genfromtxt
my_data = genfromtxt('/my/path/iris.csv', delimiter=',',skip_header =1)

my_data[149,:]
array([5.9, 3. , 5.1, 1.8, 2. ])

import tensorflow as tf
import numpy as np

n_inputs = 4  # MNIST
n_hidden1 = 3
n_hidden2 = 2
n_outputs = 3

def reset_graph(seed=42):
  tf.reset_default_graph()
  tf.set_random_seed(seed)
  np.random.seed(seed)

reset_graph()

X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X")
y = tf.placeholder(tf.int32,shape=(None), name="y")

hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1",activation=tf.nn.relu)
hidden2 = tf.layers.dense(hidden1, n_hidden2, name="hidden2",activation=tf.nn.relu)
logits = tf.layers.dense(hidden2, n_outputs, name="outputs")

xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
loss = tf.reduce_mean(xentropy, name="loss")

learning_rate = 0.01

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
training_op = optimizer.minimize(loss)

correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

init = tf.global_variables_initializer()
saver = tf.train.Saver()

arr = np.arange(150)
np.random.shuffle(arr)

my_data = my_data.reshape((150,5))
my_data = my_data[arr]

X_train = my_data[0:120,0:4]
X_test = my_data[120:150,0:4]
y_train = my_data[0:120,4].astype("int32")
y_test = my_data[120:150,4].astype("int32")

cursor = 0
def next_batch(X_train,y_train,batch_size):
   global cursor
   indices = np.arange(cursor,cursor+batch_size)
   cursor = cursor + batch_size
   return X_train[indices],y_train[indices]


from tensorflow import saved_model

n_epochs = 50
batch_size = 20
with tf.Session() as sess:
   init.run()
   for epoch in range(n_epochs):
        cursor = 0
        for iteration in range(X_train.shape[0] // batch_size):
            X_batch, y_batch = next_batch(X_train,y_train,batch_size)
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch.astype("int32")})
        acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch.astype("int32")})
        acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test.astype("int32")})
        print(epoch, "Train accuracy:", acc_train, "Test accuracy:", acc_test)

   save_path = saver.save(sess, "./my_model_final.ckpt")
   saved_model.simple_save(sess,
        "/home/modelpath/imodel",
        inputs={"X": X},
        outputs={"y": y})

即使通過郵遞員提交,我也會遇到類似的錯誤。 我認為我可能在數據類型上犯了一些錯誤,但不確定。 錯誤的另一個來源可能是我發送API請求的方式。 任何指針都會有所幫助。 謝謝。

我已轉載您的錯誤,可以解決此問題。 tf.dtypes.cast(np.argmax(logits), dtype = "int32", name = 'y_pred')替換代碼最后一行中的y

with tf.Session() as sess:
   init.run()
   for epoch in range(n_epochs):
        cursor = 0
        for iteration in range(X_train.shape[0] // batch_size):
            X_batch, y_batch = next_batch(X_train,y_train,batch_size)
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch.astype("int32")})
        acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch.astype("int32")})
        acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test.astype("int32")})
        print(epoch, "Train accuracy:", acc_train, "Test accuracy:", acc_test)

   Predicted_Output = tf.dtypes.cast(np.argmax(logits), dtype = "int32", name = 'y_pred')
   save_path = saver.save(sess, "./my_model_final.ckpt")   
   saved_model.simple_save(sess, "IRIS_Data_Export", inputs={"X": X}, outputs={"y": Predicted_Output})

輸出如下所示:

{
    "outputs": 0
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM