卷积神经网络其实就是特征提取器。
在大量输入的数据特征之后,为了防止过拟合,需要先用卷积神经网络对参数进行特征提取。
他可以总结为,卷积(Convolutional)、批标准化(Batch Normalization),激活(Activition),池化(Pool)、(Dropout)
卷积过程
以输入特征为图片的情况为例,一般会有一个与输入维数匹配的卷积核按照指定步长,在输入特征范围内进行滑动,遍历输入特征里面的每个像素点。每滑动一个步长,会与输入特征图部分像素重合,重合区域对应元素相乘、求和,并加上偏置项,得到输出特征的一个像素点。
eg.如果输入特征为单通道灰度图,选择深度为1的单通道卷积核。如果输入特征为三通道彩色图,可以使用333的卷积核、或者553的卷积核。总之,要使得卷积核的通道数与输入特征图的通道数一致。
卷积核的个数决定了当前层输出特征图的深度。
感受野
卷积神经网络个输出特征图中每个像素点在原始输入图片上映射区域的大小。如图,图中的数字即为感受野的大小。虽然两个感受野为5的特征提取能力是一致的,但是他们的计算方式是不一样的。
一般输入特征比较多的时候,常使用两层33的卷积核替代一层55的卷积核。
全零填充(Padding)
若想要保持输入特征的尺寸在经过卷积计算之后保持不变,可采用全零填充的方式。
在tensorflow中,
使用全零填充,padding=‘SAME’
不使用全零填充,padding=‘VALID’
Tensorflow描述卷积层
tf.keras.layers.Conv2D(
filters=卷积核个数,
kernel_size=卷积核尺寸,(正方形写核长整数)
slides=滑动步长(默认是1)
padding=“same” or “valid”(默认)
activation=“relu” or “sigmoid” or “tanh” or “softmax”(如有BN,此处可先不激活)
input_shape=(高,宽,通道数) 输入特征图维度,可省略
)
代码书写形式:
model=tf.keras.models.Sequential([
Cov2D(filters=6,kernel_size=(5,5),padding='valid'
activation='sigmoid'),
MaxPool2D(pool_size=(2,2),stride=2),
Flatten(),
Dense(10,activation='softmax')
])
批标准化
神经网络对零附近的数据更为敏感,因此,为了避免由于神经网络层数增加而导致的特征数据偏离0均值的情况,标准化可以将偏移的数据拉回来。
使得输入数据可以分布在激活函数的线性区中,使得输入数据的微小变化更明显的在激活函数中输出。
BatchNormalization()
池化操作
可以减少特征数据量,包括均值池化和最大值池化。
最大值池化:可以提取图片纹理。MaxPool2D
均值池化:保留背景特征。AveragePooling2D
pool_size=池化核尺寸
strides=池化步长
padding=‘same’ or 'valid’ (默认是valid)
舍弃
为了防止过拟合,在训练过程中需要适当的舍弃掉一些,在实际使用中再将其激活。
注:文中图片来源于https://www.bilibili.com/video/BV1B7411L7Qt?p=28等相关视频。