В модели Keras Sequential Conv2D, по-видимому, требует, чтобы ядро ​​было уже, чем толстый предыдущий слой. Почему?

Я создаю Sequential модель в Keras, которая берет цветное изображение и сворачивает его через несколько Conv2D слоев примерно того же размера и формы, что и верхний слой (в основном, за вычетом краев, срезанных извилинами).

Мое понимание заключается в следующем:

kernel_size указывает размер патча для каждого входа свертки filters указывает глубину слоя для каждого вывода свертки.

Затем я делаю некоторые другие вещи после извилин, которые здесь не имеют значения.

Однако, когда я попытался скомпилировать свою модель перед ее тестированием на небольшом количестве данных, я обнаружил, что Tensorflow жалуется, когда я пытаюсь сделать kernel_size для данного слоя больше, чем filters для предыдущего слоя. На самом деле это не так; вместо этого он говорит

Negative dimension size caused by subtracting 3 from 1 for 'conv2d_2/convolution' (op: 'Conv2D') with input shapes [?,1,1022,1022], [3,3,1022,1]

что не совсем информативно. Однако я заметил, что цифры, которые он ставит, соответствуют

Negative dimension size caused by subtracting <this layer's kernel_size> from <previous layer's filters> ....

и установка filters выше остановила ошибку.

Мой вопрос: почему это должно быть? Я думал, что filters указал глубина, а kernel_size указал ширина. Не должно быть необходимости подгонять заплатку свертки в толщину предыдущего слоя. Более того, эта проблема не возникает на первом слое, чья глубина канала (которая, как я понимаю, фактически эквивалентна filters) равна 3.

Это ошибка, или я неправильно истолковываю значение этих параметров или что-то еще?

Фрагмент кода:

__model = Sequential()

# feature layers
__model.add(Conv2D(input_shape=(3, iX, iY), data_format = "channels_first", kernel_size=kernelfilters[0][0],
                   filters=kernelfilters[0][1], activation=ACTIVATION))

for kernelfilter in kernelfilters:
    __model.add(Conv2D(kernel_size=kernelfilter[0], filters=kernelfilter[1], activation=ACTIVATION))

Последняя строка та, что обрывается.

Каждый kernelfilter в массиве kernelfilters представляет собой пару чисел, определяющих значение kernel_size и filters в указанном порядке. iX и iY — исходные размеры изображения. ACTIVATION — константа, в настоящее время установлена ​​на "relu", но я могу изменить ее позже!

Пожалуйста, добавьте автономный пример, который воспроизводит ошибку. Для меня это звучит как путаница междуchannels_last иchannels_first

Dr. Snoopy 30.05.2019 13:37

Нет, это не на первом слое, а на средних слоях. Я возьму код модели через секунду.

Andrew Wyld 30.05.2019 13:39

Каналы_последний и канал_первый относятся к настраиваемому параметру image_data_format в Керасе, он не имеет ничего общего с первым или последним слоями.

Dr. Snoopy 30.05.2019 13:39

Ах хорошо; тем не менее, не будут ли средние слои иметь глубину, равную filters, а также ширину и высоту, определяемые предыдущей сверткой? Другими словами, почему channels_first или channels_last влияют на это, если размеры частично задаются автоматически, а частично через именованный параметр?

Andrew Wyld 30.05.2019 13:46

О, фрагмент кода модели добавлен! Спасибо!

Andrew Wyld 30.05.2019 13:46

изменение data_format меняет способ интерпретации данных, у вас есть data_format = "channels_first" на первом уровне, почему? Если вы не знаете, что он делает, не меняйте значение по умолчанию.

Dr. Snoopy 30.05.2019 13:47

У меня есть этот набор, так что input_shape будет интерпретироваться так, как я хочу (сначала каналы, затем размеры изображения — как вы видите, у меня есть (3, iX, iY)). Согласно документам, именно так он и используется. Что он делает с промежуточными слоями?

Andrew Wyld 30.05.2019 13:49

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

Dr. Snoopy 30.05.2019 13:50

А, понял. Документы Keras, которые я видел, не прояснили этого. Спасибо! Какой является по умолчанию? Я думал channels_firstбыло по умолчанию. Очевидно, что если я сделаю это неправильно, я просто заменю эту ошибку, думая, что у меня есть крошечный, очень разноцветный ввод ....

Andrew Wyld 30.05.2019 13:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
179
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша посылка неверна, это не так в общем случае. Это происходит только в том случае, если вы возитесь с параметром image_data_format keras (в ~/.keras/keras.kson) или с параметром data_format для каждого слоя.

Изменение этого параметра согласованным образом (только в некоторых слоях) полностью испортит интерпретацию данных, поскольку он изменяет положение измерения каналов, которое может быть интерпретировано как одно из пространственных измерений. для бэкенда TF (это означает, что input_shape в верхнем слое должен быть кортежем формы (width, height, channels)).

Если установлено значение по умолчанию, могу ли я полагаться на то, что Keras сначала правильно интерпретирует input_shape каналы? В качестве альтернативы, исправит ли это установка data_format в промежуточных слоях?

Andrew Wyld 30.05.2019 13:51

@AndrewWyld все фигуры по умолчанию Channel_last, если вы используете бэкэнд TensorFlow. Гораздо проще изменить форму ваших данных, чтобы измерение каналов было в конце, чем вместо этого пытаться заставить Keras использоватьchannelst_first

Dr. Snoopy 30.05.2019 13:52

Ах, спасибо. Странно, что это не распространяется, но эй-хо!

Andrew Wyld 30.05.2019 13:55

Другие вопросы по теме