tensorflow - GCP ML 引擎预测的错误处理输入
问题描述
我在 GCP ML Engine 上有一个 TensorFlow 模型,但是下面的 JSON 字符串有问题:
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
import json
credentials = GoogleCredentials.get_application_default()
api = discovery.build('ml', 'v1', credentials=credentials,
discoveryServiceUrl='https://storage.googleapis.com/cloud-ml/discovery/ml_v1_discovery.json')
request_data = {'instances':
[{
'inputs':{
'clump_thickness': 2,
'size_uniformity': 1,
'shape_uniformity': 1,
'marginal_adhesion': 1,
'epithelial_size': 2,
'bland_chromatin': 1,
'bare_nucleoli': 2,
'normal_nucleoli': 1,
'mitoses': 1
}
}]
}
parent = 'projects/%s/models/%s/versions/%s' % (PROJECT,
'breastCancer_optimized_06152018_2_2_a', 'v1')
response = api.projects().predict(body=request_data, name=parent).execute()
print(response)
我收到以下错误:{'error': "Prediction failed: Error processing input: Expected string, got {u'epithelial_size': 2, u'marginal_adhesion': 1, u'clump_thickness': 2, u'size_uniformity': 1, u'shape_uniformity': 1, u'normal_nucleoli': 1, u'mitoses': 1, u'bland_chromatin': 1, u'bare_nucleoli': 2} 'dict' 类型。"}
我似乎无法正确格式化 request_data 。有谁看到出了什么问题?
原始服务功能:
clump_thickness = tf.feature_column.numeric_column("clump_thickness");
size_uniformity = tf.feature_column.numeric_column("size_uniformity");
shape_uniformity = tf.feature_column.numeric_column("shape_uniformity");
marginal_adhesion = tf.feature_column.numeric_column("marginal_adhesion");
epithelial_size = tf.feature_column.numeric_column("epithelial_size");
bare_nucleoli = tf.feature_column.numeric_column("bare_nucleoli");
bland_chromatin = tf.feature_column.numeric_column("bland_chromatin");
normal_nucleoli = tf.feature_column.numeric_column("normal_nucleoli");
mitoses = tf.feature_column.numeric_column("mitoses");
feature_columns = [clump_thickness, size_uniformity, shape_uniformity, marginal_adhesion, epithelial_size,
bare_nucleoli, bland_chromatin, normal_nucleoli, mitoses];
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns);
export_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec);
estimator.export_savedmodel(output_dir, export_input_fn, as_text=False)
然后我尝试了:
def serving_input_fn():
feature_placeholders = {
'clump_thickness' : tf.placeholder(tf.float32, [None]),
'size_uniformity' : tf.placeholder(tf.float32, [None]),
'shape_uniformity' : tf.placeholder(tf.float32, [None]),
'marginal_adhesion' : tf.placeholder(tf.float32, [None]),
'epithelial_size' : tf.placeholder(tf.float32, [None]),
'bare_nucleoli' : tf.placeholder(tf.float32, [None]),
'bland_chromatin' : tf.placeholder(tf.float32, [None]),
'normal_nucleoli' : tf.placeholder(tf.float32, [None]),
'mitoses' : tf.placeholder(tf.float32, [None]),
}
features = feature_placeholders # no transformation needed
return tf.estimator.export.ServingInputReceiver(features, feature_placeholders)
在 train_and_eval 函数中:
estimator.export_savedmodel(output_dir, serving_input_fn, as_text=False)
但现在我收到以下错误:
{'error':“预测失败:预期张量名称:输入,得到张量名称:[u'上皮尺寸',u'marginal_adhesion',u'clump_thickness',u'size_uniformity',u'shape_uniformity',u'normal_nucleoli', u'mitoses',u'bland_chromatin',u'bare_nucleoli']。"}
estimator.export_savedmodel 似乎创建了一个需要张量输入的模型(在 request_data 行中)。
当我使用使用任一服务功能创建的模型时,以下工作正常:
predict_fn = tf.contrib.predictor.from_saved_model("gs://test-
203900/breastCancer_optimized_06182018/9/1529432417")
# Test inputs represented by Pandas DataFrame.
inputs = pd.DataFrame({
'clump_thickness': [2,5,4],
'size_uniformity': [1,10,8],
'shape_uniformity': [1,10,6],
'marginal_adhesion': [1,3,4],
'epithelial_size': [2,7,3],
'bland_chromatin': [1,3,4],
'bare_nucleoli': [2,8,10],
'normal_nucleoli': [1,10,6],
'mitoses': [1,2,1],
})
# Convert input data into serialized Example strings.
examples = []
for index, row in inputs.iterrows():
feature = {}
for col, value in row.iteritems():
feature[col] =
tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
example = tf.train.Example(
features=tf.train.Features(
feature=feature
)
)
examples.append(example.SerializeToString())
# Make predictions.
predictions = predict_fn({'inputs': examples})
解决方案
这取决于您的服务输入功能是什么。从错误消息中可以看出,“输入”需要是一个字符串(可能是逗号分隔?)
尝试这个:
saved_model_cli show --dir $MODEL_LOCATION --tag_set serve --signature_def serving_default
它将告诉您服务输入功能设置为什么。
我怀疑您想要的是您的服务输入功能是:
def serving_input_fn():
feature_placeholders = {
'size_uniformity' : tf.placeholder(tf.float32, [None]),
'shape_uniformity' : tf.placeholder(tf.float32, [None])
}
features = feature_placeholders # no transformation needed
return tf.estimator.export.ServingInputReceiver(features, feature_placeholders)
并且您的输入格式为:
request_data = {'instances':
[
{
'size_uniformity': 1,
'shape_uniformity': 1
}
]
}
推荐阅读
- python - 如何将 CFFI 与多个头文件一起使用
- c# - 如何从另一个执行一个天蓝色功能并在本地测试?
- r - 如何找出两个栅格层的 x/y 偏移?
- angular - 如何避免在调度新操作时通过循环访问存储对象而重新渲染组件
- amazon-web-services - 添加额外的 DNS pod 如何配置和处理
- android - Google play:由于 64 位要求导致 Apk 上传错误
- observable - 如何在特定队列上启动一系列可观察对象?
- python - Df到sql到python中的Teradata
- apollo-server - 如何在没有 Apollo Server 但使用 express-graphql 的情况下使用 apollo-datasource-rest
- angular - 自定义单元格组件的 AgGrid 行 autoHeight