我是深度学习领域的新手,我尝试训练一个图像分类模型。 我使用了一个预训练模型 (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 ]] 

我不明白为什么评估得到正确的结果而预测却没有。 我用model.predict(test_set_generator)预测了 test_set_generator 并且得到了对我来说很好的结果。 结果并不总是一样的。

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

我很感谢任何建议

#1楼 票数:3 已采纳

您的模型期望图像值在 (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)

#2楼 票数:0

您的代码中有两个错误:

  • 首先当你调用一个没有激活参数的Dense层时,默认情况下它将是一个linear激活,在多类问题中我们需要一个softmax激活
prediction_layer = tf.keras.layers.Dense(5, activation = "softmax")
  • 其次,损失,您使用的是binary_crossentropy ,一种用于二元分类的损失,但在这里我们再次遇到多类问题,因此您需要使用categorical_crossentropy损失
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=base_learning_rate),
                  loss=tf.keras.losses.CategoricalCrossentropy(),
                  metrics=['accuracy'])

  ask by Ludy translate from so

未解决问题?本站智能推荐:

1回复

Keras模型总是预测0

所以我有类似(10000, 178, 178, 3)形状的数据(10000, 178, 178, 3)其中我有 10000 个样本,每个样本有 3 个不同的颜色通道(不是 RGB 通道),其中我有大约8k标签为0样本,其余为 2k标签1 . 这是我的示例数据之一: 现在首先我试图通过颜色通道进行标准
2回复

烧瓶中加载的keras模型始终预测相同的类

奇怪的事情正在发生在我身上。 我使用 keras 训练了一个情感分析模型,如下所示: 当我将它加载到另一个 python 文件中时,一切都很好。 但是当我将它加载到 Flask Web 应用程序中时,所有预测的类都是正数。 出了什么问题? 这是我在 Flask Web 应用程序中使用的代码:
1回复

使用keras模型预测有问题

我使用 gtsrb 训练了一个神经网络并尝试使用保存的模型(.h5),但在使用model.predict时出现以下错误: 训练代码: 使用保存的模型对照片进行分类的代码
1回复

训练准确率高,但输入总是在kerasDNN模型中归为同一类

我在 3 个类上使用 Xception 架构和数据增强。 我的原始数据集在三个类中的每个类中都有 3 个图像,组织在一个目录中。 我的训练准确率收敛到 1.0000,但对 model.predict 的调用如下所示: 出于某种原因,总是选择第二类,这就是为什么我的 model.evaluate 准确
1回复

Keras模型预测给出了相反的结果

我在model_2中训练了一个名为model_2的模型,并使用model.predict进行了预测,但我注意到当我重新运行代码时,结果完全不同。 例如,第一column 0所有概率值都接近 1,但下次它的概率值都接近 0。这与我在其他帖子中看到的内存或stateful参数有关吗? 矛盾结果的例子:
1回复

无法编译Keras模型进行多类别预测

我的问题是这个问题的轻微延伸。 我的图像尺寸为256x256,而蒙版的尺寸为65536x4,因为我将其展平(重新排列阵列),并且有4个类,因此为4类。现在,我想训练一个U-net进行多类预测。 这是我的代码: 正如我所怀疑的那样,我无法正确地解释事实。 但是我不知道如何解决此问题。
1回复

Keras模型在评估时返回预测

我有一个包含多个字段的数据集,但只有两个与我的机器学习实现相关。 其余的不应考虑用于预测,但可能会揭示有趣的相关性。 调用model.evaluate时有没有办法返回预测结果? 例如:
2回复

训练模型后,从Keras/Tensorflow获取预测

我正在从事一个涉及神经机器翻译(将英语翻译为法语)的项目。 我已经在线研究了一些示例,现在已经完成了模型。 使用Keras训练模型后,如何在不再次训练整个模型的情况下获得翻译预测,因为使用的数据集很大,每个纪元都需要一些时间,所以我当然不能训练模型每次我想要翻译时。 那么,在不重新训练整个模型的情况