Правильно ли я понимаю batch_size в Keras?

#python #tensorflow #machine-learning #keras #conv-neural-network

#python #тензорный поток #машинное обучение #keras #conv-нейронная сеть

Вопрос:

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

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

Сначала, пытаясь предсказать, я передал единственное изображение shape (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 я должен преобразовать свой ввод в единый 3D-массив, и я должен явно установить batch_size значение 1.

Верны ли эти предположения?

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

Ответ №1:

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

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

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

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

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

Редактировать:

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

 y = model.predict(np.expand_dims(x, axis=0), batch_size=1)
  

Комментарии:

1. Спасибо — Я почти понимаю, но вы хотите сказать, что с тех пор, как я обучил свою сеть с помощью shape (1000, 299, 299, 3), ожидается, что размер пакета будет model.predict равен 1000? Поскольку я предсказываю только одно изображение за раз, должен ли я переучиваться с другим model.fit batch_size, равным 1?

2. Нет, по умолчанию он ожидает размер пакета 32 . Это не имеет ничего общего с тем, на какой модели размера пакета была обучена. Просто укажите batch_size равно 1 в вашем predict методе, из того, что я понял, вам нужно выполнить изменение формы, как вы, к сожалению, делаете.

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