Правильно ли я понимаю batch_size в Keras? - PullRequest
1 голос
/ 18 марта 2019

Я использую встроенный в Keras inception_resnet_v2 для обучения CNN распознаванию изображений. При обучении модели в качестве входных данных используется массив данных с формой ввода (1000, 299, 299, 3),

 model.fit(x=X, y=Y, batch_size=16, ...) # Output shape `Y` is (1000, 6), for 6 classes

Сначала, пытаясь предсказать, я передал одно изображение формы (299, 299, 3), но получил ошибку

ValueError: Ошибка при проверке ввода: ожидалось, что input_1 будет иметь 4 измерения, но получил массив с формой (299, 299, 3)

Я изменил свой ввод с помощью:

x = np.reshape(x, ((1, 299, 299, 3)))

Теперь, когда я предсказываю,

y = model.predict(x, batch_size=1, verbose=0)

Я не получаю сообщение об ошибке.

Я хочу убедиться, что правильно понимаю batch_size как в обучении, так и в прогнозировании. Мои предположения:

1) При model.fit Keras получает batch_size элементов из входного массива (в данном случае он работает через мои 1000 примеров по 16 выборок за раз)

2) При model.predict я должен изменить свой ввод в виде единого трехмерного массива, и я должен явно установить batch_size в 1.

Это правильные предположения?

Кроме того, было бы лучше (возможно, даже) предоставить обучающие данные для модели, чтобы такого рода изменение формы до прогнозирования не было необходимым? Спасибо за помощь в изучении этого.

1 Ответ

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

Нет, вы ошиблись. batch_size указывает, сколько примеров данных «пересылается» по сети за один раз (обычно с использованием графического процессора).

По умолчанию это значение установлено на 32 внутри model.predict метода, но вы можете указать иное (как вы сделали с batch_size=1). Из-за этого значения по умолчанию вы получили ошибку:

ValueError: Ошибка при проверке ввода: ожидается, что input_1 будет иметь 4 размеры, но получили массив с формой (299, 299, 3)

Вы не должны изменять данные таким образом, вместо этого вы должны указать правильный размер пакета.

Скажем, для случая по умолчанию вы должны передать массив формы (32, 299, 299, 3), аналогичный для различных batch_size, например, с batch_size=64 эта функция требует, чтобы вы пропустили ввод формы (64, 299, 299, 3.

EDIT:

Кажется, вам нужно преобразовать один образец в партию. Я бы посоветовал вам использовать np.expand_dims для улучшения читабельности и переносимости вашего кода, например:

y = model.predict(np.expand_dims(x, axis=0), batch_size=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...