Keras MobileNet示例在不同的计算机上产生不同的答案

时间:2018-04-19 23:18:34

标签: python tensorflow keras precision

我有一个非常简单的例子,Keras MobileNet实现尝试对小型货车进行分类。我在两台不同的计算机上运行相同的代码并得到不同的结果,不仅仅是略有不同,而是足够不同,以至于分类不一样。

(注意两台计算机上的Tensorflow = 1.7.0和Keras = 2.1.5)

以下代码

import sys
import argparse
import numpy as np
from PIL import Image
import requests
from io import BytesIO
import time
try:
  import matplotlib.pyplot as plt
  HAS_MATPLOTLIB = True
except:
  HAS_MATPLOTLIB = False


from keras.preprocessing import image
#from keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions

from keras.applications.mobilenet import MobileNet, preprocess_input, decode_predictions

#model = ResNet50(weights='imagenet')
model = MobileNet()
target_size = (224, 224)

def predict(model, img, target_size, top_n=3):
  """Run model prediction on image
  Args:
    model: keras model
    img: PIL format image
    target_size: (w,h) tuple
    top_n: # of top predictions to return
  Returns:
    list of predicted labels and their probabilities
  """
  if img.size != target_size:
    img = img.resize(target_size)

  print "preprocessing input.."
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)
  x = preprocess_input(x)
  print "making predicition..."
  preds = model.predict(x)
  print "prediction made: %s" % preds
  return decode_predictions(preds, top=top_n)[0]

if __name__=="__main__":
  a = argparse.ArgumentParser()
  a.add_argument("--image", help="path to image")
  a.add_argument("--image_url", help="url to image")
  args = a.parse_args()

  if args.image is None and args.image_url is None:
    a.print_help()
    sys.exit(1)

  if args.image is not None:
    img = Image.open(args.image)
    preds = predict(model, img, target_size)

  if args.image_url is not None:
    print "getting image from url"
    response = requests.get(args.image_url)
    print "image gotten from url"
    img = Image.open(BytesIO(response.content))
    print "predicting.."
    before = time.time()
    preds = predict(model, img, target_size)
    print "total time to predict: %.2f" % (time.time() - before)

  print preds
  plot_preds(img, preds)

现在如果我在MacBook Pro上运行它

$ python classify_example_mobile.py  --image_url http://i.imgur.com/cg37Ojo.jpg

[(u'n03770679', u'minivan', 0.39935172), (u'n02974003', u'car_wheel', 0.28071228), (u'n02814533', u'beach_wagon', 0.19400564)]

但如果我在另一台我有

的计算机上运行它
(venv) $ python classify_example_mobile.py --image_url http://i.imgur.com/cg37Ojo.jpg
[(u'n02974003', u'car_wheel', 0.39516035), (u'n02814533', u'beach_wagon', 0.27965376), (u'n03770679', u'minivan', 0.22706936)]

预测相反,它不再选择小型货车作为最佳结果。

怎么会这样?我知道不同的架构可以有不同的浮点数学精度,但这足以说明这些结果吗?我也知道模型可以根据训练期间权重初始化的方式而有所不同,但这是一个预先训练过的模型,所以给出了什么?

编辑 - 要清楚,图像是一辆小型货车的图片,所以在这种情况下,一个架构正确而另一个架构错了 - 所以这对我来说是个大问题。 (http://i.imgur.com/cg37Ojo.jpg

1 个答案:

答案 0 :(得分:0)

所以我不太明白这里发生了什么,但是一旦我对输入进行了更多的预处理,错误似乎已经消失了,这让我觉得我可能有不同的PIL版本的numpy版本或者什么东西

我添加了这些行

img = img.convert("RGB")

现在两台计算机之间的结果是相同的