class 5 卷积神经网络
卷积计算过程
全连接NN:每个神经元与前后相邻层的每一个神经元都有连接关系,输入是特征,输出是预测结果。
参数个数: ∑ 前 层 ( 前 层 ∗ 后 层 + 后 层 ) \sum_{前层}(前层*后层+后层) ∑前层(前层∗后层+后层)
待优化的参数过多容易导致模型过拟合,实际应用时会先对原始图像进行特征提取,再把提取到的特征送给全连接网络。
卷积Convolutional
卷积计算可认为是一种有效提取图像特征的方法。
一般会用一个正方形的卷积核,按照指定步长,在输入特征图上滑动,遍历输入特征图中的每个像素点。每一个步长,卷积核会与输入特征图出现重合区域,重合区域对应元素相乘、求和再加上偏置项得到输出特征的一个像素点。
输入特征图的深度(channel数),决定了当前层卷积核的深度;
当前层卷积核的个数,决定了当前层输出特征图的深度。
感受野
感受野Receptive Field:
卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小。
全零填充
TF描述全零填充
padding=‘SAME’(全0填充;入长/步长(向上取整))或padding=‘VALID’((入长-核长+1)/步长(向上取整))
TF描述卷积计算层
tf.keras.layers.Conv2D(
filters=卷积核个数,
kernel_size=卷积核尺寸,#正方形写核长整数,或(核高h,核宽w)
strides=滑动步长,#横纵向相同写步长整数,或(纵向步长h,横向步长w),默认1
padding=“same” or “valid”,#使用全零填充是“same”,不使用是“valid”(默认)
activation="relu" or "sigmoid" or "tanh" or "softmax",#如有BN此处可不写
input_shape=(高,宽,通道数)#输入特赠图维度,可省略
)
model=tf.keras.models.Sequential([
Conv2D(6,5,padding='valid',activation='sigmoid'),
MaxPool2D(2,2),
Conv2D(6,(5,5),padding='valid',activation='sigmoid'),
MaxPool2D(2,(2,2)),
Conv2D(filters=6,kernel_size=(5,5),padding='valid',activation='sigmoid'),
MaxPool2D(pool_size=(2,2),strides=2),
Flatten(),
Dense(10,activation='softmax')
])
批标准化
批标准化(Batch Normalization,BN)
标准化:使数据符合0均值,1为标准差得分布
批标准化:对一小批数据(batch)做标准化处理。
批标准化后,第k个卷积核的输出特征图中的第i个像素点
Hi’k:批标准化之前,第k个卷积核,输出 特征图中的第i个像素点
μbatchk:批标准前,第k个卷积核,batch张输出特征图中所有像素点平均值
𝝈batchk:批标准化前,第k个卷积核,batch张输出特征图中所有像素点标准差。
为每个卷积核引入可训练参数𝜸和𝜷,调整批归一化的力度。
BN层位于卷积层之后,激活层之前:
TF描述批标准化(BN)
tf.keras.layers.BatchNormalization()
model=tf.keras.models.Sequential([
Conv2D(filters=6,kernel_size=(5,5),padding='same'),
BatchNormalization(),#BN层
Activation('relu'),#激活层
MaxPool2D(pool_size=(2,2),strides=2,padding='same'),#池化层
Dropout(0.2)
])
池化
池化用于减少特征数据量。最大值池化可提取图片纹理,均值池化可保留背景特征。
TF描述池化:
tf.keras.layers.MaxPool2D(
pool_size=池化核尺寸,#正方形写核长整数,或(核高h,核宽w)
strides=池化步长,#步长尺寸,或(纵向步长h,横向步长w),默认为pool_size
padding='valid'or'same'#使用全零填充是same,不使用是valid
)
tf.keras.layers.AveragePooling2D(
pool_size=池化核尺寸,#正方形写核长整数,或(核高h,核宽w)
strides=池化步长,#步长尺寸,或(纵向步长h,横向步长w),默认为pool_size
padding='valid'or'same'#使用全零填充是same,不使用是valid
)
model=tf.keras.models.Sequential([
Conv2D(filters=6,kernel_size=(5,5),padding='same')#卷积层
BatchNormalization(),#BN
Activation('relu'),#激活层
MaxPool2D(pool_size=(2,2),strides=2,padding='same')#池化层
Dropout(0.2),
])
舍弃
在神经网络训练时,将一部分神经元按照一定概率从神经网络中暂时舍弃。神经网络使用时,被舍弃的神经元恢复链接。
TF描述舍弃
tf.keras.layers.Dropout(舍弃的概率)
model=tf.keras.models.Sequential([
Conv2D(filters=6,kernel_size=(5,5),padding='same')#卷积层
BatchNormalization(),#BN
Activation('relu'),#激活层
MaxPool2D(pool_size=(2,2),strides=2,padding='same')#池化层
Dropout(0.2),#dropout层
])
卷积神经网络
卷积神经网络:借助卷积核提取出特征后,送入全连接网络。
卷积神经网络的主要模块:
卷积Convolutional-》标准化BN-》激活Activation-》池化Pooling-》全连接FC
卷积就是特征提取器,就是CBAPD
model=tf.keras.models.Sequential([
C Conv2D(filters=6,kernel_size=(5,5),padding='same')#卷积层
B BatchNormalization(),#BN
A Activation('relu'),#激活层
P MaxPool2D(pool_size=(2,2),strides=2,padding='same')#池化层
D Dropout(0.2),#dropout层
])
CIFAR0数据集
卷积神经网络搭建示例