我目前按照教程重新培训Inception进行图像分类: https://cloud.google.com/blog/big-data/2016/12/how-to-train-and-classify-images-using-google-cloud-machine-learning-and-cloud-dataflow
然而,当我使用API进行预测时,我只得到我的类的索引作为标签。但是我希望API实际上给我一个带有实际类名的字符串,例如而不是
predictions:
- key: '0'
prediction: 4
scores:
- 8.11998e-09
- 2.64907e-08
- 1.10307e-06
我想得到:
predictions:
- key: '0'
prediction: ROSES
scores:
- 8.11998e-09
- 2.64907e-08
- 1.10307e-06
查看Google API的参考资料应该可以: https://cloud.google.com/ml-engine/reference/rest/v1/projects/predict
我已经尝试将下面的model.py更改为
outputs = {
'key': keys.name,
'prediction': tensors.predictions[0].name,
'scores': tensors.predictions[1].name
}
tf.add_to_collection('outputs', json.dumps(outputs))
到
if tensors.predictions[0].name == 0:
pred_name ='roses'
elif tensors.predictions[0].name == 1:
pred_name ='tulips'
outputs = {
'key': keys.name,
'prediction': pred_name,
'scores': tensors.predictions[1].name
}
tf.add_to_collection('outputs', json.dumps(outputs))
但这不起作用。
我的下一个想法是在preprocess.py文件中更改此部分。因此,获取索引我想使用字符串标签。
def process(self, row, all_labels):
try:
row = row.element
except AttributeError:
pass
if not self.label_to_id_map:
for i, label in enumerate(all_labels):
label = label.strip()
if label:
self.label_to_id_map[label] = label #i
和
label_ids = []
for label in row[1:]:
try:
label_ids.append(label.strip())
#label_ids.append(self.label_to_id_map[label.strip()])
except KeyError:
unknown_label.inc()
但这会产生错误:
TypeError: 'roses' has type <type 'str'>, but expected one of: (<type 'int'>, <type 'long'>) [while running 'Embed and make TFExample']
因此我认为我应该在preprocess.py中更改一些内容,以便允许字符串:
example = tf.train.Example(features=tf.train.Features(feature={
'image_uri': _bytes_feature([uri]),
'embedding': _float_feature(embedding.ravel().tolist()),
}))
if label_ids:
label_ids.sort()
example.features.feature['label'].int64_list.value.extend(label_ids)
但是我不知道如何适当地改变它,因为我找不到像str_list那样的东西。有人可以帮帮我吗?
答案 0 :(得分:0)
在线预测肯定允许这样做,模型本身需要更新以进行从int到string的转换。
请记住,Python代码只是构建一个图形,用于描述模型中要执行的计算 - 您没有将Python代码发送到在线预测,而是发送您构建的图形
这种区别很重要,因为您所做的更改是使用Python进行的 - 您还没有任何输入或预测,因此您无法检查其值。您需要做的是将等效查找添加到您要导出的图形中。
您可以像这样修改代码:
labels = tf.constant(['cars', 'trucks', 'suvs'])
predicted_indices = tf.argmax(softmax, 1)
prediction = tf.gather(labels, predicted_indices)
并保持输入/输出不受原始代码
的影响