Как действительно работает функция evaluate
и что именно она возвращает?
Вот определение интерфейса для evaluate
из документации (от tf.keras.models.Model
).
evaluate(
x=None,
y=None,
batch_size=None,
verbose=1,
sample_weight=None,
steps=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
В документации сказано, что функция возвращает значение потерь и значения метрик для модели в тестовом режиме.
И здесь имеют значение 2 параметра:
batch_size : целое число или нет. Количество образцов на обновление градиента. Если
не указано, batch_size будет по умолчанию 32. Не указывайте
batch_size, если ваши данные представлены в виде символических тензоров, набор данных,
итераторы набора данных, генераторы или экземпляры keras.utils.Sequence
(так как они генерируют партии).
шагов : целое число или нет. Общее количество шагов (партий образцов)
перед объявлением оценочного тура закончен. Игнорируется с
значение по умолчанию Нет.
Документация для меня немного расплывчата. Я не понимаю, что подразумевается под набором данных в предложении «Не указывайте
batch_size, если ваши данные представлены в виде символических тензоров, набор данных .... "
В моем случае, моя модель имеет несколько входов, а вход x
представляет собой список массивов. Мой х выглядит следующим образом:
print(len(x)) returns 4
print(x[0].shape) returns (128, 9, 16)
Важно то, что в наборе данных (который представляет собой набор поездов в этом примере) содержится 128 примеров.
Хотя это так, меня очень смущает вопрос о том, как мне следует вызывать функцию оценки? Мне особенно интересно, как мне установить параметры batch_size и steps .
Я могу запустить его следующим образом:
Альтернатива 1:
train_metrics = saved_model.evaluate(x = train_x,
y = train_y,
batch_size = None,
steps = None)
Или я могу запустить его следующим образом:
Альтернатива 2:
train_metrics = saved_model.evaluate(x = train_x,
y = train_y,
batch_size = 64,
steps = None)
В чем разница между 2 альтернативами, учитывая, что у меня есть набор данных в формате, который я описал выше. На самом деле я ожидаю увидеть тот же результат (особенно «потери»), так как функция оценки должна просто один раз пройти через данный набор данных и вернуть результат для всего набора данных. Но этого не происходит. 2 вышеупомянутые альтернативы дают совершенно разные результаты.
Кто-нибудь ясно знает, в чем разница между этими двумя вызовами?
Я тоже пытался проверить код, но не смог разобраться в деталях.