Python 无法预测Keras中带有VGG19的单个图像的标签
根据[本教程],我正在使用迁移学习方法在Keras中使用经过培训的VGG19模型( )。它显示了如何训练模型,而不是如何为预测准备测试图像 在评论部分,它说: 获取图像,使用相同的Python 无法预测Keras中带有VGG19的单个图像的标签,python,tensorflow,machine-learning,keras,transfer-learning,Python,Tensorflow,Machine Learning,Keras,Transfer Learning,根据[本教程],我正在使用迁移学习方法在Keras中使用经过培训的VGG19模型( )。它显示了如何训练模型,而不是如何为预测准备测试图像 在评论部分,它说: 获取图像,使用相同的preprocess\u image函数对图像进行预处理,然后调用model.predict(image)。这将为您提供该图像上模型的预测。使用argmax(预测),可以找到图像所属的类 我找不到代码中使用的名为preprocess\u image的函数。我做了一些搜索,并考虑使用由提出的方法 但这给了一个错误的说法:
preprocess\u image
函数对图像进行预处理,然后调用model.predict(image)
。这将为您提供该图像上模型的预测。使用argmax(预测)
,可以找到图像所属的类
我找不到代码中使用的名为preprocess\u image
的函数。我做了一些搜索,并考虑使用由提出的方法
但这给了一个错误的说法:
decode_predictions expects a batch of predictions (i.e. a 2D array of shape (samples, 1000)). Found array with shape: (1, 12)
我的数据集有12个类别。以下是培训模型的完整代码以及我是如何得到此错误的:
import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense, GlobalAveragePooling2D
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam
base_model = VGG19(weights='imagenet', include_top=False)
x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x)
x=Dense(1024,activation='relu')(x)
x=Dense(512,activation='relu')(x)
preds=Dense(12,activation='softmax')(x)
model=Model(inputs=base_model.input,outputs=preds)
# view the layer architecture
# for i,layer in enumerate(model.layers):
# print(i,layer.name)
for layer in model.layers:
layer.trainable=False
for layer in model.layers[:20]:
layer.trainable=False
for layer in model.layers[20:]:
layer.trainable=True
train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input)
train_generator=train_datagen.flow_from_directory('dataset',
target_size=(96,96), # 224, 224
color_mode='rgb',
batch_size=64,
class_mode='categorical',
shuffle=True)
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
step_size_train=train_generator.n//train_generator.batch_size
model.fit_generator(generator=train_generator,
steps_per_epoch=step_size_train,
epochs=5)
# model.predict(new_image)
伊皮顿:
In [3]: import classify_tl
Found 4750 images belonging to 12 classes.
Epoch 1/5
74/74 [==============================] - 583s 8s/step - loss: 2.0113 - acc: 0.4557
Epoch 2/5
74/74 [==============================] - 576s 8s/step - loss: 0.8222 - acc: 0.7170
Epoch 3/5
74/74 [==============================] - 563s 8s/step - loss: 0.5875 - acc: 0.7929
Epoch 4/5
74/74 [==============================] - 585s 8s/step - loss: 0.3897 - acc: 0.8627
Epoch 5/5
74/74 [==============================] - 610s 8s/step - loss: 0.2689 - acc: 0.9071
In [6]: model = classify_tl.model
In [7]: print(model)
<keras.engine.training.Model object at 0x7fb3ad988518>
In [8]: from keras.preprocessing.image import load_img
In [9]: image = load_img('examples/0021e90e4.png', target_size=(96,96))
In [10]: from keras.preprocessing.image import img_to_array
In [11]: image = img_to_array(image)
In [12]: image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
In [13]: from keras.applications.vgg19 import preprocess_input
In [14]: image = preprocess_input(image)
In [15]: yhat = model.predict(image)
In [16]: print(yhat)
[[1.3975363e-06 3.1069856e-05 9.9680350e-05 1.7175063e-03 6.2767825e-08
2.6133494e-03 7.2859187e-08 6.0187017e-07 2.0794137e-06 1.3714411e-03
9.9416250e-01 2.6067207e-07]]
In [17]: from keras.applications.vgg19 import decode_predictions
In [18]: label = decode_predictions(yhat)
如何正确输入测试图像并获得预测?
decode\u predictions
用于根据ImageNet数据集中有1000个类的类的标签对模型的预测进行解码。但是,经过微调的模型只有12个类。因此,在这里使用解码预测是没有意义的。当然,您必须知道这12个类的标签是什么。因此,只需取预测中的最大得分指数,并找到其标签:
# create a list containing the class labels
class_labels = ['class1', 'class2', 'class3', ...., 'class12']
# find the index of the class with maximum score
pred = np.argmax(class_labels, axis=-1)
# print the label of the class with maximum score
print(class_labels[pred[0]])
# create a list containing the class labels
class_labels = ['class1', 'class2', 'class3', ...., 'class12']
# find the index of the class with maximum score
pred = np.argmax(class_labels, axis=-1)
# print the label of the class with maximum score
print(class_labels[pred[0]])