首页 > 解决方案 > Keras 模型预测同一类

问题描述

我是深度学习领域的新手,我试图训练一个图像分类模型。我使用了预训练模型 (ResNet50) 并添加了自己的层。我用于训练的数据集包含每个类的大约 1000 张图像,我将其分为训练集和测试集。我的问题是,如果我评估模型,model.evaluate(test_set_generator)我会得到大约 90% 的准确度

如果我加载图像并预测model.predict(img)结果总是相同的类

我的发电机:

img_height = 128
img_width = 128

train_datagen = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)


train_generator = train_datagen.flow_from_directory(
    data_dir_path,
    target_size=(img_height, img_width),
    batch_size=16,
    shuffle=True,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    test_dir_path,
    target_size=(img_height, img_width),
    batch_size=16,
    class_mode='categorical')

我的模型:

    base_model = tf.keras.applications.ResNet50(input_shape=(img_height,img_width,3),
                                                   include_top=False,
                                                   weights='imagenet')
    prediction_layer = tf.keras.layers.Dense(5)

    model = models.Sequential()
    model.add(base_model)
    model.add(tf.keras.layers.GlobalAveragePooling2D())
    model.add(prediction_layer)

    base_learning_rate = 0.0005
    model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=base_learning_rate),
                  loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                  metrics=['accuracy'])

我如何加载图像:

test_image = image.load_img(path_to_image, target_size=(128, 128))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)

我试图从我的测试集中加载和预测每张图像,我总是得到相同的结果(这是一个小输出,但或多或​​少每个输出看起来都一样):

 [[ -38774.88  -228962.86    20932.826 -169404.3   -265980.06 ]]
 [[ -54851.016 -320424.4     31585.99  -236997.28  -374307.2  ]]
 [[ -36518.344 -212326.48    18832.361 -156810.19  -244721.2  ]]
 [[ -31010.965 -196458.73    19816.562 -146228.39  -230922.06 ]]
 [[ -37712.95  -222710.1     19780.334 -164643.36  -256392.48 ]] 

我不明白为什么评估得到正确的结果而预测却没有。我预测了 test_set_generatormodel.predict(test_set_generator)并且得到了对我来说看起来不错的结果。结果并不总是相同的。

我试图改变学习率、更多层、一个 dropout 层、不同数量的 epoch 和每个 epoch 的步数、不同的预训练模型和不同的批量大小。

我很感谢任何建议

标签: pythontensorflowmachine-learningkeras

解决方案


您的模型期望图像值在 (0, 1) 范围内。

尝试:

test_image = image.load_img(path_to_image, target_size=(128, 128))
test_image = image.img_to_array(test_image) / 255  # < - division by 255
test_image = np.expand_dims(test_image, axis=0)

推荐阅读