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 2

2 ответа:

Это может быть из-за порядка входного формата.

Из Keras docs Conv2D берет этот парам

Data_format : строка, один из channels_last (по умолчанию) или channels_first. Упорядочение размеров во входных данных. channels_last соответствует входам с формой (пакет, высота, ширина, каналы), а channels_first соответствует входы с формой (партия, каналы, высота, ширина). По умолчанию используется формат image_data_format значение в водоснабжении конфиг файл на ~/.в водоснабжении/водоснабжении.формат JSON. Если ты никогда не устанавливайте его, тогда это будет "channels_last".

Таким образом, ваш (1, 32, 32) на самом деле является изображением 1x32 с 32 каналами. Переключитесь на (32, 32, 1) или установите аргумент data_format в 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 является правильным (и имеет смысл).