![](/img/trans.png)
[英]Prediction from a Deployed SCIKITLEARN model at Google Cloud ML-Engine
[英]Using trained keras model in google ml-engine
我正在嘗試使用帶有tensorflow的gcloud ml-engine,更確切地說,我想使用一個已經受過訓練的keras模型。
我設法用sciktlearn模型做到了這一點,但這在這里不一樣...
首先,我與Keras一起訓練一個簡單的模型
import numpy as np
from tensorflow import keras
# Creating the dataset
X = np.random.random((500,9))
y = (np.random.random(500)>0.5).astype(int)
# Splitting
idx_train, idx_test = np.arange(400), np.arange(400,500)
X_train, X_test = X[idx_train], X[idx_test]
y_train, y_test = y[idx_train], y[idx_test]
def define_model():
input1 = keras.layers.Input(shape=(9,),name="values")
hidden = keras.layers.Dense(50, activation='relu', name="hidden")(input1)
preds = keras.layers.Dense(1, activation='sigmoid', name="labels")(hidden)
model = keras.models.Model(inputs=input1,
outputs=preds)
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=["accuracy"])
model.summary()
return model
model = define_model()
model.fit(X_train, y_train,
batch_size=10,
epochs=10, validation_split=0.2)
我讀到我需要一個SavedModel才能在此處的ml-engine中使用它https://cloud.google.com/ml-engine/docs/tensorflow/deploying-models
看來我必須將其轉換為估計量
model.save("./model_trained_test.h5")
estimator_model = keras.estimator.model_to_estimator(keras_model_path="./model_trained_test.h5")
我設法用這個估算器做出預測
def input_function(features,labels=None,shuffle=False):
input_fn = tf.estimator.inputs.numpy_input_fn(
x={"values": features},
y=labels,
shuffle=shuffle
)
return input_fn
score = estimator_model.evaluate(input_function(X_test, labels=y_test.reshape(-1,1)))
為了將其導出到SavedModel,我需要serving_input_receiver_fn。 我在互聯網上找不到適合我的情況的示例,這對我來說似乎很簡單,因此我嘗試了此功能,然后將模型保存在“ here_are_estimators”文件夾中
feature_spec = {'values': tf.FixedLenFeature(9, dtype=tf.float32)}
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype=tf.string,
shape=[None],
name='input_tensors')
receiver_tensors = {'examples': serialized_tf_example}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
estimator_model.export_savedmodel("./here_are_estimators",
serving_input_receiver_fn=serving_input_receiver_fn)
我的input.json看起來像這樣
{"examples":[{"values":[[0.2,0.3,0.4,0.5,0.9,1.5,1.6,7.3,1.5]]}]}
我將生成的文件,變量文件夾和saved_model.pb文件的內容上傳到目錄DEPLOYMENT_SOURCE中的GCS
當我嘗試使用以下命令使用gcloud運行本地預測時:
gcloud ml-engine local predict --model-dir $DEPLOYMENT_SOURCE --json-instances="input.json" --verbosity debug --framework tensorflow
我有這個錯誤
cloud.ml.prediction.prediction_utils.PredictionError: Failed to run the provided model: Exception during running the graph: Cannot feed value of shape (1, 1) for Tensor 'input_tensors:0', which has shape '(?,)' (Error code: 2)
我想我的input.json或serve_input_receiver_fn或這兩者都存在問題,但是我找不到原因。 如果有人可以告訴我哪里出了問題,將不勝感激:)
您不應該嘗試解析tf.Example,因為您正在發送JSON。 嘗試將其導出:
def serving_input_receiver_fn():
inputs = {"values": tf.placeholder(dtype=tf.float32,
shape=[None, 9],
name='input_tensors')}
return tf.estimator.export.ServingInputReceiver(inputs, inputs)
estimator_model.export_savedmodel("./here_are_estimators", serving_input_receiver_fn=serving_input_receiver_fn)
輸入應如下所示:
{"values":[0.2,0.3,0.4,0.5,0.9,1.5,1.6,7.3,1.5]}
還有一個更簡潔的“速記”:
[0.2,0.3,0.4,0.5,0.9,1.5,1.6,7.3,1.5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.