В последовательной модели Keras Conv2D требует, чтобы ядро ​​было уже, чем предыдущий слой толстым.Зачем? - PullRequest
0 голосов
/ 30 мая 2019

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

Мое понимание таково:

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

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

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

Размер отрицательного размера, вызванный вычитанием 3 из 1 для 'conv2d_2 / convolution' (op: 'Conv2D') с входными формами [?, 1,1022,1022], [3,3,1022,1]

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

Отрицательный размерный размер, вызванный вычитаниемот....

и установка 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", но я могу изменить ее позже!

1 Ответ

0 голосов
/ 30 мая 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...