在卷积网络中共享过滤器权重

时间:2018-07-11 04:55:21

标签: python keras conv-neural-network

我从事VGG16图像识别工作已经有一段时间了,对此我已经很有信心。今天,我在Quora遇到了post,开始怀疑我对CNN的理解。

在那篇文章中,它说CNN层中的相同过滤器应具有相同的权重。因此,假设内核大小为3,并且在以下构造层中过滤器的数目为1,则参数(权重)的总数应为3X1 = 3,这由红色,蓝色和绿色箭头表示。理解Conv1d示例很容易。

enter image description here

然后,我尝试使用以下keras代码在Conv2d上进行实验:

from keras.layers import Input, Dense, Conv2D, MaxPool2D, Dropout
from keras.models import Model
input_layer = Input(shape=(100,100,1,), name='input_layer')
ccm1_conv = Conv2D(filters=1,kernel_size=(3,3),strides=(1,1),padding='same')(input_layer)
model = Model(input_layer,ccm1_conv)
model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
input_layer (InputLayer)     (None, 100, 100, 1)       0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 100, 100, 1)       10        
=================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
_________________________________________________________________

由于我仅使用1 filter和我的kernel_size = 3X3,这意味着内核在上一层读取9 neurons,然后将其连接到下一层的神经元。因此,我希望使用9 parameters(权重)而不是10

然后,我尝试了number of filters = 10kernal_size = 5X5,它得到的是260 parameters(权重)而不是我期望的5*5*10 parameters

from keras.layers import Input, Dense, Conv2D, MaxPool2D, Dropout
from keras.models import Model
input_layer = Input(shape=(100,100,1,), name='input_layer')
ccm1_conv = Conv2D(filters=60,kernel_size=(3,3),strides=(1,1))(input_layer)
model = Model(input_layer,ccm1_conv)
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_layer (InputLayer)     (None, 100, 100, 1)       0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 100, 100, 10)      260       
=================================================================
Total params: 260
Trainable params: 260
Non-trainable params: 0
_________________________________________________________________

Conv2d中的参数数量似乎由以下公式计算

  

num_weights = num_filters *(kernal_width * kernal_height +1)

我不知道+1的来源。

1 个答案:

答案 0 :(得分:2)

+1 来自每个滤波器的偏差项。除了内核权重之外,每个滤波器还有一个额外的参数,称为偏差项(与常数1相乘),就像在全连接层中一样。默认情况下,Keras为每个过滤器使用一个偏差项,但是您也可以通过将Conv2D的参数use_bias设置为False来忽略它:

from keras.layers import Input, Dense, Conv2D, MaxPool2D, Dropout
from keras.models import Model

input_layer = Input(shape=(100, 100, 1,), name='input_layer')
ccm1_conv = Conv2D(filters=1, kernel_size=(3, 3), strides=(1, 1), padding='same', use_bias=False)(input_layer)
model = Model(input_layer, ccm1_conv)
model.summary()