7

Почему я запутался:Почему перестановка моей проверки в Keras меняет производительность моей модели?

Если я проверить свою модель на примерах [A, B, C], он получит определенную точность. Если я тестирую ту же модель на примерах [C, B, A], она должна получить такую ​​же точность. Другими словами, перетасовка примеров не должна изменять точность моей модели. Но это то, что, кажется, происходит следующим образом:

Шаг за шагом:

Вот где я тренируюсь модель:

model.fit_generator(batches, batches.nb_sample, nb_epoch=1, verbose=2, 
        validation_data=val_batches, 
        nb_val_samples=val_batches.nb_sample) 

Вот где я проверить модель, без перетасовки набор проверки:

gen = ImageDataGenerator() 
results = [] 
for _ in range(3): 
    val_batches = gen.flow_from_directory(path+"valid", batch_size=batch_size*2, 
              target_size=target_size, shuffle=False) 
    result = model.evaluate_generator(val_batches, val_batches.nb_sample) 
    results.append(result) 

Вот результаты (val_loss, val_acc):

[2.8174608421325682, 0.17300000002980231] 
[2.8174608421325682, 0.17300000002980231] 
[2.8174608421325682, 0.17300000002980231] 

Обратите внимание, что точность проверки одинакова.

Вот где я проверить модель, с перемешиваются набора проверки:

results = [] 
for _ in range(3): 
    val_batches = gen.flow_from_directory(path+"valid", batch_size=batch_size*2, 
              target_size=target_size, shuffle=True) 
    result = model.evaluate_generator(val_batches, val_batches.nb_sample) 
    results.append(result) 

Вот результаты (val_loss, val_acc):

[2.8174608802795409, 0.17299999999999999] 
[2.8174608554840086, 0.1730000001192093] 
[2.8174608268737793, 0.17300000059604645] 

Обратите внимание, что в точности проверки не соответствуют, несмотря на неизменный набор валидации и неизмененную модель. Что происходит?


Примечание:

Я оценка по всей проверке набора каждый раз. model.evaluate_generator возвращает после оценки модели число примеров, равное val_batches.nb_sample, что является числом примеров в наборе проверки.

+0

Вы уверены, что набор валидаций неизменен каждый раз? Если вы каждый раз перетасовываете и сублимируете данные каждый раз, этот набор может отличаться на каждой итерации в тестовом цикле. – bnaecker

+0

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

+0

Я не подбираю данные. 'valu_generator' возвращает после оценки модели на примерах' val_batches.nb_sample', что является общим числом примеров в наборе валидации. Это слишком неявно. Я сделаю это более явным в пошаговом руководстве. Спасибо. –

ответ

9

Это действительно интересная проблема. Ответ заключается в том, что из-за того, что нейронные сети используют формат float32, который не так точен, как float64 - флуктуации, подобные этому, являются просто реализацией явления недостаточного потока.

В этом случае ваша потеря - вы можете заметить, что различия происходят после 7-й десятичной цифры дробной части - точная точность формата float32. Итак - в принципе - вы можете предположить, что все числа, представленные в вашем примере, равны в представлении float32.

+0

Предполагая, что это проблема с переполнением, почему настройка 'shuffle = True' вызывает несогласованность при установке' shuffle = False'? Во всяком случае, я думаю, что ты прав. Из Википедии: «не более 9 значащих десятичных цифр могут быть сохранены», и я вижу, что для точности несоответствия начинаются с десятичной десятичной цифры. Я немного смущен о значениях потерь (первый столбец). Почему несоответствия начинаются с 8-й десятичной цифры там, но начинаются с десятичной десятичной цифры для точности (вторая колонка)? –

+0

Значительные десятичные цифры относятся к целой части вашего номера. Для дробной части ваша точность составляет ~ 7.25 цифр (это в той же статье) –

+0

Я не решался принять этот ответ, потому что забыл, что мой вопрос: «Почему перетасовывание моей проверки в Keras меняет производительность моей модели?» а не «Почему перетасовка моей проверки в Keras вызывает проблему с переполнением?» Этот ответ ответил на исходный вопрос, подразумевая: «Это не так. Производительность вашей модели такая же». И если я хочу ответить на новый вопрос, я должен задать новый вопрос. –

Смежные вопросы