赞
踩
目录
在讲解CNN之前首先需要了解的是全连接NN,他是每一个神经元与前后相邻的层的每一个神经元都有连接关系,输入是特征,输出为预测的结果。
上图中只是一个28*28的黑白图像, 参数就有近40w的参数量需要去训练。如果换成生活中高分辨率的彩色图像,那么待优化的参数就更多,就容易导致过拟合现象。
为了避免过拟合现象的发生,我们在实际的应用中不会直接对图像进行全连接神经网络。会先对原始图像进行特征提取,再把提取到的特征喂入全连接网络。
而卷积就是一种有效提取图像特征的方法。一般会用一个正方形的卷积核,遍历图片上的每个点,图片区域内,相对应的每一个像素值,乘以卷积核内相对应的权重,求和。再加上偏置。
卷积之后图像由原来的5*5*1的图像变为3*3*1的图像。
卷积之后输出图片的边长=(输入图片边长-卷积核长+1)/步长
此图就是:(5-3+1)/1=3
使得输出图片仍然保持原有的图像大小。
使用padding的效果:
TF中keras也很给了不同的描述:
- tf.keras.layers.Con2D(
- filters = 卷积核的个数
- kernel_size=卷积核尺寸
- strides=滑动步长
- padding = "same" or "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,actvation='softmax')
-
- ])
经过卷积得到的特征参数的数量仍然巨大,池化层主要用来减少特征的数量,池化主要有最大池化和均值池化。最大池化可以提取图像的纹理,均值池化可以保留背景特征。
由于神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况,标准化可以使数据符合以0为均值1为标准差的分布,把便宜的特征数据重新拉回到1的附近。
批标准化:是对一小批数据(batch),做标准化处理。使得数据回归标准分布。常用在卷积操作和激活操作之间。
BN操作将原本偏离的特征数据,重新来拉回到零均值,使得进入激活函数的输就分布在激活函数线性区域。使得输入数据的微小变化更加明显地提现到激活函数地输出,提升了激活函数对输入数据的区分力。但是这种简单的数据标准化使得特征数据完全满足标准正态分布集中在激活函数中心的线性区域,使得激活函数丧失了非线性特性,因此在BN操作中为每个卷积核引入了两个可训练的参数缩放因子和偏移因子。反向传播时,缩放因子和偏移因子会与其他待训练参数异同被训练优化。使得标准分布后的特征数据通过缩放因子和偏移因子优化了特征数据分布的宽窄和偏移量。保证了网络的非线性表达力。如下所示:
BN层位于卷积之前,激活之后。
TF提供了批标准化的函数:
tf.keras.layers.BatchNormalization()
写法如下所示:
- model=tf.keras.models.Sequential([
- Conv2D(filter=6,kernel_size=(5,5),padding='same'),
- BatchNormalization(),
- Activation('relu'),
- MaxPool2D(pool_size=(2,2),strides=2,padding='same')
- Dropout(0.2)
- ])
在神经网络的训练过程中,为了减少过多的参数,常使用Dropout的方法。将一部分神经元按照一定概率从神经网络中暂时舍弃,使用时被舍弃的神经元恢复链接。(这种舍弃是临时性的,只在训练时舍去,在使用时会把所有的神经元恢复到神经网络中)
在实际应用中在前向传播构建神经网络中,常常使用Dropout减小过拟合,加快模型的训练速度。Dropout一般会放在全连接网络中,如果在训练参数的过程中,输出=tf.nn.dropout(上层输出,暂时舍弃的概率)。
TF中keras提供了如下函数:
- model=tf.keras.models.Sequential([
- Conv2D(filter=6,kernel_size=(5,5),padding='same'),
- BatchNormalization(),
- Activation('relu'),
- MaxPool2D(pool_size=(2,2),strides=2,padding='same')
- Dropout(0.2)
- ])
其实CNN就是借助卷积核(kernel)对图像的特征进行提取,然后送入到全连接网络。
CNN模型的主要模块:
CNN模型的发展历史:
上图中5*5*16就是卷积提取的特征,然后喂入全连接网络
针对28*28的图像,修改网络如下:
上图中7*7*64就是卷积提取的特征,然后喂入全连接网络
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。