当前位置: 首页 > 面试题库 >

无法在Keras中使用VGG19预测单个图像的标签

澹台逸明
2023-03-14
问题内容

根据[本教程](https://towardsdatascience.com/keras-transfer-learning-for-
beginners-6c9b8b7143e

),我正在使用转移学习方法在Keras中使用按训练的VGG19模型。它显示了如何训练模型,但没有显示如何为预测准备测试图像。

在评论部分中说:

获取图像,使用相同的preprocess_image函数预处理图像,然后调用model.predict(image)。这将为您提供该图像上模型的预测。使用argmax(prediction),您可以找到图像所属的类。

我找不到preprocess_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)

IPython:

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)

IPython提示中的最后一行导致以下错误:

ValueError: `decode_predictions` expects a batch of predictions (i.e. a 2D array of shape (samples, 1000)). Found array with shape: (1, 12)

我应该如何正确输入测试图像并获得预测?


问题答案:

decode_predictions用于根据ImageNet数据集中具有1000个类别的类别标签对模型的预测进行解码。但是,您经过微调的模型只有12个类。因此,decode_predictions在这里使用没有意义。当然,您必须知道这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]])


 类似资料:
  • 我需要帮助来识别边界,并将图像与原始图像进行比较。我需要指导如何我可以实现这通过处理或matlab或任何初学者。例如,请看下面的图像。 原始图像:

  • 问题内容: 一般来说,我只是从keras和机器学习开始。 我训练了一个模型来对2类图像进行分类,并使用进行保存。这是我使用的代码: 它成功地以0.98的准确度进行了训练,相当不错。为了在新图像上加载并测试该模型,我使用了以下代码: 它输出: [[0]] 为什么不给出类的实际名称,为什么? 提前致谢。 问题答案: keras Forecast_classes(docs)输出类别预测的numpy数组。

  • 我使用滑翔库来显示网格视图中的图像,但是在我的图像视图中显示了注释。 E/Glide:class com。邦普泰克。滑行负载发动机GlideException:无法加载资源 我的代码在使用位图时工作正常。这是我的密码:

  • 上传图像做预测时出错消息 ValueError:层block1\u conv1的输入0与层不兼容:输入形状的ed轴-1应具有值3,但接收到带有形状的输入[无,2 24,224,4] 代码处理/图像预处理 def model\U predict(img,模型):img=img。调整大小((224224)) 培训课程的产出 flow/compiler/xla/service/service.cc:17

  • 我想训练CNN使用Keras从图像预测矩阵(热图)。我的想法是微调keras提供的预训练网络(resnet、Exception、vgg16等)。 第一步是用预先训练好的顶层替换满足问题约束的顶层。我试图预测数值范围为0到1的热图图像。因此,我希望网络的输出为矩阵。我相信如果我使用,然后使用层,我将失去我不想要的空间信息(对吧?)。 我希望我的代码是灵活的,能够独立于正在使用的预训练体系结构运行(我

  • 在keras中安装神经网络之前,我正在处理我的图像。我希望在预处理后但在训练模型之前看到图像的样子(这样我可以确保预处理正确)。下面的命令生成一个对象并将其存储在train_image_array_gen中。但是,当我尝试访问每个图像时,它们存储为多维像素矩阵。如何直观地显示每个像素矩阵?