Как сверточное ядро ​​преобразует изображения с 3 каналами в несколько каналов? Что означает последний аргумент? - PullRequest
1 голос
/ 27 апреля 2020

Я обучил модель ResNet50V2, и мне было интересно, как тензоры преобразуются из 3 каналов в n каналы. У меня есть модель как:

model.summary()
Model: "model_9"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_9 (InputLayer)            (None, 164, 164, 3)  0                                            
__________________________________________________________________________________________________
conv1_pad (ZeroPadding2D)       (None, 170, 170, 3)  0           input_9[0][0]                    
__________________________________________________________________________________________________
conv1_conv (Conv2D)             (None, 82, 82, 64)   9472        conv1_pad[0][0]                  
__________________________________________________________________________________________________
pool1_pad (ZeroPadding2D)       (None, 84, 84, 64)   0           conv1_conv[0][0]                 
__________________________________________________________________________________________________
...
...
...
...
...
...
post_relu (Activation)          (None, 6, 6, 2048)   0           post_bn[0][0]                    
__________________________________________________________________________________________________
flatten_9 (Flatten)             (None, 73728)        0           post_relu[0][0]                  
__________________________________________________________________________________________________
dense_9 (Dense)                 (None, 37)           2727973     flatten_9[0][0]                  
==================================================================================================
Total params: 26,292,773
Trainable params: 26,247,333
Non-trainable params: 45,440

Первый слой свертки "conv1_conv" имеет фильтр:

filters= layer.get_weights()[2]  #conv1_conv layer
print(layer.name, filters.shape)

Вывод:

conv1_conv (7, 7, 3, 64)

Что Я не понимаю, это операция свертки, которая превращает тензор (170,170,3) в тензор (82,82,64).

Что означает 64 в conv1_conv?

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете представить свертку как скользящее окно размером 7 × 7, скользящее по изображению. Каждый фильтр занимает окно изображения, здесь числа 7 × 7 × 3 a превращают линейную проекцию в одно число. Вам нужно 7 * 7 * 3 параметров для линейной проекции для каждого фильтра, и у вас есть 64 из них, поэтому форма свертки 7 × 7 × 3 × 64.

Другим важным свойством свертки является шаг : это шаг, по которому окно перемещается. У вас есть размер окна 7, а изображение имеет ширину и высоту 170, т. Е. Скользящее окно должно пройти 170-7 = 163 пикселей. Если вы делаете это с шагом 2, это означает 163/2 = 81,5 windows, округленное до 82. Каждый из windows проецируется с 64 фильтрами, поэтому форма 82 × 82 × 64.

...