在Google Cloud ML上重新启动创建时更改标签名称

时间:2017-03-16 10:36:48

标签: tensorflow google-cloud-platform image-recognition google-cloud-ml

我目前按照教程重新培训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那样的东西。有人可以帮帮我吗?

1 个答案:

答案 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)

并保持输入/输出不受原始代码

的影响