Вопрос или проблема
Следующий код представляет собой небольшой фрагмент, но я пытаюсь понять результаты model.fit с обучающим и тестовым наборами данных по сравнению с результатами model.evaluate. Я не уверен, что они не совпадают, или я не понимаю, как читать результаты?
batch_size = 16
img_height = 127
img_width = 127
channel = 3 #RGB
train_dataset = image_dataset_from_directory(Train_data_dir,
shuffle=True,
batch_size=batch_size,
image_size=(img_height, img_width),
class_names = class_names)
## Код трансферного обучения из mobilenetV2/imagenet для создания модели
initial_epochs = 10
history = model.fit(train_dataset, validation_data=test_dataset, epochs=initial_epochs)
точность на обучающем наборе: 0.8030709732662548 из history.history['accuracy']
потери на обучающем наборе: 0.26204305738210676 из history.history['loss']
точность на тестовом наборе: 0.6920163252136924 из history.history['val_accuracy']
потери на тестовом наборе: 0.6397175192832947 из history.history['val_loss']
Ниже приведены размеры и типы данных наборов и как я передаю их в model.fit:
train_dataset: Найдено 5216 файлов, принадлежащих 2 классам.
<BatchDataset shapes: ((None, 127, 127, 3), (None,)), types: (tf.float32, tf.int32)>
test_dataset: Найдено 624 файла, принадлежащих 2 классам.
<BatchDataset shapes: ((None, 127, 127, 3), (None,)), types: (tf.float32, tf.int32)>
initial_epochs = 10
history = model.fit(train_dataset, validation_data=test_dataset, epochs=initial_epochs)
Затем я попытался проверить метод evaluate на тестовом наборе, и я не уверен, что делаю правильно, но кажется, что он не совпадает с результатами метода fit:
score = model.evaluate(test_dataset, verbose=0)
print(score)
print(f’Потери на тесте: {score[0]} / Точность на тесте: {score[1]}’)
Потери на тесте: 0.6872978806495667 / Точность на тесте: 0.7644230723381042
Должны ли результаты совпадать для методов fit и evaluate?
нашёл другой пост с тем же вопросом: https://stackoverflow.com/questions/44843581/what-is-the-difference-between-model-fit-an-model-evaluate-in-keras
Хотя я до сих пор не уверен, должны ли значения быть одинаковыми для набора данных валидации, если он был передан в методы fit и evaluate. Я слышал, что они могут быть не одинаковыми.
Если вы используете tf.keras.preprocessing.image.ImageDataGenerator
для загрузки данных, попробуйте установить shuffle=False
для тестовых данных.
.
Ответ или решение
Когда результаты методов model.fit
и model.evaluate
не совпадают, это может вызвать некоторое недоумение, особенно для новичков в глубоком обучении. Давайте разберемся, почему это происходит и действительно ли должно вызывать беспокойство.
Отличия между model.fit
и model.evaluate
1. Понимание ролей и атрибутов
Метод model.fit
предназначен для обучения модели. Он принимает тренировочный набор данных (train_dataset
) и валидационный набор данных (validation_data
, который обычно указывается для мониторинга метрик состояния модели на протяжении обучения). В ходе выполнения model.fit
, метрики и потери рассчитываются и отображаются для каждого эпизода обучения. Эти метрики включают accuracy
, loss
, val_accuracy
, и val_loss
.
Метод model.evaluate
, напротив, используется для оценки обученной модели. Он рассчитывает конечные метрики и потери на тестовом наборе данных, сразу после завершения обучения. Это более детальная проверка, которая не выполняется поэтапно, как при model.fit
.
2. Почему результаты могут различаться?
а. Отсутствие перемешивания тестовых данных: Если вы используете tf.keras.preprocessing.image.ImageDataGenerator
или аналогичный класс для загрузки данных, убедитесь, что вы не случайно перемешиваете тестовые данные. Валидационный датасет при model.fit
не перемешивается, если вы явно не указали это. Проверьте, что shuffle=False
для тестовых данных.
б. Различия в вычислениях: Иногда, вычислительное окружение может влиять на точность из-за численных ошибок и порядка вычисления. Хотя это редко играет значительную роль на высоком уровне точности, такие расхождения могут иметь место.
в. Различное количество батчей: Валидация при model.fit
может не покрыть весь валидационный набор, в отличие от model.evaluate
, который проходит по всем данным. Это может произойти, если данные не делятся ровно на батчи без остатка.
Должны ли результаты совпадать?
Теперь, меняется ли это ожидание в вашем случае? По сути, показатели валидации от model.fit
и model.evaluate
не обязаны быть идентичными из-за вышеупомянутых причин. Тем не менее, если расхождения велики, лучше перепроверить, соблюдаются ли все рекомендации для настройки вашего кода:
-
Убедитесь в консистентности данных: Проверьте, используется ли один и тот же набор данных и та же конфигурация для обоих методов. Перемешивание и распределение данных должны быть одинаковы.
-
Проверка параметров: Еще раз проверьте, что все важные параметры, влияющие на обучение и его мониторинг, не были изменены между вызовами методов.
-
Точные наборы данных: Убедитесь, что тестовый набор данных правильно сформирован и передан как в
validation_data
, так и вmodel.evaluate
.
То, что вы видите различие в вашем коде, с высокой долей вероятности связано с одной из перечисленных выше причин. Пусть эти небольшие расхождения не портят впечатления от вашего опыта работы с TensorFlow и Keras. Надеюсь, этот разбор поможет вам оптимизировать процесс и лучше понимать внутренние механизмы работы с моделями.