CNN(卷积神经网络)一
为了解决MLP将2D图像矩阵扁平化为一维向量所造成的信息损失,以及大图像全连接造成的计算复杂度的缺点,本章讲解CNN。
CNN与神经网络的不同之处在于对特征的学习,CNN使用卷积层代替全连接层。
一、CNN架构
架构如下图所示(示意图,图画的不准确但是大致意思是这样):
- 输入层
- 卷积层用于特征提取
- 全连接层用用于分类
- 输出预测
二、组件
(一)卷积层
滤波器卷积的图像区域被称为感受野
卷积滤波器中的值是卷积矩阵的权重,是随机初始化的,不用管它的数值分配)
卷积核(卷积滤波器)在原始图像上逐像素滑过并进行一些数学运算来获取下一层卷积图像的像素值 。
卷积数学公式 :
加权和
=
x
1
∗
w
1
+
x
2
∗
w
2
+
x
3
∗
w
3
+
x
4
∗
w
4
.
.
.
.
+
x
n
∗
w
n
+
b
加权和=x_1*w_1+x_2*w_2+x_3*w_3+x_4*w_4....+x_n*w_n+b
加权和=x1∗w1+x2∗w2+x3∗w3+x4∗w4....+xn∗wn+b
from keras.layers import Conv2D
model.add(Conv2D(filters=16,kernel_size=2,strides='1',padding='same',activation='relu'))#创建卷积层
#filters过滤器数量,代表输出深度
#kernel_size滤波器大小
#strides步幅,滤波器在图像上滑动的量
#padding填充,填充0因为开发人员会在图像边缘加0
#activation激活函数
kernel_size核大小需要调节的超参数之一,最小2✖2,最大5✖5
(二)池化层或下采样
通过减少传递到下一层的参数数量来缩小网络。池化操作通过将一个汇总统计函数(最大/平均)应用于输入来调整图像大小,从而减少传递到下一层的参数数量。
最大池化如下例子:
平均池化类推
from keras.layers import MaxPooling2D
model.add(MaxPooling2D(pool_size=(2,2),stride=2))
全连接层我就略过了,上一节讲过了
三、使用CNN进行图像分类代码以及结果解读
model = Sequential()
model.add(Conv2D(32, (3,3), padding='same',strides=1,activation='relu',input_shape=(28,28,1)))
model.add(MaxPooling2D(pool_size=(2,2)))#下采样提取最好的特征
model.add(Conv2D(64, (3,3), padding='same',strides=1,activation='relu',input_shape=(28,28,1)))#深度增加到64
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())#维度太高,对其进行扁平化,只需要一个用于分类的输出,将7*7*64扁平化为(1,3136)
model.add(Dense(64, activation='relu))#全连接层获取所以相关数据
model.add(Dense(10, activation='softmax'))#输出softmax函数,将矩阵压缩为10个类别的概率
model.summary()
输出结果:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 28, 28, 32) 320
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 14, 14, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 3136) 0
_________________________________________________________________
dense_1 (Dense) (None, 64) 200768
_________________________________________________________________
dense_2 (Dense) (None, 10) 650
=================================================================
Total params: 220,234
Trainable params: 220,234#可训练参数
Non-trainable params: 0#不可训练参数
_________________________________________________________________
解读结果:
1、只需要在第一个卷积层输入input_shape参数
2、每一个卷积层和池化层输出的形状为(None, height, width, channels),第一个被设置为None的参数,其值代表在该层处理的图像数量,其值设置为None意味着该参数是可变的并支持任意数量的batch_size,channels代表深度,height, width代表该层图像的尺寸。
3、Conv_1:输入28✖28✖1输出为28✖28✖32,因为图像尺寸没变而深度加了32.
4、Pool_1:上一层输出为28✖28✖32,本层使用2✖2池化输出14✖14✖32
5、Dense_1:全连接层含有64个神经元,所以输出64
6、Dense_2:因为有10个分类,将输出层设为10个神经元。
参数解读:
参数数量=滤波器数量✖卷积核大小✖上一层的网络深度+滤波器的数量
conv2d_2 (Conv2D) (None, 14, 14, 64) 18496 =64✖3✖3✖32+64
四、添加dropout层避免过拟合
dropout层会关闭一定百分比的神经元 节点,有助于减少学习过程中神经元之间的依赖
model.add(Dropout(rate=0.3))#30%舍去概率的dropout层----简而言之这一层有10个节点有三个节点会随机关闭。
其中rate也是一个调优的超参数
层会关闭一定百分比的神经元 节点,有助于减少学习过程中神经元之间的依赖
model.add(Dropout(rate=0.3))#30%舍去概率的dropout层----简而言之这一层有10个节点有三个节点会随机关闭。
其中rate也是一个调优的超参数
参考《深度学习计算机视觉》,若有错误请各位指正!!