Я создаю 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'sfilters
> ....
и установка 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"
, но я могу изменить ее позже!
Нет, это не на первом слое, а на средних слоях. Я возьму код модели через секунду.
Каналы_последний и канал_первый относятся к настраиваемому параметру image_data_format в Керасе, он не имеет ничего общего с первым или последним слоями.
Ах хорошо; тем не менее, не будут ли средние слои иметь глубину, равную filters
, а также ширину и высоту, определяемые предыдущей сверткой? Другими словами, почему channels_first
или channels_last
влияют на это, если размеры частично задаются автоматически, а частично через именованный параметр?
О, фрагмент кода модели добавлен! Спасибо!
изменение data_format меняет способ интерпретации данных, у вас есть data_format = "channels_first" на первом уровне, почему? Если вы не знаете, что он делает, не меняйте значение по умолчанию.
У меня есть этот набор, так что input_shape
будет интерпретироваться так, как я хочу (сначала каналы, затем размеры изображения — как вы видите, у меня есть (3, iX, iY)
). Согласно документам, именно так он и используется. Что он делает с промежуточными слоями?
Нет, это неправильное использование, чтобы это работало, вам нужно изменить data_format для каждого слоя в модели.
А, понял. Документы Keras, которые я видел, не прояснили этого. Спасибо! Какой является по умолчанию? Я думал channels_first
было по умолчанию. Очевидно, что если я сделаю это неправильно, я просто заменю эту ошибку, думая, что у меня есть крошечный, очень разноцветный ввод ....
Ваша посылка неверна, это не так в общем случае. Это происходит только в том случае, если вы возитесь с параметром image_data_format
keras (в ~/.keras/keras.kson
) или с параметром data_format
для каждого слоя.
Изменение этого параметра согласованным образом (только в некоторых слоях) полностью испортит интерпретацию данных, поскольку он изменяет положение измерения каналов, которое может быть интерпретировано как одно из пространственных измерений. для бэкенда TF (это означает, что input_shape
в верхнем слое должен быть кортежем формы (width, height, channels)
).
Если установлено значение по умолчанию, могу ли я полагаться на то, что Keras сначала правильно интерпретирует input_shape
каналы? В качестве альтернативы, исправит ли это установка data_format
в промежуточных слоях?
@AndrewWyld все фигуры по умолчанию Channel_last, если вы используете бэкэнд TensorFlow. Гораздо проще изменить форму ваших данных, чтобы измерение каналов было в конце, чем вместо этого пытаться заставить Keras использоватьchannelst_first
Ах, спасибо. Странно, что это не распространяется, но эй-хо!
Пожалуйста, добавьте автономный пример, который воспроизводит ошибку. Для меня это звучит как путаница междуchannels_last иchannels_first