我正在使用预训练的 VGG19 来训练模型。在训练时,我的准确率约为 92%(训练和验证)。
vgg19 = VGG19(input_shape=IMAGE_SIZE, weights='imagenet', include_top=False)
for layer in vgg19.layers:
layer.trainable = False
x = Flatten()(vgg19.output)
prediction = Dense(len(folders), activation='softmax')(x)
model = Model(inputs=vgg19.input, outputs=prediction)
model.compile(loss='categorical_crossentropy',
optimizer=tf.keras.optimizers.Adam(
learning_rate=0.0005,
name="Adam"),
metrics=['accuracy']
)
r = model.fit_generator(
training_set,
validation_data=test_set,
epochs=20,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)
predictions = model.predict(test_set, steps = test_set.n // 31, verbose=1)
y_pred = []
for i in predictions:
y_pred.append(int(np.argmax(i)))
y_pred = np.asarray(y_pred)
但是,在预测时,我的准确率仅为 52.33%。
有人可以告诉我我在这里做错了什么吗? 谢谢!
你的算法似乎缺乏泛化能力。原因之一可能是您用于训练的数据集的大小。更大的数据集,更好的泛化
解决这个问题的方法是:
test_set = test_datagen.flow_from_directory('/content/drive/MyDrive/dataset/Test',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical',
shuffle=False)
我没有在
shuffle=False
中添加 flow_from_directory
,默认情况下保留 shuffle=True
,这就是我在预测时准确性较低的原因。
我希望它能帮助任何犯同样错误的人!
我也长期面临同样的问题。为了增加训练样本,我离线增加了数据。就我而言,我在 model.predict() 中传递模型在训练时已经看到的相同图像。我的训练集由增强图像 + 原始图像组成,但是当我检查原始图像的预测时,得到的预测准确度仅为 61%。我的模型性能如下。
0级: 精度:0.991 召回率:0.999 F1 分数:0.995
第一类: 精度:0.997 召回率:1.000 F1 分数:0.999
第二类: 精度:0.999 召回率:0.993 F1 分数:0.996
第3类: 精度:1.000 召回率:0.996 F1 分数:0.998
整体准确度:0.991 总损失:0.024
如果我使用训练中使用的相同图像,那么与验证集相比,model.predict 应该给出接近的准确度。为什么这么低?
任何立即回复将不胜感激!