TensorFlow 1.2.1和InceptionV3对图像进行分类

时间:2017-07-11 18:14:50

标签: machine-learning tensorflow neural-network keras coreml

我尝试使用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,并且在计算出来时会进一步扩展。

2 个答案:

答案 0 :(得分:3)

出现此错误的原因是模型始终需要批次的示例 - 而不是单个示例。这与对模型作为其输入的数学函数的共同理解不同。模型预期批次的原因是:

  1. 模型经过计算,可以在批量生产中加快工作速度,以加快培训速度。
  2. 有些算法会考虑输入的批处理性质(例如Batch Normalization GAN 训练技巧)。
  3. 因此,四个维度来自第一维度,即样本/批次维度,然后 - 接下来的三个维度是图像变暗。

答案 1 :(得分:2)

其实我找到了答案。即使文档声明如果包含顶层,输入向量的形状仍设置为拍摄一批图像。因此,我们需要在预测的代码行之前添加它:

elephant = numpy.expand_dims(elephant, axis=0)

然后张量的形状正确,一切正常。我仍然不确定为什么文档声明输入向量应该是(3x299x299)或(299x299x3),当它显然需要4维时。

小心!