3 池化层(Pooling)
池化层迎来降低了后续网络层的输入维度,缩减模型大小,提高计算速度,并提高了Feature Map 的鲁棒性,防止过拟合,
它主要对卷积层学习到的特征图进行下采样(subsampling)处理,主要由两种
3.1 最大池化
- Max Pooling,取窗口内的最大值作为输出,这种方式使用较广泛。
在tf.keras中实现的方法是:
tf.keras.layers.MaxPool2D( pool_size=(2, 2), strides=None, padding='valid' )
参数:
pool_size: 池化窗口的大小 strides: 窗口移动的步长,默认为1 padding: 是否进行填充,默认是不进行填充的
3.2 平均池化
Avg Pooling,取窗口内的所有值的均值作为输出
在tf.keras中实现池化的方法是:
tf.keras.layers.AveragePooling2D( pool_size=(2, 2), strides=None, padding='valid' )
4 全连接层
全连接层位于CNN网络的末端,经过卷积层的特征提取与池化层的降维后,将特征图转换成一维向量送入到全连接层中进行分类或回归的操作。
在tf.keras中全连接层使用tf.keras.dense实现。
5 卷积神经网络的构建
我们构建卷积神经网络在mnist数据集上进行处理,如下图所示:LeNet-5是一个较简单的卷积神经网络, 输入的二维图像,先经过两次卷积层,池化层,再经过全连接层,最后使用softmax分类作为输出层。
导入工具包:
import tensorflow as tf # 数据集 from tensorflow.keras.datasets import mnist
5.1 数据加载
与神经网络的案例一致,首先加载数据集:
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
5.2 数据处理
卷积神经网络的输入要求是:N H W C ,分别是图片数量,图片高度,图片宽度和图片的通道,因为是灰度图,通道为1.
# 数据处理:num,h,w,c # 训练集数据 train_images = tf.reshape(train_images, (train_images.shape[0],train_images.shape[1],train_images.shape[2], 1)) print(train_images.shape) # 测试集数据 test_images = tf.reshape(test_images, (test_images.shape[0],test_images.shape[1],test_images.shape[2], 1))
结果为:
(60000, 28, 28, 1)
5.3 模型搭建
Lenet-5模型输入的二维图像,先经过两次卷积层,池化层,再经过全连接层,最后使用softmax分类作为输出层,模型构建如下:
# 模型构建 net = tf.keras.models.Sequential([ # 卷积层:6个5*5的卷积核,激活是sigmoid tf.keras.layers.Conv2D(filters=6,kernel_size=5,activation='sigmoid',input_shape= (28,28,1)), # 最大池化 tf.keras.layers.MaxPool2D(pool_size=2, strides=2), # 卷积层:16个5*5的卷积核,激活是sigmoid tf.keras.layers.Conv2D(filters=16,kernel_size=5,activation='sigmoid'), # 最大池化 tf.keras.layers.MaxPool2D(pool_size=2, strides=2), # 维度调整为1维数据 tf.keras.layers.Flatten(), # 全卷积层,激活sigmoid tf.keras.layers.Dense(120,activation='sigmoid'), # 全卷积层,激活sigmoid tf.keras.layers.Dense(84,activation='sigmoid'), # 全卷积层,激活softmax tf.keras.layers.Dense(10,activation='softmax') ])
我们通过net.summary()查看网络结构:
Model: "sequential_11" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_4 (Conv2D) (None, 24, 24, 6) 156 _________________________________________________________________ max_pooling2d_4 (MaxPooling2 (None, 12, 12, 6) 0 _________________________________________________________________ conv2d_5 (Conv2D) (None, 8, 8, 16) 2416 _________________________________________________________________ max_pooling2d_5 (MaxPooling2 (None, 4, 4, 16) 0 _________________________________________________________________ flatten_2 (Flatten) (None, 256) 0 _________________________________________________________________ dense_25 (Dense) (None, 120) 30840 _________________________________________________________________ dense_26 (Dense) (None, 84) 10164 dense_27 (Dense) (None, 10) 850 ================================================================= Total params: 44,426 Trainable params: 44,426 Non-trainable params: 0 ______________________________________________________________
参数量计算
手写数字输入图像的大小为28x28x1,如下图,我们来看下卷积层的参数量:
conv1中的卷积核为5x5x1,卷积核个数为6,每个卷积核有一个bias,所以参数量为:5x5x1x6+6=156。
conv2中的卷积核为5x5x6,卷积核个数为16,每个卷积核有一个bias,所以参数量为:5x5x6x16+16 = 2416。
5.4 模型编译
设置优化器和损失函数:
# 优化器 optimizer = tf.keras.optimizers.SGD(learning_rate=0.9) # 模型编译:损失函数,优化器和评价指标 net.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])
5.5 模型训练
模型训练:
# 模型训练 net.fit(train_images, train_labels, epochs=5, validation_split=0.1)
训练流程:
Epoch 1/5 1688/1688 [==============================] - 10s 6ms/step - loss: 0.8255 - accuracy: 0.6990 - val_loss: 0.1458 - val_accuracy: 0.9543 Epoch 2/5 1688/1688 [==============================] - 10s 6ms/step - loss: 0.1268 - accuracy: 0.9606 - val_loss: 0.0878 - val_accuracy: 0.9717 Epoch 3/5 1688/1688 [==============================] - 10s 6ms/step - loss: 0.1054 - accuracy: 0.9664 - val_loss: 0.1025 - val_accuracy: 0.9688 Epoch 4/5 1688/1688 [==============================] - 11s 6ms/step - loss: 0.0810 - accuracy: 0.9742 - val_loss: 0.0656 - val_accuracy: 0.9807 Epoch 5/5 1688/1688 [==============================] - 11s 6ms/step - loss: 0.0732 - accuracy: 0.9765 - val_loss: 0.0702 - val_accuracy: 0.9807
5.6 模型评估
# 模型评估 score = net.evaluate(test_images, test_labels, verbose=1) print('Test accuracy:', score[1])
输出为:
313/313 [==============================] - 1s 2ms/step - loss: 0.0689 - accuracy: 0.9780 Test accuracy: 0.9779999852180481
与使用全连接网络相比,准确度提高了很多。
6 总结
- 卷积神经网路的组成
卷积层,池化层,全连接层
- 卷积层
卷积的计算过程,stride,padding…
- 池化层
最大池化和平均池化
- CNN结构的实现和构建实现程序