Может ли Keras обрабатывать входные изображения разного размера?

#machine-learning #deep-learning #keras

#машинное обучение #глубокое обучение #keras

Вопрос:

Может ли Keras обрабатывать входные изображения разного размера? Например, в полностью сверточной нейронной сети входные изображения могут иметь любой размер. Однако нам нужно указать форму ввода, когда мы создаем сеть с помощью Keras. Поэтому, как мы можем использовать Keras для работы с различными размерами входных данных, не изменяя размер входных изображений до одинакового размера? Спасибо за любую помощь.

Ответ №1:

ДА. Просто измените форму ввода на shape=(n_channels, None, None). Где n_channels — количество каналов во входном изображении.

Я использую серверную часть Theano, поэтому, если вы используете tensorflow, вам, возможно, придется изменить его на (None, None, n_channels)

Вы должны использовать:

input_shape=(1, Нет, Нет)

Ни один в форме не обозначает переменный размер. Обратите внимание, что не все слои будут работать с такими переменными размерами, поскольку для некоторых слоев требуется информация о форме (например, сглаживание). https://github.com/fchollet/keras/issues/1920

Например, используя функциональный API keras, ваш входной слой будет:

Для набора данных RGB

 inp = Input(shape=(3,None,None))
  

Для набора данных серого цвета

 inp = Input(shape=(1,None,None))
  

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

1. Привет, маз, у меня точно такая же проблема. Согласно вашим предложениям, означает ли это, что я могу использовать изображения разных размеров для обучения, и аналогичным образом я могу прогнозировать сегментирование для изображений разного размера.

2. Никогда не пробовал тренироваться с разными размерами изображений, но в идеале это должно работать. Однако при прогнозировании я попробовал это, и это работает (ymmv, конечно). В худшем случае вам придется загружать пакеты изображений одинакового размера.

3. Указание input_shape = c(None, None, 3) не сработало в keras. Это привело к ошибке: Error in normalize_shape(input_shape) : object 'None' not found

4. Я получаю следующую ошибку: ValueError: The channel dimension of the inputs should be defined. Found `None`. что вы рекомендуете?

5. На самом деле, обратите внимание на параметр data_format вашего слоя. Если ‘channels_first’, то используйте (n_channels, None, None), или если ‘channels_last’, то используйте (None, None, n_channels)

Ответ №2:

Реализация входных массивов произвольного размера с одинаковыми вычислительными ядрами может создать много проблем — например, на графическом процессоре вам нужно знать, какие большие буферы резервировать, и, в меньшей степени, сколько разворачивать ваши циклы и т. Д. Это основная причина, по которой Keras требует постоянных входных форм, с входными данными переменного размера слишком сложно иметь дело.

Это чаще всего происходит при обработке последовательностей переменной длины, таких как предложения в NLP. Общий подход заключается в установлении верхней границы размера (и обрезке более длинных последовательностей), а затем дополнении последовательностей нулями до этого размера.

(Вы также можете включить маскировку нулевых значений, чтобы пропустить вычисления в дополненных областях, за исключением того, что сверточные слои в Keras могут по-прежнему не поддерживать маскированные входные данные …)

Я не уверен, что для 3D-структур данных накладные расходы на заполнение не являются чрезмерно высокими — если вы начнете получать ошибки памяти, самый простой обходной путь — уменьшить размер пакета. Расскажите нам о своем опыте применения этого трюка к изображениям!

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

1. : Какой наиболее эффективный с точки зрения вычислений способ заполнения моих данных?

Ответ №3:

Просто используйте None при указании формы ввода. Но я до сих пор не знаю, как передавать изображения разной формы в fit функцию.

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

1. Я думаю, это уже объяснено в самом популярном ответе

2. @aaossa да, это так.