我尝试使用Google最新版本的TensorFlow中内置的Keras创建示例。这个例子应该能够对大象的经典图像进行分类。代码如下所示:
# Import a few libraries for use later
from PIL import Image as IMG
from tensorflow.contrib.keras.python.keras.preprocessing import image
from tensorflow.contrib.keras.python.keras.applications.inception_v3 import InceptionV3
from tensorflow.contrib.keras.python.keras.applications.inception_v3 import preprocess_input, decode_predictions
# Get a copy of the Inception model
print('Loading Inception V3...\n')
model = InceptionV3(weights='imagenet', include_top=True)
print ('Inception V3 loaded\n')
# Read the elephant JPG
elephant_img = IMG.open('elephant.jpg')
# Convert the elephant to an array
elephant = image.img_to_array(elephant_img)
elephant = preprocess_input(elephant)
elephant_preds = model.predict(elephant)
print ('Predictions: ', decode_predictions(elephant_preds))
不幸的是,我在尝试使用model.predict评估模型时遇到错误:
ValueError: Error when checking : expected input_1 to have 4 dimensions, but got array with shape (299, 299, 3)
此代码取自the excellent example coremltools-keras-inception并基于This link,并且在计算出来时会进一步扩展。
答案 0 :(得分:3)
出现此错误的原因是模型始终需要批次的示例 - 而不是单个示例。这与对模型作为其输入的数学函数的共同理解不同。模型预期批次的原因是:
因此,四个维度来自第一维度,即样本/批次维度,然后 - 接下来的三个维度是图像变暗。
答案 1 :(得分:2)
其实我找到了答案。即使文档声明如果包含顶层,输入向量的形状仍设置为拍摄一批图像。因此,我们需要在预测的代码行之前添加它:
elephant = numpy.expand_dims(elephant, axis=0)
然后张量的形状正确,一切正常。我仍然不确定为什么文档声明输入向量应该是(3x299x299)或(299x299x3),当它显然需要4维时。
小心!