[英]Keras model predicts same class
我是深度学习领域的新手,我尝试训练一个图像分类模型。 我使用了一个预训练模型 (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 的步数、不同的预训练模型和不同的批次大小。
我很感谢任何建议
您的模型期望图像值在 (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)
您的代码中有两个错误:
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'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.