卷积神经网络搭建
使用六步法搭建全连接网络训练mnist数据集和fashion数据集,实现图像识别应用,全连接中的每个神经元与前后相邻层的神经元都有连接关系。实践证明,全连接网络对识别和预测都有非常好的效果。但是,在实现过程中,仅用两层网络训练这样的灰度图片数据,就有几十万级的带训练参数。而在实际项目中,输入的数据是具有更高像素的彩色图片,随着隐藏层的层数增加,网络规模过大,待优化参数过多,很容易使模型过拟合,为了减少带训练的参数,我们会先对原始图片进行特征提取,把提取的特征送给全连接网络,让全连接网络输出识别结果。
- 卷积Convolutional层
- 批标准化BN层
- 激活Activation层
- 池化Pooling层
- 舍弃Dropout层
CBAPD
对输入特征进行特征提取
- 全连接FC层
class Baseline(Model):
def __init__(self):
super(Baseline, self).__init__()
self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same') # 卷积层 C
self.b1 = BatchNormalization() # BN层 B
self.a1 = Activation('relu') # 激活层 A
self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same') # 池化层 P
self.d1 = Dropout(0.2) # dropout层 D
# 全连接层FC
self.flatten = Flatten()
self.f1 = Dense(128, activation='relu')
self.d2 = Dropout(0.2)
self.f2 = Dense(10, activation='softmax')
def call(self, x):
x = self.c1(x)
x = self.b1(x)
x = self.a1(x)
x = self.p1(x)
x = self.d1(x)
x = self.flatten(x)
x = self.f1(x)
x = self.d2(x)
y = self.f2(x)
return y
记住:卷积是一种有效的特征提取方法,卷积就是特征提取器。CBAPD
六步法搭建全连接网络
- import——导入所需的各种库和包
- x_train, y_train——导入数据集、自制数据集、数据增强
- model=tf.keras.models.Sequential /class MyModel(Model) model=MyModel——定义模型
- model.compile——配置模型
- model.fit——训练模型、断点续训
- model.summary——参数提取、acc/loss可视化、前向推理实现应用
卷积神经网络中的卷积计算:
一般会用一个正方形的卷积核,按指定步长,在输入特征图上滑动遍历输入特征图中的每个像素点。每一个步长,卷积核会与输入特征图出现重合区域,重合区域对应元素相乘、求和再加上偏置项得到输出特征的一个像素点。
输入特征图的深度(channel数) ,决定了当前层卷积核的深度;
当前层卷积核的个数,决定了当前层输出特征图的深度。
具体可以参考:一文让你彻底了解卷积神经网络
卷积神经网络涉及的一些概念
- 卷积计算过程
- 感受野
感受野(Receptive Field) 是卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小。 - 全零填充(Padding)
self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same') # 卷积层 C
- 权值共享
所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数就叫权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。 - TF描述卷积计算层
- 批标准化(Batch Normalization, BN)
标准化:使数据符合0均值,1为标准差的分布。批标准化:对一小批数据(batch) ,做标准化处理。这个过程通常在卷积操作和激活函数之间。
在做BN时,为了防止训练结果丧失非线性化能力,还为每个卷积核引入可训练参数y和β,,调整批归一化的力度。
self.b1 = BatchNormalization() # BN层
- 池化(Pooling)
池化用于减少特征数据量,最大值池化可提取图片纹理,均值池化可保留背景特征。
self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same') # 池化层
- 舍弃(Dropout)
在神经网络训练时,将一部分神经元按照一定概率从神经网络中暂时舍弃。神经网络使用时,被舍弃的神经元恢复连接。
self.d1 = Dropout(0.2) # dropout层
- cifar10数据集
- 卷积神经网络搭建示例
- 五个经典卷积神经网络LeNet、AlexNet、 VGGNet、 InceptionNet、 ResNet
推荐阅读:
卷积神经网络超详细介绍
卷积神经网络CNN过程(前向和反向)
一文让你彻底了解卷积神经网络
详解卷积神经网络(CNN)