тензор потока керас оценивают функцию - PullRequest
0 голосов
/ 07 марта 2019

Как действительно работает функция 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 вышеупомянутые альтернативы дают совершенно разные результаты.

Кто-нибудь ясно знает, в чем разница между этими двумя вызовами?

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

1 Ответ

2 голосов
/ 07 марта 2019

Я не понимаю, что подразумевается под набором данных в предложении "Не указывайте batch_size, если ваши данные представлены в виде символических тензоров, набор данных ...."

Набор данных, указанный здесь, является экземпляром tf.data.Dataset().Набор данных уже определил batch_size.Мы определяем его следующим образом:

tf.data.Dataset.batch( batch_size )

Следовательно, в методе Keras evaluate аргумент не требуется.

Что такое аргумент steps?

Размер шага - это когда общее количество образцов делится на размер партии.Если у меня 1000 образцов и batch_size 50, то количество шагов будет 20 (1000/50).В большинстве случаев вам не нужно вводить аргумент steps.

Для 1-го варианта:

Размер партии установлен на Нет.Следовательно, будет использовано значение по умолчанию 32.Следовательно, здесь, согласно расчету, число шагов будет 4 (128/32).

Для 2-го варианта:

Размер партии установлен в 64.Следовательно, здесь, согласно расчету, количество шагов будет 2 (128/64).

Различия между альтернативами:

Обе альтернативы имеют разные размеры партии32 и 64. Следовательно, расчет потерь и точности будет другим.

...