Как рассчитывается выходной размер слоев MaxPooling2D, Conv2D, UpSampling2D? - PullRequest
0 голосов
/ 29 января 2019

Я изучаю сверточные автоэнкодеры и использую keras для создания шумоподавителя изображений.Следующий код работает для построения модели:

denoiser.add(Conv2D(32, (3,3), input_shape=(28,28,1), padding='same')) 
denoiser.add(Activation('relu'))
denoiser.add(MaxPooling2D(pool_size=(2,2)))

denoiser.add(Conv2D(16, (3,3), padding='same'))
denoiser.add(Activation('relu'))
denoiser.add(MaxPooling2D(pool_size=(2,2)))

denoiser.add(Conv2D(8, (3,3), padding='same'))
denoiser.add(Activation('relu'))

################## HEY WHAT NO MAXPOOLING?

denoiser.add(Conv2D(8, (3,3), padding='same'))
denoiser.add(Activation('relu'))
denoiser.add(UpSampling2D((2,2)))

denoiser.add(Conv2D(16, (3,3), padding='same'))
denoiser.add(Activation('relu'))
denoiser.add(UpSampling2D((2,2)))

denoiser.add(Conv2D(1, (3,3), padding='same'))

denoiser.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
denoiser.summary()

И приводится следующее резюме:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_155 (Conv2D)          (None, 28, 28, 32)        320       
_________________________________________________________________
activation_162 (Activation)  (None, 28, 28, 32)        0         
_________________________________________________________________
max_pooling2d_99 (MaxPooling (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_156 (Conv2D)          (None, 14, 14, 16)        4624      
_________________________________________________________________
activation_163 (Activation)  (None, 14, 14, 16)        0         
_________________________________________________________________
max_pooling2d_100 (MaxPoolin (None, 7, 7, 16)          0         
_________________________________________________________________
conv2d_157 (Conv2D)          (None, 7, 7, 8)           1160      
_________________________________________________________________
activation_164 (Activation)  (None, 7, 7, 8)           0         
_________________________________________________________________
conv2d_158 (Conv2D)          (None, 7, 7, 8)           584       
_________________________________________________________________
activation_165 (Activation)  (None, 7, 7, 8)           0         
_________________________________________________________________
up_sampling2d_25 (UpSampling (None, 14, 14, 8)         0         
_________________________________________________________________
conv2d_159 (Conv2D)          (None, 14, 14, 16)        1168      
_________________________________________________________________
activation_166 (Activation)  (None, 14, 14, 16)        0         
_________________________________________________________________
up_sampling2d_26 (UpSampling (None, 28, 28, 16)        0         
_________________________________________________________________
conv2d_160 (Conv2D)          (None, 28, 28, 1)         145       
=================================================================
Total params: 8,001
Trainable params: 8,001
Non-trainable params: 0
_________________________________________________________________

Я не уверен, как MaxPooling2D, Conv2D, UpSampling2DРазмеры выхода рассчитаны.Я прочитал документацию по keras, но все еще в замешательстве.Есть много параметров, которые влияют на форму вывода, например stride или padding для слоев Conv2D, и я не знаю, как именно это влияет на форму вывода.

Я не понимаю, почему нет MaxPooling2D слой перед закомментированной строкой.Редактируя код для включения слоя convmodel3.add(MaxPooling2D(pool_size=(2,2))) над комментарием, он превращает окончательную форму вывода в (None, 12, 12, 1)

Редактирование кода для включения слоя convmodel3.add(MaxPooling2D(pool_size=(2,2))) перед комментарием,и затем convmodel3.add(UpSampling2D((2,2))) превращает конечный результат в (Нет, 24, 24, 1).Разве это не должно быть (Нет, 28, 28, 1)?Код и сводка для этого:

convmodel3 = Sequential()
convmodel3.add(Conv2D(32, (3,3), input_shape=(28,28,1), padding='same')) 
convmodel3.add(Activation('relu'))
convmodel3.add(MaxPooling2D(pool_size=(2,2)))

convmodel3.add(Conv2D(16, (3,3), padding='same'))
convmodel3.add(Activation('relu'))
convmodel3.add(MaxPooling2D(pool_size=(2,2)))

convmodel3.add(Conv2D(8, (3,3), padding='same'))
convmodel3.add(Activation('relu'))
convmodel3.add(MaxPooling2D(pool_size=(2,2))) # ADDED MAXPOOL

################## HEY WHAT NO MAXPOOLING?

convmodel3.add(UpSampling2D((2,2))) # ADDED UPSAMPLING
convmodel3.add(Conv2D(16, (3,3), padding='same'))
convmodel3.add(Activation('relu'))
convmodel3.add(UpSampling2D((2,2)))

convmodel3.add(Conv2D(32, (3,3), padding='same'))
convmodel3.add(Activation('relu'))
convmodel3.add(UpSampling2D((2,2)))

convmodel3.add(Conv2D(1, (3,3), padding='same'))

convmodel3.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
convmodel3.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_247 (Conv2D)          (None, 28, 28, 32)        320       
_________________________________________________________________
activation_238 (Activation)  (None, 28, 28, 32)        0         
_________________________________________________________________
max_pooling2d_141 (MaxPoolin (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_248 (Conv2D)          (None, 14, 14, 16)        4624      
_________________________________________________________________
activation_239 (Activation)  (None, 14, 14, 16)        0         
_________________________________________________________________
max_pooling2d_142 (MaxPoolin (None, 7, 7, 16)          0         
_________________________________________________________________
conv2d_249 (Conv2D)          (None, 7, 7, 8)           1160      
_________________________________________________________________
activation_240 (Activation)  (None, 7, 7, 8)           0         
_________________________________________________________________
max_pooling2d_143 (MaxPoolin (None, 3, 3, 8)           0         
_________________________________________________________________
up_sampling2d_60 (UpSampling (None, 6, 6, 8)           0         
_________________________________________________________________
conv2d_250 (Conv2D)          (None, 6, 6, 16)          1168      
_________________________________________________________________
activation_241 (Activation)  (None, 6, 6, 16)          0         
_________________________________________________________________
up_sampling2d_61 (UpSampling (None, 12, 12, 16)        0         
_________________________________________________________________
conv2d_251 (Conv2D)          (None, 12, 12, 32)        4640      
_________________________________________________________________
activation_242 (Activation)  (None, 12, 12, 32)        0         
_________________________________________________________________
up_sampling2d_62 (UpSampling (None, 24, 24, 32)        0         
_________________________________________________________________
conv2d_252 (Conv2D)          (None, 24, 24, 1)         289       
=================================================================
Total params: 12,201
Trainable params: 12,201
Non-trainable params: 0
_________________________________________________________________

Какое значение None в выходной форме?

Кроме того, при редактировании слоев Conv2D, чтобы не включать заполнение, возникает ошибка:

ValueError: Negative dimension size caused by subtracting 3 from 2 for 'conv2d_240/convolution' (op: 'Conv2D') with input shapes: [?,2,2,16], [3,3,16,32].

Почему?

1 Ответ

0 голосов
/ 29 января 2019

Для сверточных (2D здесь) слоев важными моментами, которые необходимо учитывать, являются объем изображения (ширина х высота х глубина) и четыре параметра, которые вы ему задаете.Такими параметрами являются

  • Количество фильтров K
  • Размер фильтра (пространственный) F
  • Шаг, при котором фильтры перемещаются с S
  • Заполнение нулямиP

Формула для выходной формы задается как

  1. Wnew = (W - F + 2 * P) / S + 1
  2. Hnew= (H - F + 2 * P) / S + 1
  3. Dnew = K

Это взято из этой темы каков эффект tf.nn.conv2d () для формы входного тензора? , и больше информации о заполнении нулями и т. д. можно найти там.

Что касается maxpooling и upsampling, размер зависит только от размера пула и шага,В вашем примере у вас был размер пула (2,2), а шаг не был определен (поэтому по умолчанию это будет размер пула, см. Здесь https://keras.io/layers/pooling/). Повышение сэмплирования работает так же. Размер пула просто занимаетпул 2x2 пикселей, находит их сумму и помещает их в один пиксель. Следовательно, преобразование 2x2 пикселей в 1x1 пикселей, кодирование его. Повышение частоты дискретизации - то же самое, но вместо суммирования значений пикселей значения просто повторяются поpool.

Причина, по которой у вас нет слоя с максимальным пулом и почему в вашем случае портятся размеры изображения, связана с размером изображения на этом этапе. Глядя на сеть, размеры изображения уже [7,7,8]. С размером пула и шагом (2,2) и 2, соответственно, это понизит разрешение изображения до [3,3,8]. После слоев с повышением частоты размерность пойдет от3 -> 6 -> 12 -> 24, и вы потеряли 4 пикселя в каждой строке и столбце.

Значение Нет (поправьте меня, если я ошибаюсь, я не уверен на 100%)связано с сетьюработа ожидая нескольких изображений обычно на сверточных слоях.Обычно ожидаемая размерность имеет вид

[Number of images, Width, Height, Depth]

Таким образом, причина, по которой первый элемент задан как none, заключается в том, что ваша сеть ожидает только одно изображение за раз, следовательно, оно задано как None (Опять же, я оченьне уверен насчет этого момента).

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