1、卷积(Convolutional Neural Networks, CNN)计算过程
- 全连接神经网络对识别和预测都有非常好的效果,但有时,如Mnist数据集中,输入是一幅28行28列的784个像素点的灰度值,仅两层全连接网络就有10多w个带训练参数(784128+128 + 12810+10),而实际中输入神经网络的是具有更高分辨率的彩色图片(近乎乘以3),使得全连接神经网络的输入特征过多,网络规模过大,待优化参数过多,很容易使得模型过拟合。为了减少模型参数,在实际应用中会先对原始图片进行特征提取,再把提取到的特征送给全连接网络。
- 卷积计算是一种有效的特征提取方法。一般会用一个正方形的卷积核,按指定步长,在输入特征上滑动,遍历输入特征图上的每一个点。每一个步长,卷积核会与输入特征图出现重合区域,重合区域对应元素相乘、求和再加上偏置项得到输出特征的一个像素点。一般要使卷积核的通道数与输入特征图的通道数一致。所以,当前输入特征图使用了几个卷积核,就决定了输出特征图的深度(如果模型在某层特征提取能力不足,可以在这层多使用几个卷积核提高这一层的特征提取能力)
2、感受野(Receptive Field)
- 卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小(例如,一个5*5的原始图片,分别经过一个5 * 5和两个3 * 3的卷积核作用,都能得到一个感受野是5的输出特征图(输出是1 * 1))
- 选一个5 * 5 还是两个3 * 3 呢?(近乎都是选两层3*3)
# 两层3*3计算量
(x-2)^2 * 9 + ((x-2) -2)^2 * 9 = 18 * x^2 - 108x + 180
# 一层5*5计算量
(x-4)^2 * 25 = 25 * x^2 - 200x + 400
3、全零填充(Padding)
- 在卷积计算中保持输入特征图的尺寸不变,可以使用全零填充,在输入特征图周围填充0
- 使用全零填充(padding=SAME):输出特征图边长 = 输入特征图边长 / 步长(向上取整)
- 不使用(padding=VALID): 输出特征图边长 = (输入特征图边长 - 核长 + 1 )/ 步长(向上取整)
TF描述卷积层
tf.keras.layers.Conv2D(
filters=卷积核个数,
kernel_size=卷积核尺寸,
strides=滑动步长, # 横纵向相同写步长整数,或(纵向步长h, 横向步长w),默认1
padding="same" or "valid"(默认),
activation=激活函数, # 如relu,sigmoid,tanh,softmax等
input_shape=(高,宽,通道数)
)
4、批标准化(Batch Normalization, BN)
- 神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况。标准化可以使数据符合以0为均值,1为标准差的分布。BN就是对一小批数据(batch),做标准化处理。常用在卷积操作和激活操作之间。
- 使得输入数据的微小变化,更明显的体现到激活函数的输出,提升了激活函数对输入数据的区分力
- 现实意义举例:顶级富豪几百亿的身家增加了几亿,和普通上班族年薪增加了几(十)万的模型在sigmoid函数里的表达
- 但是标准化后的特征数据,集中在激活函数的线性表达区域(sigmoid函数在0附近导数很接近1),使得激活函数丧失了非线性特征,因此,在BN操作中为每个卷积核引入了两个可训练参数,缩放因子γ和偏移因子β,调整归一化的力度。
5、池化(pooling):用于减少特征数量。
- 最大值池化:可提取图片纹理
- 均值池化:可保留背景特征
[[1, 1, 2, 4],
[5, 6, 7, 8],
[3, 2, 1, 0],
[1, 2, 3, 4]]
# 用2*2的池化核、步长为2的最大值池化
[[6, 8,],
[3, 4]]
# 用2*2的池化核、步长为2的均值池化
[[3.25, 5.25,],
[2, 2]]
TF描述池化:
tf.keras.layers.MaxPool2D(
pool_size=池化核尺寸,
strides=池化步长, # 步长整数,或纵向尺寸h,横向尺寸w
padding="valid" or "same" # 是否使用全零填充
)
tf.keras.layers.AveragePooling2D(
pool_size=池化核尺寸,
strides=池化步长, # 步长整数,或纵向尺寸h,横向尺寸w
padding="valid" or "same" # 是否使用全零填充
)
6、舍弃(Dropout)
为了缓解神经网络过拟合,在神经网络训练过程中,常把隐藏层的部分神经元按照一定比例从神经网络中临时舍弃。在使用神经网络时,被舍弃的神经元再回复链接。
tf.keras.layers.Dropout(舍弃的概率)
7、总结
卷积神经网络,就是借助卷积核提取特征后,送入全连接网络。
cnn.png
卷积就是特征提取器,就是CBAPD
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same'), # C
tf.keras.layers.BatchNormalization(), # B
tf.keras.layers.Activation("relu"), # A
tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding="same"), # P
tf.keras.layers.Dropout(0.2) # D
])
网友评论