Разница между Keras model.fit, использующим только batch_size и использующим только steps_per_epoch - PullRequest
0 голосов
/ 11 мая 2018

Когда я запускаю model.fit с использованием параметров batch_size и steps_per_epoch, я получаю следующую ошибку:

ValueError: If steps_per_epoch is set, the `batch_size` must be None.

Итак, из этой ошибки и из следующей части документации из keras Model (функциональный API)

batch_size: Целое число или нет. Количество образцов на обновление градиента. Если не указано, batch_size по умолчанию будет 32.

steps_per_epoch: Целое число или нет. Общее количество шагов (партий образцов) прежде чем объявить одну эпоху законченной и начать следующую эпоху. Когда тренируешься для входных тензоров, таких как тензоры данных TensorFlow, значение по умолчанию None равно числу выборок в вашем наборе данных, разделенному на размер пакета, или 1, если это невозможно определить.

Я понимаю, что оба параметра как-то эквивалентны. Но на моем ноутбуке (с графической картой GeForce 940M с 2 ГБ видеопамяти и обучением набора данных cifar10), когда я запускаю model.fit с параметром epochs, установленным на 256, сценарий работает нормально, а отзывы от keras выглядят так:

4608/50000 [=>............................] - ETA: 1:59 - loss: 0.8167 - acc: 0.7398

Обновление первого номера всегда с добавлением 256 единиц. Однако при передаче steps_per_epoch в качестве number_train // batch_size у меня заканчивается память, и я не могу запустить свой сценарий, пока не передам batch_size как 1.

Итак, как model.fit работает с этими параметрами? Какая разница, когда я использую только один из них вместо другого?

1 Ответ

0 голосов
/ 11 мая 2018

Хороший вопрос.Из исходного кода ( [1] и [2] ) я наблюдаю следующее:

  • Когда вы устанавливаете batch_size, данные тренировкинарезается на партии такого размера (см. L184 ).
  • Когда вы устанавливаете steps_per_epoch, если входные данные для обучения не являются тензорами, свойственными структуре (это наиболее распространенный случай), весь обучающий набор подается в сеть одним пакетом (см. L152 ), и поэтому вы получаете ошибку памяти.

ПоэтомуИсходя из этой реализации, я бы посоветовал использовать аргумент steps_per_epoch только при подаче через нативные тензоры (т. е. тензоры TensorFlow с первым размером, равным размеру пакета), и это действительно требование.Чтобы сделать это, аргументы x и y из model.fit должны быть установлены в None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...