Оценка обучения и проверки высокая, но очень низкая точность теста

Я работаю над классификацией изображений с несколькими метками, я использую начальную сеть в качестве базовой архитектуры. после полного обучения, которое я получаю, точность обучения> 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']]

Все выглядит хорошо, но все же у меня очень плохой прогноз. kidly помогите мне выбраться, где я делаю ошибки.


person Mithilesh    schedule 15.02.2019    source источник


Ответы (1)


Может случиться так, что изображения в вашем наборе данных расположены таким образом, что тестовые изображения ранее не были видны модели, и поэтому точность значительно снижается.

Я рекомендую вам попробовать использовать К-образный крест проверка или даже Стратифицированный K-кратная перекрестная проверка. Преимущество здесь в том, что ваш набор данных будет разделен, скажем, на 10 «пакетов». На каждой итерации (из 10) одна партия будет тестовой, а все остальные - тренировочными. На следующей итерации, тестовая партия из предыдущего шага становится партией поездов, а другая партия становится тестовой партией. Важно отметить, что каждая партия будет тестовой только один раз. Еще одно преимущество стратифицированного K-сгиба состоит в том, что он учитывает метки классов и пытается разбить классы таким образом, чтобы каждая партия имела примерно одинаковое распределение классов.

Еще один способ добиться лучших результатов - просто перемешать изображения и выбрать обучающие, а затем протестировать.

person Novak    schedule 15.02.2019