Keras 2DConvolution производит нелогичный выходной тензор - 32x32 изображение становится 32xn карт объектов, вместо 32x32xN
Согласно моему пониманию, 2D-свертка применяет N фильтров к входному изображению, производя N новых "изображений" (=карт объектов).
Если мы пренебрегаем шаговой / подвыборкой, изображение 32x32 становится тензором Nx32x32 после 2D-свертки с N каналами:
Однако, в Керрас, вход 32х32 производит выход 32xN. Итак, мой вопрос заключается в том, как применяется сокращение размеров? Есть ли еще один скрытый слой, вовлеченный в этот шаг?
И если это так, то разве не Сеть утрачивает способность видеть изображение таким, как оно есть - а именно двумерной сущностью?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Этот код может воспроизвести мои приведенные выше утверждения:
inputs = Input(shape=(1, 32, 32,))
shared = Convolution2D(nb_filter=10, nb_row=8, nb_col=8, subsample=(1, 1), border_mode='same', activation='relu')(inputs)
print("1 => ", inputs.shape)
print("2 => ", shared.shape)
Он производит - как мы применяем 10 фильтров (==N) к изображению в оттенках серого 32x32
1 => (?, 1, 32, 32)
2 => (?, 1, 32, 10)
Где ? это неопределенный размер пакета, а 1-количество входных каналов (будет 3 для RGB, 1 Для оттенков серого).
Вход имеет форму 32x32, как и ожидалось. Но тогда выход свертки имеет размеры 32xN вместо 32x32xN
2 ответа:
Это может быть из-за порядка входного формата.
Из Keras docs Conv2D берет этот парам
Таким образом, ваш (1, 32, 32) на самом деле является изображением 1x32 с 32 каналами. Переключитесь на (32, 32, 1) или установите аргумент data_format вData_format : строка, один из channels_last (по умолчанию) или channels_first. Упорядочение размеров во входных данных. channels_last соответствует входам с формой (пакет, высота, ширина, каналы), а channels_first соответствует входы с формой (партия, каналы, высота, ширина). По умолчанию используется формат image_data_format значение в водоснабжении конфиг файл на ~/.в водоснабжении/водоснабжении.формат JSON. Если ты никогда не устанавливайте его, тогда это будет "channels_last".
channels_first
.Подробнее об изменении поведения по умолчанию: https://keras.io/backend/ Вы можете использовать
keras.backend.image_data_format()
для получения настроек иset_image_data_format(data_format)
для установки либоchannels_first
, либоchannels_last
.Эта настройка существует потому, что Theo и TF обрабатывают упорядочение измерений по-разному и это зависит от того, что вы используете.
Нет, вы делаете что-то не так. Следующий код:
import keras from keras.layers import Input, Convolution2D from keras.models import Model inputs = Input(shape=(1, 32, 32,)) shared = Convolution2D(nb_filter=10, nb_row=8, nb_col=8, subsample=(1, 1), border_mode='same', activation='relu')(inputs) model = Model(inputs, shared) model.summary()
Выводит следующее:
____________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ==================================================================================================== input_1 (InputLayer) (None, 1, 32, 32) 0 ____________________________________________________________________________________________________ convolution2d_1 (Convolution2D) (None, 10, 32, 32) 650 input_1[0][0] ==================================================================================================== Total params: 650 ____________________________________________________________________________________________________
И вы можете видеть, что выходная форма свертки 2D действительно имеет 10 каналов. Если вы получаете разные результаты, убедитесь, что image_ordering является правильным (и имеет смысл).