训练和验证分数很高,但测试准确性很差

时间:2019-02-15 07:00:53

标签: python tensorflow keras deep-learning multilabel-classification

我正在研究多标签图像分类,我正在使用Inception Net作为我的基本体系结构。 经过完整的训练后,我的训练准确度> 90%,验证准确度> 85%,但是我在测试数据上的准确度达到17%。

模型训练->

model = Model(pre_trained_model.input, x)
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(lr=0.0001),#'adam'
              metrics=['acc'])
    history = model.fit_generator(
      train_generator,
      steps_per_epoch=600,#total data/batch size
      epochs=100,
      validation_data=validation_generator,
      validation_steps=20,
      verbose=1,callbacks = callbacks)

在经过训练的模型上进行测试:

test_generator = test_datagen.flow_from_directory(
    test_dir,target_size=(128, 128),batch_size=1,class_mode='categorical')

filenames = test_generator.filenames
nb_samples = len(filenames)

prediction = test_model.predict_generator(test_generator,steps=nb_samples,verbose=1)

将结果保存到熊猫

predicted_class_indices = np.argmax(prediction,axis=1)
labels = (train_generator.class_indices) #geting names of classes from folder structure
labels = dict((v,k) for k,v in labels.items())
predictions = [k for k in predicted_class_indices]

results=pd.DataFrame({"image_name":filenames,
                      "label":predictions})
results['image_name'] = [each.split("\\")[-1] for each in results['image_name']]

一切看起来都不错,但我的预测仍然很差。 小子帮我搞错了,我在哪里犯错。

1 个答案:

答案 0 :(得分:0)

在这种情况下,数据集中的图像排列方式可能会使模型以前看不到测试图像,因此准确性会大大下降。

我建议您尝试使用K-fold cross validation甚至Stratified K-fold cross validation。这样做的好处是您的数据集将被分割成10个“批次”。每次迭代(每10个迭代中)一个批次将成为测试批次,其他所有批次将成为训练批次。下一个迭代,即上一步中的测试批次将成为训练批次,而其他一些批次将成为测试批次。重要的是要表示每个批次只能是一次测试批次。分层K折的另一个好处是,它将考虑类别标签,并尝试以使每批具有大致相同的类别分布的方式拆分类别。

获得更好结果的另一种方法是只对图像进行混洗,然后选择训练图像并进行测试。