#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. Обновил свой ответ, теперь все должно быть в порядке, извините за шум.