如何在 Keras 中使用经过训练的模型进行预测
Posted
技术标签:
【中文标题】如何在 Keras 中使用经过训练的模型进行预测【英文标题】:How to perform prediction with a trained model in Keras 【发布时间】:2020-02-27 04:19:19 【问题描述】:我是 Keras 的新手。通过在线教程之后的迁移学习,我尝试为我的自定义数据集训练模型,下面是我的代码。现在我应该如何执行给定图像的分类?
这是训练代码:
def build_finetune_model(base_model, dropout, fc_layers, num_classes):
for layer in base_model.layers:
layer.trainable = False
x = base_model.output
x = Flatten()(x)
for fc in fc_layers:
# New FC layer, random init
x = Dense(fc, activation='relu')(x)
x = Dropout(dropout)(x)
# New softmax layer
predictions = Dense(num_classes, activation='softmax')(x)
finetune_model = Model(inputs=base_model.input, outputs=predictions)
return finetune_model
train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
train_generator = train_datagen.flow_from_directory(TRAIN_DIR,
target_size=(HEIGHT, WIDTH),
batch_size=BATCH_SIZE)
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(HEIGHT, WIDTH, 3))
root=TRAIN_DIR
class_list = [ item for item in os.listdir(root) if os.path.isdir(os.path.join(root, item)) ]
print (class_list)
FC_LAYERS = [1024, 1024]
dropout = 0.5
finetune_model = build_finetune_model(base_model, dropout=dropout, fc_layers=FC_LAYERS, num_classes=len(class_list))
adam = Adam(lr=0.00001)
finetune_model.compile(adam, loss='categorical_crossentropy', metrics=['accuracy'])
filepath="./checkpoints/" + "MobileNetV2_epoch:02d_acc:.2f" +"_model_weights.h5"
checkpoint = ModelCheckpoint(filepath, monitor=["acc"], verbose=1, mode='max', save_weights_only=True)
callbacks_list = [checkpoint]
history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8,
steps_per_epoch=steps_per_epoch,
shuffle=True, callbacks=callbacks_list)
这是我的分类代码,它只返回一个浮点数数组!
if __name__ == '__main__':
model = load_model('ResNet50_model_weights.h5')
img_path = 'test.jpg'
img = image.load_img(img_path, target_size=(300, 300))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
print('Input image shape:', x.shape)
results = model.predict(x)
print('Predicted:', results)
【问题讨论】:
【参考方案1】:您的模型的最后一层是softmax
,这意味着它会输出介于 0 和 1 之间的每个类别的概率。为了判断输入图像被预测为哪个类别,请取argmax
的结果。 argmax
返回数组中最大元素的索引。
predicted_class_label = np.argmax(results)
print("network predicted input image is class ".format(predicted_class_label))
【讨论】:
谢谢。但是我不能得到类的真实名称而不是索引吗?!如何得到它?我们没有decode_predictions(preds)
吗?
我不确定您使用的是什么数据集。通常,您定义从索引到实名的映射。您正在使用多少个类以及如何对标签进行编码?
我从当前目录中的文件夹中读取名称(上面的代码!)。所以模型不记得真名了?!
另一个问题:我有第二个模型MobileNetV2
,唯一的区别是我在训练中选择了save_weights_only=True
。但它不起作用。需要进行任何更改吗?
您需要将网络的最后一层更改为拥有 1 个节点,并且激活需要从 softmax
更改为 sigmoid
。我无法在不了解更多信息的情况下调试KeyError
- 也许发布堆栈跟踪。此外,要将名称分配给类标签,您必须定义从当前目录中的文件夹到整数的映射。以上是关于如何在 Keras 中使用经过训练的模型进行预测的主要内容,如果未能解决你的问题,请参考以下文章
如何使用由经过训练的神经网络创建的权重矩阵在另一个文件中进行预测?