我从事VGG16图像识别工作已经有一段时间了,对此我已经很有信心。今天,我在Quora遇到了post,开始怀疑我对CNN的理解。
在那篇文章中,它说CNN层中的相同过滤器应具有相同的权重。因此,假设内核大小为3,并且在以下构造层中过滤器的数目为1,则参数(权重)的总数应为3X1 = 3,这由红色,蓝色和绿色箭头表示。理解Conv1d示例很容易。
然后,我尝试使用以下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 = 10
,kernal_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的来源。
答案 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()