我只是想像这样使用预训练的 vgg16 在 Keras 中进行预测。
from scipy import ndimage
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
im = scipy.misc.imread("cat_dog/validation/cats/cat.1362.jpg").astype(np.float32)
im = scipy.misc.imresize(im, (224, 224)).astype(np.float32)
#im /= 255.0
#im = im - np.mean(im, axis=2, keepdims=True)
im = np.expand_dims(im, axis=0)
im = preprocess_input(im)
out = vgg16_model.predict(im)
np.argmax(out)
似乎 im /= 255.0 给出了非常糟糕的预测。我评论了它,它开始做出很好的预测。我还添加了 preprocess_input(...) 但这似乎不会影响我所做的少数随机试验的预测。
问题是,根据这个伟大的博客:
https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html
在“使用预训练网络的瓶颈特征:一分钟内达到 90% 的准确率”下,预训练的 VGG16 处于迁移学习环境中。如果你看一下这个gist,你会看到这行代码:
def save_bottlebeck_features():
datagen = ImageDataGenerator(rescale=1. / 255)
etc.
在缓存最后一个卷积层的特征期间,输入的预处理似乎是 1/255.0。这有点令人费解。我还进一步查找了 preprocess_input(...) 在我拥有的代码中是如何定义的,并找到了“tf”:
x /= 127.5
x -= 1.
你可以在这里查看。