keras 中卷积层的形状问题
model.add( Convolution2D(25, 3, 3, input_shape=(1,28,28)) )
model.add( MaxPooling2D((2,2)) )
我们平时表示RGB彩图时,习惯将 通道 维度放在最后: (高,宽,通)
,opencv/pil/numpy/scikit 处理图片都是采用这种方式,但在 tensorflow/keras 中使用的是 (通,高,宽)
的表达方式。所以:
Convolution2D(25,3,3, input_shape=(1,28,28))
- 表示卷积层有
25
个 size=3*3
的 filter
- 输入图片是灰度图像
(channel_dim=1)
, 图片 size=28*28
对比 Dense Layer:
Dense(input_shape=(1,28,28), units=800, activation='relu')
可以看出,
卷积层只是说明了本层权重的一些信息(filter就是权重)
,而神经元数目则交给系统自动推算; 全连接层则直接指明了本层神经元的数目。
卷积层和池化层形状推算
Convolution2D(25,3,3, input_shape=(1,28,28))
会输出一个形状为 (25, (28-3+1), (28-3+1))
的 feature map。
卷积层输出形状推算公式为:
\(Convol:\)
\(feature \ map \ size =(filterNumber_i, imgHeight_{i-1} - filterHeight_i + 1, imgWidth_{i-1} - filterWidth_i + 1)\)
MaxPooling2D((2,2))
会输出一个形状为 (25, 13, 13)
的 feature map.
池化层输出形状推算公式为:
\(Pooling:\)
\(feature\ map\ size= (filterNumber_{i-1}, imgHeight_{i-1}//poolHeight_i, imgWidth_{i-1} // poolWidth_i)\)
//
的意思是 celing division, 5//2=2
卷积层和池化层参数量推算
卷积层参数量推算公式:
\(Convol_{paraNum}=filterNumber_{i-1} * filterNumber_i * filterHeight_i * filterWidth_i\)
model.add(Convolution2D(25,3,3,input_shape=(1,28,28)))
model.add(MaxPooling2D((2,2)))
model.add(Convolution2D(50,3,3))
第一个卷积层的总参数量为:
1 25 3 * 3
第二个卷积层的总参数量为:
25 50 3 * 3