首先贴一下代码清单5-5 将猫狗分类的小型卷积神经网络实例化 代码
# 卷积网络实现
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation = 'relu',input_shape = (150,150,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation = 'relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation = 'relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation = 'relu'))
model.add(layers.MaxPooling2D((2,2)))
# 平坦层
model.add(layers.Flatten())
model.add(layers.Dense(512,activation = 'relu'))
model.add(layers.Dense(1,activation = 'sigmoid'))
model.summary()
输出网络结构及参数如下
Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_9 (Conv2D) (None, 148, 148, 32) 896
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 74, 74, 32) 0
_________________________________________________________________
conv2d_10 (Conv2D) (None, 72, 72, 64) 18496
_________________________________________________________________
max_pooling2d_10 (MaxPooling (None, 36, 36, 64) 0
_________________________________________________________________
conv2d_11 (Conv2D) (None, 34, 34, 128) 73856
_________________________________________________________________
max_pooling2d_11 (MaxPooling (None, 17, 17, 128) 0
_________________________________________________________________
conv2d_12 (Conv2D) (None, 15, 15, 128) 147584
_________________________________________________________________
max_pooling2d_12 (MaxPooling (None, 7, 7, 128) 0
_________________________________________________________________
flatten_3 (Flatten) (None, 6272) 0
_________________________________________________________________
dense_5 (Dense) (None, 512) 3211776
_________________________________________________________________
dense_6 (Dense) (None, 1) 513
=================================================================
Total params: 3,453,121
Trainable params: 3,453,121
Non-trainable params: 0
- 对于卷积层而言,假设卷积核尺寸为S* S, 滤器数量为F(即输出通道数), 存在偏置项的情况下,则固定为1,输入通道数为C,则参数数量计算公式= (S*S*C + 1) * F;
- 对于池化层、flatten、dropout操作而言,是不需要训练参数的,所以param为0;
- 对于全连接层而言,假设输入的列向量大小为Fl(即平坦层),输出的列向量大小为L,若开启bias,则param计算公式为=Fl *L + L
所以:
第一层卷积层参数:896 =([3*3]*3+1)*32,中括号外边的3为通道数为3,32为输出通道数;
第二层卷积层参数:18496=([3*3]*32+1)*64;
第三层卷积层参数:73856=([3*3]*64+1)*128;
第四层卷积层参数:147584=([3*3]*128+1)*128;
平坦层后的全连接层参数:3211776=6272*512+512