我有一个非常简单的例子,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)
答案 0 :(得分:0)
所以我不太明白这里发生了什么,但是一旦我对输入进行了更多的预处理,错误似乎已经消失了,这让我觉得我可能有不同的PIL版本的numpy版本或者什么东西
我添加了这些行
img = img.convert("RGB")
现在两台计算机之间的结果是相同的